“词云”是对文本中出现频率较高的“关键词”予以视觉上的突出的一种可视化手段,形成“关键词云层”或“关键词渲染”,使浏览者只要一眼扫过词云图片就可以了解文本中被重复频率最高的词汇,从而得知庞大的文本背后的核心内容。今天,小编尝试使用python对某一领域专利中的英文摘要进行分析,找出其中出现频率较高的词汇绘制成词云,以展示该领域的核心技术。 1.扩展包的安装 我们使用python的wordcloud库和pyecharts库来以两种方式实现词云。从文本中的句子里分割出词汇的工作使用python的分词库jieba(结巴分词)来实现。我们认为文本中的名词词汇较为重要,其他词性的词汇暂时需要过滤,因此我们需要对单词的词性进行分析。分析单词词性需要使用python的自然语言处理库nltk。Anaconda内置了nltk扩展包,需要小伙伴们打开anaconda的promt,输入以下命令安装wordcloud和结巴分词扩展库(安装链接见教程:作图详解|Anaconda扩展包的安装及bug处理): pip install wordcloud pip install jieba 2.文件的读取 使用的数据来源为导出的excel文件,文件中包含“摘要”一列,例如下图: 首先使用pandas扩展包对该文件的摘要一列进行读取,采用结巴分词对读取后的文本进行分割,将句子转化为词汇,通过nltk扩展包对词汇的词性进行分析,并标记每个词的词性。
3.数据统计与滤除 接下来,对每个词汇的出现次数进行计算,将结果存放在字典中并对字典进行排序。 尽管nltk帮助我们剔除了一些不关心的词,依然还存在一些干扰词汇且在专利申请中大量出现的,例如method,device等等,所以增加一个用户手动滤除环节。 自定义指定的滤除词汇在stopwords.txt中输入,用英文输入模式下的逗号隔开即可,例如下图: 滤除我们不关心的词汇后,取前1000个名词进行展示。上述过程中的分词和统计出现次数是为了得到pyecharts需要的数据格式。对于wordcloud而言,直接传递给他文本即可。wordcloud自己会分词和统计词频。
整体程序详解: 导入需要的扩展包 import pandas as pd #导入pandas,用于操作excel文件 import numpy as np import matplotlib.pyplot as plt from PIL import Image from wordcloud import WordCloud as WordCloud_Python from wordcloud import STOPWORDS import jieba from pyecharts import WordCloud import nltk nltk.download('punkt') nltk.download('averaged_perceptron_tagger')
读取摘要(由于绘制的为英文关键词词云,需剔除中文摘要) df=pd.read_excel('2018-04-26.xls',sheet_name='sheet1')#打开excel文件 cn_text=[] for i,j in enumerate(df['公开(公告)号']): if'CN'in j or'TW'in j: continue else: cn_text.append(df['摘要'][i]) cn_str='' for i in cn_text: cn_str =i
分词,使用nltk分析单词词性,统计词汇出现次数,并降序排列 seg_list = jieba.cut(cn_str,cut_all=False) seg_str = ' '.join(jieba.cut(cn_str,cut_all = False)) text = nltk.word_tokenize(seg_str) n_list=nltk.pos_tag(text) add_list=[] for text,name in n_list: if name == 'N'or name=='NN'or name=='NNP'or name=='NNS'or name=='NNPS': add_list.append(text) cn_dic={} for i in seg_list: if i notin cn_dic: cn_dic[i]=0 cn_dic[i] =1 else: cn_dic[i] =1 word_list=sorted(cn_dic.items(),key=lambda d: d[1],reverse=True)
从文本中读入用户指定的滤除词汇,存入列表中备用 with open('stopword.txt','r',encoding='utf8') as f: txt=f.read() stopword_list=txt.split(',')
a.若采用pyecharts绘制: 滤掉不关心的词汇,生成pyecharts需要的格式: name=[] value=[] for i in word_list: if i[0] in stopword_list: continue else: if i[0] in add_list and len(i[0])>1: name.append(i[0]) value.append(i[1])
调用pyecharts生成网页展示词云 wordcloud = WordCloud(width=1300, height=620) wordcloud.add('', name[:1000], value[:1000], word_size_range=[10, 200]) wordcloud.render('wordcloud.html')
b.若采用wordcloud库绘制: 滤除不关心的词汇,传递分词后的字符串获得词云 stopwords = set(STOPWORDS) for i in stopword_list: stopwords.add(i) wc = WordCloud_Python(width=800,height=600 ,max_words=1000,stopwords=stopwords, margin=10,colormap='Accent', random_state=1).generate(seg_str) # store default colored image default_colors = wc.to_array() plt.figure() plt.title('XXX领域核心技术词云') plt.imshow(default_colors) plt.axis('off') plt.savefig('cloud.png') plt.show() |
|