当前位置:   article > 正文

Python 实现文本共现网络分析_python共现分析

python共现分析

共词网络方法

在知识网络研究中应用普遍,最为常见的就是利用论文关键词及其共现关系构建共词矩阵,进而映射为共词网络并可视化,从而来揭示某一学科某一领域某一主题的研究热点与趋势、知识结构与演化等。

引自:共词网络的结构与演化-概念与理论进展。

其基本含义:在大规模语料中,若两个词经常共同出现(共现)在截取的同一单元(如一定词语间隔/一句话/一篇文档等)中,则认为这两个词在语义上是相互关联的,而且,共现的频率越高,其相互间的关联越紧密。

图片来自:CiteSpace关键词共现图谱含义详细解析

两个词共同出现的次数越多,网络图中两个词语节点连线越粗,也就是共现的次数为边上的权值

其次,单个词出现的次数越多,在网络图中节点越大,若一个词与许多词均有联系,则这个词会在网络图的中心区域。

在文本挖掘中,有共现矩阵的概念,如下::

  1. ·I like deep learning.
  2. ·I like NLP.
  3. ·I enjoy modeling.

Python 代码实现

数据采用的还是 大江大河2弹幕数据

已经对数据做了文本去噪、去重、过滤等清洗

  1. import pandas as pd
  2. import numpy as np
  3. import os
  4. import jieba
  5. def my_cut(text):
  6. my_words = ['大江大河']
  7. for i in my_words:
  8. jieba.add_word(i)
  9. # 加载停用词
  10. stop_words = []
  11. with open(r"C:\\Users\\Administrator\\Desktop\\停用词.txt", 'r',encoding='utf-8') as f:
  12. lines = f.readlines()
  13. for line in lines:
  14. stop_words.append(line.strip())
  15. # stop_words[:10]
  16. return [w for w in jieba.cut(text) if w not in stop_words and len(w)>1]
  17. def str2csv(filePath, s, x):
  18. '''
  19. 将字符串写入到本地csv文件中
  20. :param filePath: csv文件路径
  21. :param s: 待写入字符串(逗号分隔格式)
  22. '''
  23. if x=='node':
  24. with open(filePath, 'w', encoding='gbk') as f:
  25. f.write("Label,Weight\r")
  26. f.write(s)
  27. print('写入文件成功,请在'+filePath+'中查看')
  28. else:
  29. with open(filePath, 'w', encoding='gbk') as f:
  30. f.write("Source,Target,Weight\r")
  31. f.write(s)
  32. print('写入文件成功,请在'+filePath+'中查看')
  33. def sortDictValue(dict, is_reverse):
  34. '''
  35. 将字典按照value排序
  36. :param dict: 待排序的字典
  37. :param is_reverse: 是否按照倒序排序
  38. :return s: 符合csv逗号分隔格式的字符串
  39. '''
  40. # 对字典的值进行倒序排序,items()将字典的每个键值对转化为一个元组,key输入的是函数,item[1]表示元组的第二个元素,reverse为真表示倒序
  41. tups = sorted(dict.items(), key=lambda item: item[1], reverse=is_reverse)
  42. s = ''
  43. for tup in tups: # 合并成csv需要的逗号分隔格式
  44. s = s + tup[0] + ',' + str(tup[1]) + '\n'
  45. return s
  46. def build_matrix(co_authors_list, is_reverse):
  47. '''
  48. 根据共同列表,构建共现矩阵(存储到字典中),并将该字典按照权值排序
  49. :param co_authors_list: 共同列表
  50. :param is_reverse: 排序是否倒序
  51. :return node_str: 三元组形式的节点字符串(且符合csv逗号分隔格式)
  52. :return edge_str: 三元组形式的边字符串(且符合csv逗号分隔格式)
  53. '''
  54. node_dict = {} # 节点字典,包含节点名+节点权值(频数)
  55. edge_dict = {} # 边字典,包含起点+目标点+边权值(频数)
  56. # 第1层循环,遍历整表的每行信息
  57. for row_authors in co_authors_list:
  58. row_authors_list = row_authors.split(' ') # 依据','分割每行,存储到列表中
  59. # 第2层循环
  60. for index, pre_au in enumerate(row_authors_list): # 使用enumerate()以获取遍历次数index
  61. # 统计单个词出现的频次
  62. if pre_au not in node_dict:
  63. node_dict[pre_au] = 1
  64. else:
  65. node_dict[pre_au] += 1
  66. # 若遍历到倒数第一个元素,则无需记录关系,结束循环即可
  67. if pre_au == row_authors_list[-1]:
  68. break
  69. connect_list = row_authors_list[index+1:]
  70. # 第3层循环,遍历当前行词后面所有的词,以统计两两词出现的频次
  71. for next_au in connect_list:
  72. A, B = pre_au, next_au
  73. # 固定两两词的顺序
  74. # 仅计算上半个矩阵
  75. if A==B:
  76. continue
  77. if A > B:
  78. A, B = B, A
  79. key = A+','+B # 格式化为逗号分隔A,B形式,作为字典的键
  80. # 若该关系不在字典中,则初始化为1,表示词间的共同出现次数
  81. if key not in edge_dict:
  82. edge_dict[key] = 1
  83. else:
  84. edge_dict[key] += 1
  85. # 对得到的字典按照value进行排序
  86. node_str = sortDictValue(node_dict, is_reverse) # 节点
  87. edge_str = sortDictValue(edge_dict, is_reverse) # 边
  88. return node_str, edge_str
  89. if __name__ == '__main__':
  90. os.chdir(r'C:\Users\Administrator\Desktop')
  91. filePath1 = r'C:\Users\Administrator\Desktop\node.csv'
  92. filePath2 = r'C:\Users\Administrator\Desktop\edge.csv'
  93. # 读取csv文件获取数据并存储到列表中
  94. df = pd.read_excel('处理好的弹幕数据.xlsx')
  95. df_ = [w for w in df['弹幕'] if len(w)>20]
  96. co_ist = [ " ".join(my_cut(w)) for w in df_]
  97. # 根据共同词列表, 构建共现矩阵(存储到字典中), 并将该字典按照权值排序
  98. node_str, edge_str = build_matrix(co_ist, is_reverse=True)
  99. #print(edge_str)
  100. # 将字符串写入到本地csv文件中
  101. str2csv(filePath1,node_str,'node')
  102. str2csv(filePath2,edge_str,'edge')

继续处理,这里只要 Weight 大于 3 的数据

  1. import pandas as pd
  2. edge_str = pd.read_csv('edge.csv',encoding='gbk')
  3. edge_str.shape
  4. edge_str1 = edge_str[edge_str['Weight']>3]
  5. edge_str1.shape
  6. Source = edge_str1['Source'].tolist()
  7. Target = edge_str1['Target'].tolist()
  8. co = Source + Target
  9. co =list(set(co))
  10. node_str = pd.read_csv('node.csv',encoding='gbk')
  11. #node_str
  12. node_str=node_str[node_str['Label'].isin(co)]
  13. node_str['id']=node_str['Label']
  14. node_str = node_str[['id','Label','Weight']] # 调整列顺序
  15. #node_str
  16. node_str.to_csv(path_or_buf="node.txt", index=False) # 写入csv文件
  17. edge_str1.to_csv(path_or_buf="edge.txt", index=False) # 写入csv文件

最终得到的数据

导入Gephi 制作网络图

制作网络图的过程 可参见 【绘制关系网络图】Gephi 入门使用

最终效果

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号