本文仅仅提供了实现思路,如果对算法速度有追求的请移步python构建关键词共现矩阵速度优化(在此非常感谢这位同学的优化)

非常感谢南京大学的张同学发现我代码中的bug,现文中的代码均已经更新请放心使用,并且代码放弃使用numpy进行矩阵的构建,因此可以对中文进行构建关键词共现矩阵了。同时,有很多同学对我在blog中总是提到的“import自己的代码“的代码感兴趣,现在已将代码git至GITHUB中,需要的同学请自行clone,其中包括了filewalker.py(文件夹遍历)、reader.py(txt、excel文件的读写操作)、buildfile.py(新建文件夹等),具体用法,请参考我的另一篇博文《import自己写的.py》

这篇博文中为了方便矩阵构建和变换,我使用了numpy,但是numpy不支持读取和写入中文字符,仅仅支持英文(或者拉丁文?),因此希望做中文的关键词共现实验的同学,可以使用博文最下方的代码,给大家造成不便,十分抱歉!

中科院的小伙伴Leo Wood已经用pandas实现了共现计算,传送门:Python Pandas 构建共现矩阵

共现分析在数据分析中经常使用到,这里的关键词可以指的是文献中的关键词、作者、作者机构等等。在其他领域中,如电影电视剧也可以用来研究演员共现矩阵等等。在得出共现矩阵后,可以使用UCINET、NETDRAW或者Gephi来进行共现图谱的绘制,达到数据可视化的效果。

首先看看原始数据:

从图中可以看出,a和b共现2次,和c共现2次,其余以此类推。

*下面的代码中,存在import reader,reader是我自己写的.py文件,以方便我每次读取数据。这样就不用每次读取数据的时候都要再写一遍with open了,具体怎么使用请看我另一篇博文python中import自己写的.py
代码如下:

# -*- coding: utf-8 -*-
# @Date    : 2017-04-05 09:30:04
# @Author  : Alan Lau (rlalan@outlook.com)
import numpy as np
import reader
import time
from pprint import pprint as pdef log(func):def wrapper(*args, **kwargs):now_time = str(time.strftime('%Y-%m-%d %X', time.localtime()))print('------------------------------------------------')print('%s %s called' % (now_time, func.__name__))print('Document:%s' % func.__doc__)print('%s returns:' % func.__name__)re = func(*args, **kwargs)p(re)return rereturn wrapper@log
def get_set_key(data):'''构建一个关键词集合,用于作为共现矩阵的首行和首列'''all_key = '/'.join(data)key_list = all_key.split('/')set_key_list = list(filter(lambda x: x != '', key_list))return list(set(set_key_list))@log
def format_data(data):'''格式化需要计算的数据,将原始数据格式转换成二维数组'''formated_data = []for ech in data:ech_line = ech.split('/')formated_data.append(ech_line)return formated_data@log
def build_matirx(set_key_list):'''建立矩阵,矩阵的高度和宽度为关键词集合的长度+1'''edge = len(set_key_list)+1# matrix = np.zeros((edge, edge), dtype=str)matrix = [['' for j in range(edge)] for i in range(edge)]return matrix@log
def init_matrix(set_key_list, matrix):'''初始化矩阵,将关键词集合赋值给第一列和第二列'''matrix[0][1:] = np.array(set_key_list)matrix = list(map(list, zip(*matrix)))matrix[0][1:] = np.array(set_key_list)return matrix@log
def count_matrix(matrix, formated_data):'''计算各个关键词共现次数'''for row in range(1, len(matrix)):# 遍历矩阵第一行,跳过下标为0的元素for col in range(1, len(matrix)):# 遍历矩阵第一列,跳过下标为0的元素# 实际上就是为了跳过matrix中下标为[0][0]的元素,因为[0][0]为空,不为关键词if matrix[0][row] == matrix[col][0]:# 如果取出的行关键词和取出的列关键词相同,则其对应的共现次数为0,即矩阵对角线为0matrix[col][row] = str(0)else:counter = 0# 初始化计数器for ech in formated_data:# 遍历格式化后的原始数据,让取出的行关键词和取出的列关键词进行组合,# 再放到每条原始数据中查询if matrix[0][row] in ech and matrix[col][0] in ech:counter += 1else:continuematrix[col][row] = str(counter)return matrixdef main():keyword_path = r'test.xlsx'output_path = r'2.txt'data = reader.readxls_col(keyword_path)[0]set_key_list = get_set_key(data)formated_data = format_data(data)matrix = build_matirx(set_key_list)matrix = init_matrix(set_key_list, matrix)result_matrix = count_matrix(matrix, formated_data)np.savetxt(output_path, result_matrix, fmt=('%s,'*len(matrix))[:-1])if __name__ == '__main__':main()

为方便理解,我把每个函数返回的结果打印出来:

------------------------------------------------
2017-04-05 15:30:48 get_set_key called
Document:构建一个关键词集合,用于作为共现矩阵的首行和首列
get_set_key returns:
['f', 'd', 'c', 'a', 'b']
------------------------------------------------
2017-04-05 15:30:48 format_data called
Document:格式化需要计算的数据,将原始数据格式转换成二维数组
format_data returns:
[['a', 'b', 'c'], ['b', 'a', 'f'], ['a', 'd', 'c']]
------------------------------------------------
2017-04-05 15:30:48 build_matirx called
Document:建立矩阵,矩阵的高度和宽度为关键词集合的长度+1
build_matirx returns:
[['' '' '' '' '' '']['' '' '' '' '' '']['' '' '' '' '' '']['' '' '' '' '' '']['' '' '' '' '' '']['' '' '' '' '' '']]
------------------------------------------------
2017-04-05 15:30:48 init_matrix called
Document:初始化矩阵,将关键词集合赋值给第一列和第二列
init_matrix returns:
[['' 'f' 'd' 'c' 'a' 'b']['f' '' '' '' '' '']['d' '' '' '' '' '']['c' '' '' '' '' '']['a' '' '' '' '' '']['b' '' '' '' '' '']]
------------------------------------------------
2017-04-05 15:30:48 count_matrix called
Document:计算各个关键词共现次数
count_matrix returns:
[['' 'f' 'd' 'c' 'a' 'b']['f' '0' '0' '0' '1' '1']['d' '0' '0' '1' '1' '0']['c' '0' '1' '0' '2' '1']['a' '1' '1' '2' '0' '2']['b' '1' '0' '1' '2' '0']]***Repl Closed***

输出的结果为:

中文关键词的共现矩阵实现:

import os
import xlrd
import re
from pprint import pprint as ptdef readxls(path):xl = xlrd.open_workbook(path)sheet = xl.sheets()[0]data = []for i in range(0, sheet.ncols):data.append(list(sheet.col_values(i)))return (data[0])def wryer(path, text):with open(path, 'a', encoding='utf-8') as f:f.write(text)return path+' is ok!'def buildmatrix(x, y):return [[0 for j in range(y)] for i in range(x)]def dic(xlspath):keygroup = readxls(xlspath)keytxt = '/'.join(keygroup)keyfir = keytxt.split('/')keylist = list(set([key for key in keytxt.split('/') if key != '']))keydic = {}pos = 0for i in keylist:pos = pos+1keydic[pos] = str(i)return keydicdef showmatrix(matrix):matrixtxt = ''count = 0for i in range(0, len(matrix)):for j in range(0, len(matrix)):matrixtxt = matrixtxt+str(matrix[i][j])+'\t'matrixtxt = matrixtxt[:-1]+'\n'count = count+1print('No.'+str(count)+' had been done!')return matrixtxtdef inimatrix(matrix, dic, length):matrix[0][0] = '+'for i in range(1, length):matrix[0][i] = dic[i]for i in range(1, length):matrix[i][0] = dic[i]# pt(matrix)return matrixdef countmatirx(matrix, dic, mlength, keylis):for i in range(1, mlength):for j in range(1, mlength):count = 0for k in keylis:ech = str(k).split('/')# print(ech)if str(matrix[0][i]) in ech and str(matrix[j][0]) in ech and str(matrix[0][i]) != str(matrix[j][0]):count = count+1else:continuematrix[i][j] = str(count)return matrixdef main():xlspath = r'test.xlsx'wrypath = r'1.txt'keylis = (readxls(xlspath))keydic = dic(xlspath)length = len(keydic)+1matrix = buildmatrix(length, length)print('Matrix had been built successfully!')matrix = inimatrix(matrix, keydic, length)print('Col and row had been writen!')matrix = countmatirx(matrix, keydic, length, keylis)print('Matrix had been counted successfully!')matrixtxt = showmatrix(matrix)# pt(matrix)print(wryer(wrypath, matrixtxt))# print(keylis)if __name__ == '__main__':main()

python构建关键词共现矩阵相关推荐

  1. 【NLP】关键词共现/属性共现矩阵

    [NLP]关键词共现/属性共现矩阵 [共现]理解起来无非是两个词语同时出现的频次作为一个指标,构造矩阵.矩阵的第一列和第一行都是词语列表中的所有词,因此对角线一般设置为0--即不把自己和自己共现算进去 ...

  2. python 共现矩阵

    最近有个妹子问我共现矩阵python怎么实现? 大致写了下,顺便记下笔记 - 关于共现矩阵是什么,可以参考这篇博文:python构建关键词共现矩阵 本文提供另一思路: 以列表存储数据为例: 步骤1:针 ...

  3. python关键词共现图谱_如何用知网导出的关键词 几秒 生成共现矩阵及图谱 》完整版...

    自编软件使用技能视频演示(一) 最新整理完整版的,从收集数据 到 共词矩阵 到 图谱. 在做社会网络分析时,首先需要得到共现矩阵,如关键词共现矩阵.作者共现矩阵.机构共现矩阵等. 可是如何把从知网里导 ...

  4. 关键词提取一:构造共现矩阵

    因为TFIDF算法的提取关键词的准确性很差,tfidf提取出的关键词很难看出文本的主旨,于是考虑结合文本语义对词汇的权重(IDF)重新分配,于是想要借鉴SKE算法,即将词语语义特征融入关键词提取过程中 ...

  5. A股实践 :图神经网络与新闻共现矩阵策略(附代码)

    量化投资与机器学习微信公众号,是业内垂直于量化投资.对冲基金.Fintech.人工智能.大数据等领域的主流自媒体.公众号拥有来自公募.私募.券商.期货.银行.保险.高校等行业30W+关注者,荣获202 ...

  6. 词向量发展史-共现矩阵-SVD-NNLM-Word2Vec-Glove-ELMo

    话不多说,直接上干货. 首先介绍相关概念: 词嵌入:把词映射为实数域上向量的技术也叫词嵌入(word embedding). 词向量的分类表示: 一.共现矩阵 通过统计一个事先指定大小的窗口内的wor ...

  7. python关键词共现_python 共现矩阵的实现

    1.前言 最近在学习python词库的可视化,其中有一个依据共现矩阵制作的可视化,感觉十分炫酷,便以此复刻. 2.项目背景 本人利用爬虫获取各大博客网站的文章,在进行jieba分词,得到每篇文章的关键 ...

  8. 通过共现矩阵和余弦相似度实现机器对单词的认知、python实现

    通过共现矩阵和余弦相似度实现机器对单词的认知.python实现 本文介绍的定义: 一.语料库预处理 二.单词的分布式表示 三.单词的相似度 四.相似单词排序 本文介绍的定义: 语料库.计数方法的目的. ...

  9. Java共现矩阵的构建(用于社交网络结构分析)

    本文作者:合肥工业大学 电子商务研究所 钱洋 email:1563178220@qq.com . 内容可能有不到之处,欢迎交流. 未经本人允许禁止转载. 文章目录 背景 Java实现共现矩阵 程序运行 ...

  10. Python 实现文本共现网络分析

    前言 前两天简单地做了一个文本挖掘实战分析,里面提到了共现分析,但是并没有完成,有些遗憾 经过查阅资料,最终还是粗糙地完成了这个分析 对于共现分析 共词网络方法在知识网络研究中应用普遍,最为常见的就是 ...

最新文章

  1. 去除icon图标特效,阴影,反光
  2. linux下批量添加新用户
  3. ZOJ 1743 Concert Hall Scheduling(DP)
  4. C–gcc命令行下的参数
  5. linux看是否连上服务器
  6. 操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...
  7. 用字典给Model赋值
  8. 赋能金融全链路,360金融的融合中台究竟有何不同?
  9. nginx 安全优化
  10. FMEA软件框图及接口功能库(FMEAHunter)
  11. 详解JavaScript函数式编程中的curry函数
  12. toDesk 远程连接软件 连接远程电脑后黑屏
  13. spring boot新闻管理系统 毕业设计源码211113
  14. Android编程红外编程——红外码详析
  15. error: there are no arguments to ‘xxxx’ that depend on a template parameter, so a declaration of ‘xx
  16. 沙利文头豹研报|腾讯安全威胁情报中心TIX位居领导者,创新指数排名第一!
  17. HTML基础之tr和td标签用法
  18. 达观数据携手CCF举办第五届“达观杯”自然语言处理文本分类竞赛 ,开赛报名中!
  19. 攻克3D神器Blender的第三天-【内插面、倒角】
  20. HYDAC贺德克EDS系列压力传感器

热门文章

  1. 蚂蚁课堂视频笔记思维导图-4期 四、微服务安全
  2. Visual Studio 2017入门教程丨如何运行一个Fortran程序
  3. 2020软件测试学科全套上课视频教程网盘免费分享
  4. PDF文件怎么转Word才能不乱码?这样做就可以了
  5. unity序列帧动画
  6. 色 彩 RGB 值 对 照 表
  7. c语言用二维数组学生姓名,C语言实验报告合集-_人人文库网
  8. 分享不会迟到,只会来的晚一点——16倍速视频播放
  9. 《统计学习基础-数据挖掘、推理与…
  10. bing的翻译API 国际化