文章目录

  • 2021.02.17更新
  • 前言
  • 正文
  • 后记

2021.02.17更新

1.百度网盘链接

2.部分网友反应,用文章给出的代码分析文档的时候,有时会遇到如下的问题:

“ValueError: ‘zg’ is not in list”

这是因为“ zg”这个词性没有添加到#英文词性转中文词性字典这里面。程序发现分析文档中存在词性属于zg的词,但是我在程序里列出的字典中缺少这个词性的转换,所以就出问题了。

解决方法:在代码的#英文词性转中文词性字典里面添加上zg对应的转换就行,具体zg是什么百度一下就可。小花当时是把能查到的都写进去了,但是难免有几个词性查不到,谅解一下哈~如果出现类似的问题(比如“ValueError: ‘xxh’ is not in list”),也是把相应的词(如xxh)添加进去就行。
3.大家点个赞再收藏吧(点赞后观看,养成好习惯)TAT

前言

本文章也发表在了知乎平台上。两个平台的文章内容大致相同(但阅读体验是两种风格),大家可以按需所取。这里放上知乎文章的链接:知乎 丨小小花丨:用python实现词频分析+词云

如你所见。文章标题图是以 周杰伦的百度百科 词条为分析文档,以 周杰伦超话第一的那张图+PPT删除背景底色 为词频背景进行制作的(PPT真是个巨强的软件!我以后有时间一定会和大家分享的!)。这种词频分析、尤其是这种词云图,在这两年流行了起来。

但大家在制作的过程中可能总会这样或那样的问题:配色单调、收费、对中文的适配很差等等。而若我说,我可以免费给你一个软件,让你可以很方便地实现词频分析+词云生成(并且支持自定义);或者说,我可以免费教你自己写python来实现这些看起来很高大上的功能呢?

前几天总结2019年日记的时候,本想用一些词频统计软件/网站分析一下自己的2019年度关键词,结果发现能翻到的软件/网站要么只支持5w/10w字符以内文档的分析,要么就得乖乖掏钱才能进行无限制字数的分析……(是的我去年日记写了14w+字……)勤(jia)劳(jing)节(pin)俭(han)的我怎么可能就此认输!于是花了些时间自学python、写出了这个程序。在此分享给大家~ヾ(•ω•`)o

废话不多说,先上程序:程序理论支持无上限的字数分析(应该吧)。在运行程序后,会生成最高频的前100个字/词,并生成词云。分析文档、词云背景等都是支持用户自定义的,在文档“使用说明”中有更详细的介绍,这里就不再赘述。

放上百度云盘的链接,以飨读者。

词频分析(提取码:z344)

这篇文章主要是想分享一下自己所写的代码,毕竟程序是死的,代码是活的。大家若是学会了自己写或改代码,那就相当于拥有了更多自定义的权力。(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:breakprint(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文件时,程序在运行完成后常常会“一闪而过”,很多时候是因为程序运行完了没事儿干了就自闭了。其实只要在代码的最后加上这样一句话就可以解决啦!

后记

以上就是我想分享的全部内容

用python实现词频分析+词云相关推荐

  1. python单词词频字典_用python实现词频分析+词云

    2020.05.13更新:大家点个赞再收藏吧(点赞后观看,养成好习惯)TAT 如你所见.文章标题图是以 周杰伦的百度百科 词条为分析文档,以 周杰伦超话第一的那张图+PPT删除背景底色 为词频背景进行 ...

  2. 【Python】文本分析——词云

    做的第一个文本分析练习,主要是构建词云,文本以朱自清老师的"背影"为例. 分词 文本分析第一步就是分词,使用jieba库进行分词,因为要做词云,所以同时引入wordcloud和ma ...

  3. 利用python做微信聊天记录词云分析——记录美好回忆

    目录 1 概述 2 数据准备 2.1 安卓设备 2.1.1 Root手机,安装Root Explorer 2.1.2 用Root Explorer将聊天记录的数据文件导出并存入电脑 2.1.3 对En ...

  4. 统计词频-生成词云-数据分析报告(python R语言)

    数据分析 统计洛杉矶旅游地区的词频:景点词和酒店词 数据源:携程 网站的文本 数据分析: 统计词频(python语言) 用词云展示结果(R语言) 先看结果: 旅游景点的词频 旅游酒店的词频 统计酒店名 ...

  5. python中用来绘制词云的第三方库_如何用Python绘制词云?

    如果希望能够看懂代码,那么需要具备: 1. 了解Python语言的语法结构 2. 了解Python语言的标准包.第三方包的区别 3. Python代码基本是英文,意思一定程度上代表了它要做的事,懂英文 ...

  6. python学习笔记---中文词云

    python学习笔记–中文词云 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 发现词云的展示还挺有意思的,比较多的应用场景是给用户打标签,社交软件应用较多.今天随便找了一些文字电影 ...

  7. python程序创建词云 中国地图_就这么简单!使用Python生成漂亮的词云

    原标题:就这么简单!使用Python生成漂亮的词云 作者:Linux迷 链接:https://www.linuxmi.com 词云是一种数据可视化技术,用于表示文本数据,其中每个单词的大小表示其出现的 ...

  8. python怎样安装词云_在python中怎样安装词云-女性时尚流行美容健康娱乐mv-ida网...

    女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页 > 高级搜索 腾讯qq 云 词典正式发布无需下 ...

  9. 平安喜乐 | Python制作圣诞树和词云

    一.前言 圣诞节庆祝和送礼物貌似现在已经成为全球流行的习惯~ 本文利用 Python 制作圣诞树和词云,教会你多种方法,代码直接运行即可,学会拿去送给你想要祝福的人吧~~ 二.Python画圣诞树 1 ...

  10. Python编程:实现词云生成(附详细源码)

    Python编程:实现词云生成(附详细源码) 词云是一种数据可视化的方式,它可以用来展示某个主题下的主要关键词汇.在Python中,我们可以使用 wordcloud 库来实现词云的生成.本文将带您一步 ...

最新文章

  1. sqlserver trigger
  2. python切片语法-Python切片详解
  3. JavaScript———从setTimeout与setInterval到AJAX异步
  4. hdu 1227(二维dp)
  5. openjudge-NOI 2.6-1759 最长上升子序列
  6. java的部署目录在哪里_Java:Tomcat的部署实例之资源目录
  7. 青岛智能院助力智慧城市 打造智能产业“黄埔军校”
  8. mysql开启权限控制_mysql开启远程访问及相关权限控制
  9. C/C++中Windows API 简单的(Callback)回调机制
  10. Ubuntu中打开.ipynb文件
  11. c语言 zipf分布,Zipf分布:如何测量Zipf分布
  12. D版力控加密狗使用有感
  13. TOM企业邮箱如何注册?
  14. (四十二)利率互换与货币互换的定价
  15. 使用高德地图API获取天气
  16. Pytorch:训练中断再恢复时的注意事项
  17. FLUENT中的常用边界条件
  18. Java设计模式:抽象工厂
  19. delete 和 delete[]的区别
  20. Change Log - 更改日志

热门文章

  1. PPT文档转换成Word文档
  2. PPC2003SE开发日记-资源之工具安装(JONSON原创)
  3. win10解决已禁用输入法和隐藏中文简体美式键盘
  4. php如何除去图片水印,Phpcms v9如何去掉自带水印的解决方法
  5. html刷浏览量,批量刷网页点击量工具
  6. U-DIMM、SO-DIMM、FB-DIMM、Reg-DIMM区别
  7. postman中从url中获取各参数值
  8. android页面监听扫描枪,Android监听扫描枪内容(二)
  9. win10 u盘 修复计算机,U盘启动盘修复win10系统的方法
  10. 华为安装gsm框架_华为mate30怎么安装谷歌服务?华为mate30系列安装GMS框架图文教程...