python 基于共现分析赤壁人物关系

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)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值