NLP分析小说人物关系,找找主人公的真爱。
生活随笔
收集整理的這篇文章主要介紹了
NLP分析小说人物关系,找找主人公的真爱。
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
思路
基于共現來挖掘人物之間的關系。
準備好三個存儲器
思路不解釋,自己看代碼,這也是我學習之后寫的。
看別人文字思路,不如看代碼。畢竟文字思路多啦一道轉換。
步驟1
import jieba.posseg as pseg from tqdm import tqdm#設置一個進度條 # 姓名字典 names = {} # 關系字典 relationships = {} # 每段內人物關系 lineNames = [] #打開文件 with open('射雕英雄傳.txt', 'r',encoding='utf-8') as fp:for line in tqdm(fp):line = line.strip('\n')#去除換行poss = pseg.cut(line)# 分詞返回詞性# 為新讀取的一段添加人物關系lineNames.append([])for w in poss:#遍歷每一個# print("%s:%s" % (w.word, w.flag))# 分詞長度小于2 或詞性不為nr時則與影片所需分析人物無關if w.flag != "nr" or len(w.word) < 2:continuelineNames[-1].append(w.word)#當前段存放人物名if names.get(w.word) is None:#如果姓名未出現過names[w.word] = 0#當前姓名添加進names字典里relationships[w.word] = {}#初始化該姓名關系圖# 人物出現次數+1names[w.word] += 1print('names\n',names) print('relationships\n',relationships) print('lineNames\n',lineNames)步驟2
#分析人物關系 for line in lineNames:for name1 in line:for name2 in line:if name1 == name2:continueif relationships[name1].get(name2) is None:# 兩個人物第一次共同出現 初始化次數relationships[name1][name2] = 1else:# 兩個人物共同出現 關系+1relationships[name1][name2] += 1步驟3
# 寫csv文件 用于網絡圖使用 def generate_gephi():# 人物權重(節點)with open("earth_node.csv", "w", encoding='utf-8') as f:f.write("Id Label Weight\r\n")for name, times in names.items():f.write(name + " " + name + " " + str(times) + "\r\n")# 人物關系邊(邊)with open("earth_edge.csv", "w", encoding='utf-8') as f:f.write("Source Target Weight\r\n")for name, edge in relationships.items():for v, w in edge.items():if w > 3:f.write(name + " " + v + " " + str(w) + "\r\n")generate_gephi()得到的數據 是一列的
需要應用excel 技術將一列分成多列
如結果
畫圖
import pandas as pdfile1=pd.read_csv('earth_edge.csv',encoding='gbk')#人物關系 file1=file1.dropna()import networkx as nx from pylab import * import matplotlib.pyplot as plt mpl.rcParams['font.sans-serif'] = ['SimHei'] mpl.rcParams['axes.unicode_minus'] = Falsedef painting(): #繪制人物親密度圖G = nx.Graph() # 繪制個人物之間的親密關系for index, row in file1.iterrows():G.add_node(row['Source'])#添加節點for index, row in file1.iterrows():G.add_weighted_edges_from([(row['Source'],row['Target'],row['Weight'])])pos = nx.shell_layout(G)print('畫出網絡圖像:')nx.draw(G, pos, with_labels=True, node_color='white', edge_color='red', node_size=400, alpha=0.5)plt.show()painting()人太多 ,圖炸啦。
接下來我只繪制重要人物的圖
import pandas as pd import numpy as np file=pd.read_csv('earth_node.csv',encoding='gbk')#人物權重文件 file=file.dropna()file1=pd.read_csv('earth_edge.csv',encoding='gbk')#人物關系文件 file1=file1.dropna()#去空白#主要人物 namelist = ['郭嘯天','楊鐵心','冷笑','武功','包惜弱','那道人','郭靖','楊康','李萍','段天德','完顏洪烈','柯鎮惡','朱聰','韓寶駒','韓小瑩','鐵木真','梅超風','黃藥師','尹志平','馬鈺','沙通天','黃蓉','穆念慈','洪七公','周伯通','歐陽鋒','裘千仞'] #人物權重 node_size=[]#no人物權重for name in namelist :node_size.append(np.array(file.loc[file['Id'] == name, 'Weight'])[0])import networkx as nx from pylab import * import matplotlib.pyplot as plt mpl.rcParams['font.sans-serif'] = ['SimHei'] mpl.rcParams['axes.unicode_minus'] = Falsedef painting(): #繪制人物親密度圖G = nx.Graph() # 繪制個人物之間的親密關系for index, row in file1.iterrows():if row['Source'] in namelist:G.add_node(row['Source']) # 添加節點# 將當前人物添加進節點for index, row in file1.iterrows():if (row['Source'] in namelist) & (row['Target'] in namelist):#G.add_node(row['Source'], row['Target'])G.add_weighted_edges_from([(row['Source'], row['Target'], 10*np.array(row['Weight']))])#添加權重pos = nx.shell_layout(G)print('畫出網絡圖像:')nx.draw(G, pos, with_labels=True, node_color=range(27), edge_color='red', node_size=node_size, alpha=0.5,width=[float(d['weight']*0.01) for (u,v,d) in G.edges(data=True)])plt.show()painting()郭靖和黃蓉果然是真愛。
分析
本次 還有些缺陷。
如郭靖和黃蓉之間還有些昵稱。如靖哥哥,蓉兒,未統計進來。(主要是我懶,懶得寫多余代碼,使他們都映射到同一個名字。如把靖哥哥、郭大哥、郭靖 全部映射到郭靖。)
作者:電氣余登武
總結
以上是生活随笔為你收集整理的NLP分析小说人物关系,找找主人公的真爱。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv+yolov3实现目标检测
- 下一篇: 美国中国俄罗斯巴西谁的粮食出口量最少?