import jieba
import matplotlib.pyplot as plt
import re
import string, collections, networkx
Sanguo = {
'诸葛亮': ['诸葛孔明', '孔明', '卧龙'],
'刘备': ['刘玄德', '皇叔', '刘皇叔', '玄德'],
'孙权': ['孙仲谋', '仲谋'],
'周瑜': ['周公瑾', '公瑾', '都督', '周都督'],
'鲁肃': ['鲁子敬', '子敬'],
'甘宁': ['甘兴霸', '兴霸', '甘将军'],
'黄盖': ['黄公覆', '公覆', '黄老将军'],
'曹操': ['曹孟德', '孟德', '丞相'],
'蒋干': ['蒋子翼', '子翼'],
'庞统': ['庞士元', '士元', '凤雏']
}
def dict_slice(dict, start, end):
dict_1 = {k: dict[k] for k in list(dict.keys())[start:end]}
return dict_1
def getText(filename):
text = ''
with open(filename, 'rb') as f:
text += f.read().decode('utf-8')
return text
def cleanText(text):
nameNode = {}
tempNames = []
for key, value in Sanguo.items():
pat = re.compile('|'.join(Sanguo[key]))
text = re.sub(pat, key, text)
for i in string.punctuation:
text = text.replace(i, '')
aDict = collections.Counter(jieba.cut(text))
for item in Sanguo.keys():
if item in aDict:
nameNode[item] = aDict[item]
nameNode=dict_slice(nameNode,0,10)
for item in text.split():
tempNames.append([])
for name in Sanguo.keys():
if name in item:
tempNames[-1].append(name)
relationship_A = dict(zip([item for item in Sanguo.keys()], [{} for _ in range(10)]))
return nameNode, tempNames, relationship_A
def creatRelationship(tempNames, relationship_A):
for name in tempNames:
for nameMajor in name:
for nameSencondary in name:
if nameMajor == nameSencondary:
continue
if relationship_A[nameMajor].get(nameSencondary) is None:
relationship_A[nameMajor][nameSencondary] = 1
else:
relationship_A[nameMajor][nameSencondary] += 1
return relationship_A
def getGraph(nameNode,relationship_A):
g = networkx.Graph()
for key in nameNode.keys():
g.add_node(key,name=key,weight=nameNode[key])
for key,value in relationship_A.items():
for ikey,ivalue in relationship_A.get(key,None).items():
g.add_edge(key,ikey,weight=ivalue)
networkx.draw(g,with_labels=True,node_color=range(len(nameNode)),font_size=len(nameNode)+1,edge_color='r',node_size=2000,width=0.5,style='dashdot',alpha=1.0)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.show()
nameNode, tempNames, relationship_A = cleanText(getText("D:/Sanguo.txt"))
relationship_A0 = creatRelationship(tempNames, relationship_A)
getGraph(nameNode,relationship_A0)
python 基于共现分析赤壁人物关系
于 2021-06-22 11:37:03 首次发布