技术标签: python词云分析文本
2020.05.13更新:大家点个赞再收藏吧(点赞后观看,养成好习惯)TAT
如你所见。文章标题图是以 周杰伦的百度百科 词条为分析文档,以 周杰伦超话第一的那张图+PPT删除背景底色 为词频背景进行制作的(PPT真是个巨强的软件!我以后有时间一定会和大家分享的!)。这种词频分析、尤其是这种词云图,在这两年流行了起来。
但大家在制作的过程中可能总会这样或那样的问题:配色单调、收费、对中文的适配很差等等。而若我说,我可以免费给你一个软件,让你可以很方便地实现词频分析+词云生成(并且支持自定义);或者说,我可以免费教你自己写python来实现这些看起来很高大上的功能呢?
前几天总结2019年日记的时候,本想用一些词频统计软件/网站分析一下自己的2019年度关键词,结果发现能翻到的软件/网站要么只支持5w/10w字符以内文档的分析,要么就得乖乖掏钱才能进行无限制字数的分析……(是的我去年日记写了14w+字……)勤(jia)劳(jing)节(pin)俭(han)的我怎么可能就此认输!于是花了些时间自学python、写出了这个程序。在此分享给大家~ヾ(•ω•`)o
废话不多说,先上程序:程序理论支持无上限的字数分析(应该吧)。在运行程序后,会生成最高频的前100个字/词,并生成词云。分析文档、词云背景等都是支持用户自定义的,在文档“使用说明”中有更详细的介绍,这里就不再赘述。
放上百度云盘的链接,以飨读者。词频分析(提取码:lf38 )pan.baidu.com
这篇文章主要是想分享一下自己所写的代码,毕竟程序是死的,代码是活的。大家若是学会了自己写或改代码,那就相当于拥有了更多自定义的权力。(python真的比C、C#等语言要好学呜呜呜QAQ,而且网上好多好多教程的)
在开始分享之前,我可以向大家保证,在网上真的很难找到比我的功能更完善、同时代码更美观且注释详细、同时还不收费的教程/软件了(要是找到了当我没说略略略)。开讲!
以下代码都是基于 python3.7 进行开发的。
首先,安装所需的库。(当然,记得先安好python)
可以直接在cmd中(按下win+R,输入 cmd 后点确定)分别输入以下代码进行安装(部分可能已系统内置),也可以用其他方式进行安装。不过个人比较推荐通过cmd进行安装,毕竟cmd安装方便,不费事儿。
pip install re
pip install jieba
pip install collections
pip install numpy
pip install PIL
pip install wordcloud
pip install matplotlib.pyplot
安装完成后,就可以开心的敲代码啦~
在代码的开头,先进行一些定义。
在程序的开头进行定义,是为了以后修改代码更加方便。当然,在凭空开始写程序的时候,可能自己也不清楚自己之后都需要定义哪些东西,所以这一步可以在边写代码时边在程序开头进行修改。
另外,在运行程序的时候,记得把程序运行所需文件放在程序的运行目录下。
# 主要功能自定义设置
Analysis_text = '分析文档.txt' # 分析文档
userdict = '用户词典.txt' # 用户词典
StopWords = '停用词库.txt' # 停用词库
number = 100 # 统计个数
Output = '词频.txt' # 输出文件
background = '词频背景.jpg' # 词频背景
然后是导入相关的库。
这个没什么好说的,代码的注释中已经解释的很详细了。(我是按用到的库的先后顺序对安装库和导入库的顺序进行排序的哦,这样也许会更好理解一些)
# 导入扩展库
import re # 正则表达式库
import jieba # 结巴分词
import jieba.posseg # 词性获取
import collections # 词频统计库
import numpy # numpy数据处理库
from PIL import Image # 图像处理库
import wordcloud # 词云展示库
import matplotlib.pyplot as plt # 图像展示库(这里以plt代表库的全称)
在导入扩展库后,才是程序正文的开始。
工作的开头,当然是对所需分析文档进行读取。
读取方式有很多种,这里选择用open这一种比较简洁的方式;在读取完成后,不要忘记close哦,这是一个好————————习惯!(或者用with语句)这里读取的文件“Analysis_text”是前文定义的“Analysis_text = '分析文档.txt'”。
# 读取文件
fn = open(Analysis_text,'r',encoding = 'UTF-8') # 打开文件
string_data = fn.read() # 读出整个文件
fn.close() # 关闭文件
读取完成后,对文本进行一些预处理。
# 文本预处理
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"') # 定义正则表达式匹配模式(空格等)
string_data = re.sub(pattern, '', string_data) # 将符合模式的字符去除
添加动态调整词典和用户词典功能。这两个功能并不是必须的,大家可以根据个人需求决定是否使用。变量“userdict”是开头定义的“userdict = '用户词典.txt'”。
这两个功能的用处,是在自带词库的基础上、 根据动态调整词典/用户词典中的字/词对文档内容进行分词统计。若对程序自带词库的分词效果不尽满意, 可以在动态调整词典/用户词典中单独加入想要统计的词汇,以提高个别词汇识别成功率。格式为每行一个字/词。 比如:想统计“小小花”这个词的出现次数,但程序可能会将其分为“小小”“ 花”这两个词语分别进行统计;或是将“小小花”与前后文字/词一同进行统计,如“小小花朵”。 这时就可以在动态调整词典/用户词典中加入“小小花”一词,以提高识别成功率。
# 动态调整词典
jieba.suggest_freq('小小花', True) #True表示该词不能被分割,False表示该词能被分割
# 添加用户词典
jieba.load_userdict(userdict)
进行分词。
利用jieba词库进行分词。jieba词库在汉语语义分析中运用的十分广泛,上手也相对容易一点。更详细的相关介绍大家可以千度一下,我就不占地儿了。这里采用的是精确模式分词+使用HMM模型,可以将字/词划分的更加准确。
# 文本分词
seg_list_exact = jieba.cut(string_data, cut_all=False, HMM=True) # 精确模式分词+HMM
object_list = []
去除停用词。
对于停用词库中出现的词汇,程序不会进行统计。这个功能也不是必须的,大家可以根据个人需求决定是否使用。这里给出的停用词库是前面定义的“StopWords = '停用词库.txt'”,用的是常见的“Chinese stopwords”词库。这个词库在网上不太难找,懒得找的话也可以在我上面给出的链接中进行下载。
# 去除停用词(去掉一些意义不大的词,如标点符号、嗯、啊等)
with open(StopWords, 'r', encoding='UTF-8') as meaninglessFile:
stopwords = set(meaninglessFile.read().split('\n'))
stopwords.add(' ')
for word in seg_list_exact: # 循环读出每个分词
if word not in stopwords: # 如果不在去除词库中
object_list.append(word) # 分词追加到列表
进行词频统计。
这里的“number”是前面定义的“number = 100”,具体数值大家也可以自己更改。词频统计也有很多种写法,但个人认为使用Couter进行统计更加简洁。
# 词频统计
word_counts = collections.Counter(object_list) # 对分词做词频统计
word_counts_top = word_counts.most_common(number) # 获取前number个最高频的词
然后是添加“英文词性转中文词性字典”。
我在这个程序中加入了词性分析的功能,即识别当前字/词是形容词、动词还是名词等等。但jieba自带的词性分析输出结果为英文(a/v/n等),不便于用户直接阅读;因此我就在网上搜罗了一圈,自己花了点时间整理出来了这两个对照词典。
词典分为简洁版和详细版两个版本,大家按需所取。一般来说简洁版的就够用了,所以我在我的程序中使用的也是简洁版的转换。
# 英文词性转中文词性字典:简洁版
En2Cn = {
'a' : '形容词',
'ad' : '形容词',
'ag' : '形容词',
'al' : '形容词',
'an' : '形容词',
'b' : '区别词',
'bl' : '区别词',
'c' : '连词',
'cc' : '连词',
'd' : '副词',
'e' : '叹词',
'eng' : '英文',
'f' : '方位词',
'g' : '语素',
'h' : '前缀',
'i' : '成语',
'j' : '简称略语',
'k' : '后缀',
'l' : '习用语',
'm' : '数词',
'mq' : '数量词',
'n' : '名词',
'ng' : '名词',
'nl' : '名词',
'nr' : '名词',
'nr1' : '名词',
'nr2' : '名词',
'nrf' : '名词',
'nrfg' : '名词',
'nrj' : '名词',
'ns' : '名词',
'nsf' : '名词',
'nt' : '名词',
'nz' : '名词',
'o' : '拟声词',
'p' : '介词',
'pba' : '介词',
'pbei' : '介词',
'q' : '量词',
'qt' : '量词',
'qv' : '量词',
'r' : '代词',
'rg' : '代词',
'rr' : '代词',
'rz' : '代词',
'rzs' : '代词',
'rzt' : '代词',
'rzv' : '代词',
'ry' : '代词',
'rys' : '代词',
'ryt' : '代词',
'ryv' : '代词',
's' : '处所词',
't' : '时间词',
'tg' : '时间词',
'u' : '助词',
'ude1' : '助词',
'ude2' : '助词',
'ude3' : '助词',
'udeng': '助词',
'udh' : '助词',
'uguo' : '助词',
'ule' : '助词',
'ulian': '助词',
'uls' : '助词',
'usuo' : '助词',
'uyy' : '助词',
'uzhe' : '助词',
'uzhi' : '助词',
'v' : '动词',
'vd' : '动词',
'vf' : '动词',
'vg' : '动词',
'vi' : '动词',
'vl' : '动词',
'vn' : '动词',
'vshi' : '动词',
'vx' : '动词',
'vyou' : '动词',
'w' : '标点符号',
'wb' : '标点符号',
'wd' : '标点符号',
'wf' : '标点符号',
'wj' : '标点符号',
'wh' : '标点符号',
'wkz' : '标点符号',
'wky' : '标点符号',
'wm' : '标点符号',
'wn' : '标点符号',
'wp' : '标点符号',
'ws' : '标点符号',
'wt' : '标点符号',
'ww' : '标点符号',
'wyz' : '标点符号',
'wyy' : '标点符号',
'x' : '字符串',
'xu' : '字符串',
'xx' : '字符串',
'y' : '语气词',
'z' : '状态词',
'un' : '未知词',
}
# 英文词性转中文词性字典:详细版
En2Cn_Pro = {
'a' : '形容词',
'ad' : '形容词-副形词',
'ag' : '形容词-形容词性语素',
'al' : '形容词-形容词性惯用语',
'an' : '形容词-名形词',
'b' : '区别词',
'bl' : '区别词-区别词性惯用语',
'c' : '连词',
'cc' : '连词-并列连词',
'd' : '副词',
'e' : '叹词',
'eng' : '英文',
'f' : '方位词',
'g' : '语素',
'h' : '前缀',
'i' : '成语',
'j' : '简称略语',
'k' : '后缀',
'l' : '习用语',
'm' : '数词',
'mq' : '数量词',
'n' : '名词',
'ng' : '名词-名词性语素',
'nl' : '名词-名词性惯用语',
'nr' : '名词-人名',
'nr1' : '名词-汉语姓氏',
'nr2' : '名词-汉语名字',
'nrf' : '名词-音译人名',
'nrfg' : '名词-人名',
'nrj' : '名词-日语人名',
'ns' : '名词-地名',
'nsf' : '名词-音译地名',
'nt' : '名词-机构团体名',
'nz' : '名词-其他专名',
'o' : '拟声词',
'p' : '介词',
'pba' : '介词-“把”',
'pbei' : '介词-“被”',
'q' : '量词',
'qt' : '量词-动量词',
'qv' : '量词-时量词',
'r' : '代词',
'rg' : '代词-代词性语素',
'rr' : '代词-人称代词',
'rz' : '代词-指示代词',
'rzs' : '代词-处所指示代词',
'rzt' : '代词-时间指示代词',
'rzv' : '代词-谓词性指示代词',
'ry' : '代词-疑问代词',
'rys' : '代词-处所疑问代词',
'ryt' : '代词-时间疑问代词',
'ryv' : '代词-谓词性疑问代词',
's' : '处所词',
't' : '时间词',
'tg' : '时间词-时间词性语素',
'u' : '助词',
'ude1' : '助词-“的”“底”',
'ude2' : '助词-“地”',
'ude3' : '助词-“得”',
'udeng': '助词-“等”“等等”“云云”',
'udh' : '助词-“的话”',
'uguo' : '助词-“过”',
'ule' : '助词-“了”“喽”',
'ulian': '助词-“连”',
'uls' : '助词-“来讲”“来说”“而言”“说来”',
'usuo' : '助词-“所”',
'uyy' : '助词-“一样”“一般”“似的”“般”',
'uzhe' : '助词-“着”',
'uzhi' : '助词-“之”',
'v' : '动词',
'vd' : '动词-副动词',
'vf' : '动词-趋向动词',
'vg' : '动词-动词性语素',
'vi' : '动词-不及物动词(内动词)',
'vl' : '动词-动词性惯用语',
'vn' : '动词-名动词',
'vshi' : '动词-“是”',
'vx' : '动词-形式动词',
'vyou' : '动词-“有”',
'w' : '标点符号',
'wb' : '标点符号-百分号千分号,全角:% ‰ 半角:%',
'wd' : '标点符号-逗号,全角:, 半角:,',
'wf' : '标点符号-分号,全角:; 半角: ; ',
'wj' : '标点符号-句号,全角:。',
'wh' : '标点符号-单位符号,全角:¥ $ £ ° ℃ 半角 $',
'wkz' : '标点符号-左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { <',
'wky' : '标点符号-右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >',
'wm' : '标点符号-冒号,全角:: 半角: :',
'wn' : '标点符号-顿号,全角:、',
'wp' : '标点符号-破折号,全角:—— -- ——- 半角:—',
'ws' : '标点符号-省略号,全角:…… …',
'wt' : '标点符号-叹号,全角:! 半角:!',
'ww' : '标点符号-问号,全角:? 半角:?',
'wyz' : '标点符号-左引号,全角:“ ‘ 『',
'wyy' : '标点符号-右引号,全角:” ’ 』',
'x' : '字符串',
'xu' : '字符串-网址URL',
'xx' : '字符串-非语素字',
'y' : '语气词',
'z' : '状态词',
'un' : '未知词',
}
接下来的这一步最为关键,是把词频分析结果输出至工作台,并导出“词频.txt”文件。
为使分析结果便于理解,首先输出/写入“\n词语\t词频\t词性”,并用破折号作为分割线进行划分。利用count计数,进行双重for循环:第一重for循环是获取前number个词语与其词频,第二重for循环是获取前number个词语的词性;若count≠number,则依次输出/写入词语、词频、词性,并将count+1;直到count=number,终止循环。
另外,输出文件“Output”是前文定义的“Output = '词频.txt'”,程序会在运行目录下创建文本文件并进行写入。
# 输出至工作台,并导出“词频.txt”文件
print ('\n词语\t词频\t词性')
print ('——————————')
fileOut = open(Output,'w',encoding='UTF-8') # 创建文本文件;若已存在,则进行覆盖
fileOut.write('词语\t词频\t词性\n')
fileOut.write('——————————\n')
count = 0
for TopWord,Frequency in word_counts_top: # 获取词语和词频
for POS in jieba.posseg.cut(TopWord): # 获取词性
if count == number:
break
print(TopWord + '\t',str(Frequency) + '\t',list(En2Cn.values())[list(En2Cn.keys()).index(POS.flag)]) # 逐行输出数据
fileOut.write(TopWord + '\t' + str(Frequency) + '\t' + list(En2Cn.values())[list(En2Cn.keys()).index(POS.flag)] + '\n') # 逐行写入str格式数据
count += 1
fileOut.close() # 关闭文件
其实若能实现上面所给出的所有代码,那就已经是一个较为完善的词频分析软件了。但是我觉得还不够,还要再做点什么。
于是加入了制作词云这一功能。
首先,输出“开始制作词云……”,提示用户系统当前运行状态。定义词频的背景,这里的“background”是前面定义的“background = '词频背景.jpg'”。调用wordcloud函数,对部分参数进行调整。最后利用plt函数进行词云的展示。
# 词频展示
print ('\n开始制作词云……') # 提示当前状态
mask = numpy.array(Image.open(background)) # 定义词频背景
wc = wordcloud.WordCloud(
font_path = 'C:/Windows/Fonts/simfang.ttf', # 设置字体(这里选择“仿宋”)
background_color='white', # 背景颜色
mask = mask, # 文字颜色+形状(有mask参数再设定宽高是无效的)
max_words = number, # 显示词数
max_font_size = 150 # 最大字号
)
wc.generate_from_frequencies(word_counts) # 从字典生成词云
wc.recolor(color_func=wordcloud.ImageColorGenerator(mask)) # 将词云颜色设置为背景图方案
plt.figure('词云') # 弹框名称与大小
plt.subplots_adjust(top=0.99,bottom=0.01,right=0.99,left=0.01,hspace=0,wspace=0) # 调整边距
plt.imshow(wc, cmap=plt.cm.gray, interpolation='bilinear') # 处理词云
plt.axis('off') # 关闭坐标轴
print ('制作完成!') # 提示当前状态
print ('\n作者:丨小小花丨')
print ('日期:2020.01.16')
plt.show()
至此,一个词频分析的程序就基本完成啦!
最后!是加入一个小小的语句——
# 避免程序运行完成后直接退出
input()
在运行.py文件时,程序在运行完成后常常会“一闪而过”,很多时候是因为程序运行完了没事儿干了就自闭了。其实只要在代码的最后加上这样一句话就可以解决啦!
以上就是我想分享的全部内容 不管是打算自己动手写代码的盆友,还是觉得我给出的软件就够用的筒子,都建议先运行一下链接中给出的程序、看看程序的实现效果是什么样子的,这有益于自己对程序的理解。如果程序尚有什么问题的话,或者有什么更好的idea的话,欢迎大家的评论或是私信!
最后,祝大家学有所成!
文章浏览阅读3.2k次。本文研究全球与中国市场分布式光纤传感器的发展现状及未来发展趋势,分别从生产和消费的角度分析分布式光纤传感器的主要生产地区、主要消费地区以及主要的生产商。重点分析全球与中国市场的主要厂商产品特点、产品规格、不同规格产品的价格、产量、产值及全球和中国市场主要生产商的市场份额。主要生产商包括:FISO TechnologiesBrugg KabelSensor HighwayOmnisensAFL GlobalQinetiQ GroupLockheed MartinOSENSA Innovati_预计2026年中国分布式传感器市场规模有多大
文章浏览阅读1.1k次,点赞2次,收藏12次。常用组合逻辑电路结构——为IC设计的延时估计铺垫学习目的:估计模块间的delay,确保写的代码的timing 综合能给到多少HZ,以满足需求!_基4布斯算法代码
文章浏览阅读3.3k次,点赞3次,收藏5次。OpenAI Manager助手(基于SpringBoot和Vue)_chatgpt网页版
文章浏览阅读2.2k次。USACO自1992年举办,到目前为止已经举办了27届,目的是为了帮助美国信息学国家队选拔IOI的队员,目前逐渐发展为全球热门的线上赛事,成为美国大学申请条件下,含金量相当高的官方竞赛。USACO的比赛成绩可以助力计算机专业留学,越来越多的学生进入了康奈尔,麻省理工,普林斯顿,哈佛和耶鲁等大学,这些同学的共同点是他们都参加了美国计算机科学竞赛(USACO),并且取得过非常好的成绩。适合参赛人群USACO适合国内在读学生有意向申请美国大学的或者想锻炼自己编程能力的同学,高三学生也可以参加12月的第_usaco可以多次提交吗
文章浏览阅读394次。1.1 存储程序1.2 创建存储过程1.3 创建自定义函数1.3.1 示例1.4 自定义函数和存储过程的区别1.5 变量的使用1.6 定义条件和处理程序1.6.1 定义条件1.6.1.1 示例1.6.2 定义处理程序1.6.2.1 示例1.7 光标的使用1.7.1 声明光标1.7.2 打开光标1.7.3 使用光标1.7.4 关闭光标1.8 流程控制的使用1.8.1 IF语句1.8.2 CASE语句1.8.3 LOOP语句1.8.4 LEAVE语句1.8.5 ITERATE语句1.8.6 REPEAT语句。_mysql自定义函数和存储过程
文章浏览阅读188次。半导体二极管——集成电路最小组成单元。_本征半导体电流为0
文章浏览阅读2.8k次,点赞3次,收藏18次。游戏水面特效实现方式太多。咱们这边介绍的是一最简单的UV动画(无顶点位移),整个mesh由4个顶点构成。实现了水面效果(左图),不动代码稍微修改下参数和贴图可以实现岩浆效果(右图)。有要思路是1,uv按时间去做正弦波移动2,在1的基础上加个凹凸图混合uv3,在1、2的基础上加个水流方向4,加上对雾效的支持,如没必要请自行删除雾效代码(把包含fog的几行代码删除)S..._unity 岩浆shader
文章浏览阅读5k次。广义线性模型是线性模型的扩展,它通过连接函数建立响应变量的数学期望值与线性组合的预测变量之间的关系。广义线性模型拟合的形式为:其中g(μY)是条件均值的函数(称为连接函数)。另外,你可放松Y为正态分布的假设,改为Y 服从指数分布族中的一种分布即可。设定好连接函数和概率分布后,便可以通过最大似然估计的多次迭代推导出各参数值。在大部分情况下,线性模型就可以通过一系列连续型或类别型预测变量来预测正态分布的响应变量的工作。但是,有时候我们要进行非正态因变量的分析,例如:(1)类别型.._广义线性回归模型
文章浏览阅读69次。环境保护、 保护地球、 校园环保、垃圾分类、绿色家园、等网站的设计与制作。 总结了一些学生网页制作的经验:一般的网页需要融入以下知识点:div+css布局、浮动、定位、高级css、表格、表单及验证、js轮播图、音频 视频 Flash的应用、ul li、下拉导航栏、鼠标划过效果等知识点,网页的风格主题也很全面:如爱好、风景、校园、美食、动漫、游戏、咖啡、音乐、家乡、电影、名人、商城以及个人主页等主题,学生、新手可参考下方页面的布局和设计和HTML源码(有用点赞△) 一套A+的网_垃圾分类网页设计目标怎么写
文章浏览阅读614次,点赞7次,收藏11次。之前找到一个修改 exe 中 DLL地址 的方法, 不太好使,虽然能正确启动, 但无法改变 exe 的工作目录,这就影响了.Net 中很多获取 exe 执行目录来拼接的地址 ( 相对路径 ),比如 wwwroot 和 代码中相对目录还有一些复制到目录的普通文件 等等,它们的地址都会指向原来 exe 的目录, 而不是自定义的 “lib” 目录,根本原因就是没有修改 exe 的工作目录这次来搞一个启动程序,把 .net 的所有东西都放在一个文件夹,在文件夹同级的目录制作一个 exe._.net dll 全局目录
文章浏览阅读1.5k次。本文为转载,原博客地址:http://blog.csdn.net/hujingshuang/article/details/46910259简介 BRIEF是2010年的一篇名为《BRIEF:Binary Robust Independent Elementary Features》的文章中提出,BRIEF是对已检测到的特征点进行描述,它是一种二进制编码的描述子,摈弃了利用区域灰度..._breif description calculation 特征点
文章浏览阅读4.1k次,点赞21次,收藏79次。本文是《基于SpringBoot的房屋租赁管理系统》的配套原创说明文档,可以给应届毕业生提供格式撰写参考,也可以给开发类似系统的朋友们提供功能业务设计思路。_基于spring boot的房屋租赁系统论文