python构建关键词共现矩阵
本文仅仅提供了实现思路,如果对算法速度有追求的请移步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构建关键词共现矩阵相关推荐
- 【NLP】关键词共现/属性共现矩阵
[NLP]关键词共现/属性共现矩阵 [共现]理解起来无非是两个词语同时出现的频次作为一个指标,构造矩阵.矩阵的第一列和第一行都是词语列表中的所有词,因此对角线一般设置为0--即不把自己和自己共现算进去 ...
- python 共现矩阵
最近有个妹子问我共现矩阵python怎么实现? 大致写了下,顺便记下笔记 - 关于共现矩阵是什么,可以参考这篇博文:python构建关键词共现矩阵 本文提供另一思路: 以列表存储数据为例: 步骤1:针 ...
- python关键词共现图谱_如何用知网导出的关键词 几秒 生成共现矩阵及图谱 》完整版...
自编软件使用技能视频演示(一) 最新整理完整版的,从收集数据 到 共词矩阵 到 图谱. 在做社会网络分析时,首先需要得到共现矩阵,如关键词共现矩阵.作者共现矩阵.机构共现矩阵等. 可是如何把从知网里导 ...
- 关键词提取一:构造共现矩阵
因为TFIDF算法的提取关键词的准确性很差,tfidf提取出的关键词很难看出文本的主旨,于是考虑结合文本语义对词汇的权重(IDF)重新分配,于是想要借鉴SKE算法,即将词语语义特征融入关键词提取过程中 ...
- A股实践 :图神经网络与新闻共现矩阵策略(附代码)
量化投资与机器学习微信公众号,是业内垂直于量化投资.对冲基金.Fintech.人工智能.大数据等领域的主流自媒体.公众号拥有来自公募.私募.券商.期货.银行.保险.高校等行业30W+关注者,荣获202 ...
- 词向量发展史-共现矩阵-SVD-NNLM-Word2Vec-Glove-ELMo
话不多说,直接上干货. 首先介绍相关概念: 词嵌入:把词映射为实数域上向量的技术也叫词嵌入(word embedding). 词向量的分类表示: 一.共现矩阵 通过统计一个事先指定大小的窗口内的wor ...
- python关键词共现_python 共现矩阵的实现
1.前言 最近在学习python词库的可视化,其中有一个依据共现矩阵制作的可视化,感觉十分炫酷,便以此复刻. 2.项目背景 本人利用爬虫获取各大博客网站的文章,在进行jieba分词,得到每篇文章的关键 ...
- 通过共现矩阵和余弦相似度实现机器对单词的认知、python实现
通过共现矩阵和余弦相似度实现机器对单词的认知.python实现 本文介绍的定义: 一.语料库预处理 二.单词的分布式表示 三.单词的相似度 四.相似单词排序 本文介绍的定义: 语料库.计数方法的目的. ...
- Java共现矩阵的构建(用于社交网络结构分析)
本文作者:合肥工业大学 电子商务研究所 钱洋 email:1563178220@qq.com . 内容可能有不到之处,欢迎交流. 未经本人允许禁止转载. 文章目录 背景 Java实现共现矩阵 程序运行 ...
- Python 实现文本共现网络分析
前言 前两天简单地做了一个文本挖掘实战分析,里面提到了共现分析,但是并没有完成,有些遗憾 经过查阅资料,最终还是粗糙地完成了这个分析 对于共现分析 共词网络方法在知识网络研究中应用普遍,最为常见的就是 ...
最新文章
- 去除icon图标特效,阴影,反光
- linux下批量添加新用户
- ZOJ 1743 Concert Hall Scheduling(DP)
- C–gcc命令行下的参数
- linux看是否连上服务器
- 操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...
- 用字典给Model赋值
- 赋能金融全链路,360金融的融合中台究竟有何不同?
- nginx 安全优化
- FMEA软件框图及接口功能库(FMEAHunter)
- 详解JavaScript函数式编程中的curry函数
- toDesk 远程连接软件 连接远程电脑后黑屏
- spring boot新闻管理系统 毕业设计源码211113
- Android编程红外编程——红外码详析
- error: there are no arguments to ‘xxxx’ that depend on a template parameter, so a declaration of ‘xx
- 沙利文头豹研报|腾讯安全威胁情报中心TIX位居领导者,创新指数排名第一!
- HTML基础之tr和td标签用法
- 达观数据携手CCF举办第五届“达观杯”自然语言处理文本分类竞赛 ,开赛报名中!
- 攻克3D神器Blender的第三天-【内插面、倒角】
- HYDAC贺德克EDS系列压力传感器