Python词频分析

一、前言

在日常工作或者生活中,有时候会遇到词频分析的场景。如果是要进行词频分析,那么首先需要对句子进行分词,将句子中的单词进行切割并按照词性进行归类。

在Python中有个第三方库叫jieba(结巴),可以对文章或者语句进行分词。不得不佩服这个库的作者,真是个取名鬼才:)

二、分词

2.1 安装库

jieba库github地址

jieba库官方给出了3中安装库的方式,分别如下:

全自动安装:

easy_install jieba 或者 pip install jieba / pip3 install jieba

半自动安装:

先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install

手动安装:

将 jieba 目录放置于当前目录或者 site-packages 目录

2.2 方法介绍

2.2.1 jieba.cut

方法接受四个输入参数:

1、需要分词的字符串;

2、cut_all 参数用来控制是否采用全模式;

3、HMM 参数用来控制是否使用 HMM 模型;

4、use_paddle 参数用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny,并且import相关代码;

注意:

1、实测paddle模式无法开启(jieba.enable_paddle()),会报错。

2、该方法返回的是generator,如果需要返回list,则可以通过list转换结果或者使用jieba.lcut方法

3、待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8。

2.2.1 jieba.cut_for_search

方法接受两个参数:

1、需要分词的字符串;

2、是否使用 HMM 模型。

注意:

1、该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。

2、该方法返回的是generator,如果需要返回list,则可以通过list转换结果或者使用jieba.lcut_for_search方法。

2.2.2 jieba.Tokenizer(dictionary=DEFAULT_DICT)

该方法用于新建自定义分词器,可用于同时使用不同词典。jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。

2.3 代码示例

2.3.1 分词

  1. # encoding=utf-8
  2. import jieba
  3. strs = ["我来到北京清华大学", "乒乓球拍卖完了", "中国科学技术大学"]
  4. for s in strs:
  5. seg_list = jieba.cut(s, use_paddle=False) # 使用paddle模式
  6. print("Paddle Mode: " + '/'.join(list(seg_list)))
  7. seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
  8. print("Full Mode: " + "/ ".join(seg_list)) # 全模式
  9. seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
  10. print("Default Mode: " + "/ ".join(seg_list)) # 精确模式
  11. seg_list = jieba.cut("他来到了网易杭研大厦") # 默认是精确模式
  12. print(", ".join(seg_list))
  13. seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 搜索引擎模式
  14. print(", ".join(seg_list))

运行结果:

Building prefix dict from the default dictionary ...

Loading model from cache C:\Users\FURONG~1\AppData\Local\Temp\jieba.cache

Loading model cost 0.705 seconds.

Prefix dict has been built successfully.

Paddle Mode: 我/来到/北京/清华大学

Paddle Mode: 乒乓球/拍卖/完/了

Paddle Mode: 中国/科学技术/大学

Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

Default Mode: 我/ 来到/ 北京/ 清华大学

他, 来到, 了, 网易, 杭研, 大厦

小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造

2.3.2 载入词典

开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率。

用法:jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径。

词典格式和 dict.txt 一样(dict.txt为安装jieba库时自带的词典,路径为:Python安装路径\Lib\site-packages\jieba\dict.txt),一个词占一行;每一行分三部分:

  1. 词语
  2. 词频(可省略)
  3. 词性(可省略)

    用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。

    词频省略时使用自动计算的能保证分出该词的词频。

    例如:

创新办 3 i

云计算 5

凱特琳 nz

台中

更改分词器(默认为 jieba.dt)的 tmp_dir 和 cache_file 属性,可分别指定缓存文件所在的文件夹及其文件名,用于受限的文件系统。

范例:

自定义词典:https://github.com/fxsjy/jieba/blob/master/test/userdict.txt

用法示例:https://github.com/fxsjy/jieba/blob/master/test/test_userdict.py

加载自定义词库前: 李小福 / 是 / 创新 / 办 / 主任 / 也 / 是 / 云 / 计算 / 方面 / 的 / 专家 /

加载自定义词库后: 李小福 / 是 / 创新办 / 主任 / 也 / 是 / 云计算 / 方面 / 的 / 专家 /

调整词典

使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。

使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。

注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。

print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))

如果/放到/post/中将/出错/。

jieba.suggest_freq(('中', '将'), True)

494

print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))

如果/放到/post/中/将/出错/。

print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))

「/台/中/」/正确/应该/不会/被/切开

jieba.suggest_freq('台中', True)

69

print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))

「/台中/」/正确/应该/不会/被/切开

2.3.3 词性标注

jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。

标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。

  1. import jieba.posseg as pseg
  2. words = pseg.cut("我爱北京天安门")
  3. for word, flag in words:
  4. print('%s %s' % (word, flag))

我 r

爱 v

北京 ns

天安门 ns

词性和专名类别标签集合如下表,其中词性标签 24 个(小写字母),专名类别标签 4 个(大写字母):

三、实例

3.1 分词

这里就拿笔者最近看的一本小说判官.txt来进行实例词频分析吧。目的是想要分析这本小说的人物、名词、地名,从而对这本小说有个大概的认识。

分词代码如下:

  1. def m_get_content(self):
  2. """
  3. 获取给定txt或str中的内容
  4. @return: {str:获取到的内容}
  5. """
  6. if self.f_input.endswith('.txt'):
  7. with open(self.f_input, 'r', encoding='utf-8') as f:
  8. content = f.read()
  9. else:
  10. content = self.f_input
  11. return content
  12. def m_get_target_words_from_content(self, p_content):
  13. """
  14. 从目标内容中获取到指定词性的词语
  15. @param p_content: 需要分词的内容
  16. @return: {list:分词后的词语}
  17. """
  18. return [
  19. _.word
  20. for _ in psg.cut(p_content)
  21. if len(_.word) > 1 and _.flag in self.f_wordclass
  22. ]

3.2 按照词频排序

  1. def words_frequency(p_list, p_reverse=True):
  2. """
  3. 返回给定的list中的所有元素按照频率和指定的顺序组成的list
  4. @param p_list: 给定的list
  5. @param p_reverse: 指定的排序顺序(倒序为True,正序为False)
  6. @return: {list[tuple]:经过排序后的内容}
  7. """
  8. result = {}
  9. for word in p_list:
  10. result.setdefault(word, 0)
  11. result[word] += 1
  12. return sorted(result.items(), key=lambda x: x[1], reverse=p_reverse)
  13. def m_words_sort(self, p_words: list):
  14. """
  15. 对获取到的分词的内容进行按照频率排序
  16. @param p_words: 需要进行按频率排序的内容
  17. @return: {list[tuple]:经过排序后的内容}
  18. """
  19. return words_frequency(p_list=p_words, p_reverse=self.f_reverse)

3.3 获取排序后的前N项内容制作柱图

  1. def m_show_words_frequency(self, p_words_sort: list):
  2. """
  3. 将p_words_sort中的内容提取前p_ranknum项使用"-"符号展示柱图。
  4. @param p_words_sort: 要用来展示柱图的dict内容
  5. @return: {str:柱图}
  6. """
  7. max_frequency = max(p_words_sort[0][1], p_words_sort[-1][1])
  8. ratio = max_frequency / self.f_shownum
  9. print('%-5s\t%-5s\t%-5s\t%-15s' % ('序号', '词性', '词频', '柱图'))
  10. for i in range(self.f_ranknum):
  11. print(f'{i + 1:<5}\t{p_words_sort[i][0]:<5}\t{p_words_sort[i][1]:<5}\t{"-" * int(p_words_sort[i][1] / ratio):<15}')

3.4 获取排序后的前N项内容制作词云图

用Python制作词云图需要安装wordcloud第三方库。参照如下:

python词云制作(最全最详细的教程)

  1. from wordcloud import WordCloud
  2. words_cloud = ' '.join([_[0] for _ in words_sort[:10]])
  3. wordcloud = WordCloud(font_path="msyh.ttc").generate(words_cloud)
  4. wordcloud.to_file(self.f_wordcloud_fn)

3.5 结果

人名部分

序号 词性 词频 柱图

1 闻时 1405 ------------------------------

2 谢问 1092 -----------------------

3 周煦 762 ----------------

4 卜宁 513 ----------

5 张岚 466 ---------

6 张雅临 332 -------

7 张碧灵 219 ----

8 沈曼怡 216 ----

9 张正初 185 ---

10 李先生 164 ---

名词部分

序号 词性 词频 柱图

1 时候 777 ------------------------------

2 有点 449 -----------------

3 傀线 376 --------------

4 手指 345 -------------

5 声音 324 ------------

6 地方 316 ------------

7 感觉 293 -----------

8 眼睛 255 ---------

9 老毛 209 --------

10 对方 208 --------

地名部分

序号 词性 词频 柱图

1 夏樵 803 ------------------------------

2 东西 550 --------------------

3 大东 231 --------

4 沈家 184 ------

5 云山 140 -----

6 沈桥 80 --

7 宁州 51 -

8 下山 45 -

9 天津 35 -

10 西屏园 32 -

3.6 完整代码

  1. import jieba.posseg as psg
  2. def words_frequency(p_list, p_reverse=True):
  3. """
  4. 返回给定的list中的所有元素按照频率和指定的顺序组成的list
  5. @param p_list: 给定的list
  6. @param p_reverse: 指定的排序顺序(倒序为True,正序为False)
  7. @return: {list[tuple]:经过排序后的内容}
  8. """
  9. result = {}
  10. for word in p_list:
  11. result.setdefault(word, 0)
  12. result[word] += 1
  13. return sorted(result.items(), key=lambda x: x[1], reverse=p_reverse)
  14. class WordsFrequency:
  15. def __init__(self, p_input: str, p_wordclass: list[str], p_ranknum=10, p_reverse=True, p_shownum=30, p_wordcloud_fn='人名.jpg'):
  16. """
  17. @param p_input: 要分析的文件名或字符串,文件必须为txt格式,编码为utf-8.
  18. @param p_wordclass: 要获取的词性。常见的类型有:普通名词n、人名nr、地名ns
  19. @param p_ranknum: 要获取前多少个目标词性的词语。
  20. @param p_reverse: 目标词语通过频率指定的排序方向。(倒序为True,正序为False)
  21. @param p_shownum: 频率最多的元素使用的柱图标识"-"的个数。
  22. @param p_wordcloud_fn: 生成词云图的图片文件名
  23. """
  24. self.f_input = p_input
  25. self.f_wordclass = p_wordclass
  26. self.f_ranknum = p_ranknum
  27. self.f_reverse = p_reverse
  28. self.f_shownum = p_shownum
  29. self.f_wordcloud_fn = p_wordcloud_fn
  30. def m_get_content(self):
  31. """
  32. 获取给定txt或str中的内容
  33. @return: {str:获取到的内容}
  34. """
  35. if self.f_input.endswith('.txt'):
  36. with open(self.f_input, 'r', encoding='utf-8') as f:
  37. content = f.read()
  38. else:
  39. content = self.f_input
  40. return content
  41. def m_get_target_words_from_content(self, p_content):
  42. """
  43. 从目标内容中获取到指定词性的词语
  44. @param p_content: 需要分词的内容
  45. @return: {list:分词后的词语}
  46. """
  47. return [
  48. _.word
  49. for _ in psg.cut(p_content)
  50. if len(_.word) > 1 and _.flag in self.f_wordclass
  51. ]
  52. def m_words_sort(self, p_words: list):
  53. """
  54. 对获取到的分词的内容进行按照频率排序
  55. @param p_words: 需要进行按频率排序的内容
  56. @return: {list[tuple]:经过排序后的内容}
  57. """
  58. return words_frequency(p_list=p_words, p_reverse=self.f_reverse)
  59. def m_show_words_frequency(self, p_words_sort: list):
  60. """
  61. 将p_words_sort中的内容提取前p_ranknum项使用"-"符号展示柱图。
  62. @param p_words_sort: 要用来展示柱图的dict内容
  63. @return: {str:柱图}
  64. """
  65. max_frequency = max(p_words_sort[0][1], p_words_sort[-1][1])
  66. ratio = max_frequency / self.f_shownum
  67. print('%-5s\t%-5s\t%-5s\t%-15s' % ('序号', '词性', '词频', '柱图'))
  68. for i in range(self.f_ranknum):
  69. print(f'{i + 1:<5}\t{p_words_sort[i][0]:<5}\t{p_words_sort[i][1]:<5}\t{"-" * int(p_words_sort[i][1] / ratio):<15}')
  70. def main(self):
  71. content = self.m_get_content()
  72. words = self.m_get_target_words_from_content(content)
  73. words_sort = self.m_words_sort(words)
  74. # 柱图部分
  75. self.m_show_words_frequency(words_sort)
  76. # 生成词云图
  77. from wordcloud import WordCloud
  78. words_cloud = ' '.join([_[0] for _ in words_sort[:10]])
  79. wordcloud = WordCloud(font_path="msyh.ttc").generate(words_cloud)
  80. wordcloud.to_file(self.f_wordcloud_fn)
  81. if __name__ == '__main__':
  82. wf = WordsFrequency(p_input='判官.txt', p_wordclass=['ns'], p_wordcloud_fn='地名.jpg')
  83. wf.main()

Python词频分析的更多相关文章

  1. json与api- 天气api 博客词频分析

    一.json基础 1.1 json的介绍 json现在成为各种程序与语言之间交互的一种数据格式,本质是文本,字符串. json有两种格式: 1.  类似字典  {k:v,k,v} 2.  类似列表 { ...

  2. Python股票分析系列——自动获取标普500股票列表.p5

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第5部分.在本教程和接下来的几节中,我们将着手研究如何为更多公司提供大量的定价信息,以及如何一次 ...

  3. Python股票分析系列——基础股票数据操作(二).p4

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第4部分.在本教程中,我们将基于Adj Close列创建烛台/ OHLC图,这将允许我介绍重新采 ...

  4. Python股票分析系列——基础股票数据操作(一).p3

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第3部分.在本教程中,我们将使用我们的股票数据进一步分解一些基本的数据操作和可视化.我们将要使用 ...

  5. Python股票分析系列——数据整理和绘制.p2

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第2部分. 在本教程中,我们将利用我们的股票数据进一步分解一些基本的数据操作和可视化. 我们将要 ...

  6. Python股票分析系列——系列介绍和获取股票数据.p1

    本系列转载自youtuber sentdex博主的教程视频内容 https://www.youtube.com/watch?v=19yyasfGLhk&index=4&list=PLQ ...

  7. Python数据采集分析告诉你为何上海二手房你都买不起

    感谢关注Python爱好者社区公众号,在这里,我们会每天向您推送Python相关的文章实战干货. 来吧,一起Python. 对商业智能BI.大数据分析挖掘.机器学习,python,R等数据领域感兴趣的 ...

  8. 【转】python模块分析之collections(六)

    [转]python模块分析之collections(六) collections是Python内建的一个集合模块,提供了许多有用的集合类. 系列文章 python模块分析之random(一) pyth ...

  9. 【转】python模块分析之unittest测试(五)

    [转]python模块分析之unittest测试(五) 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) p ...

随机推荐

  1. 关闭BottomSheetDialogFragment从后台返回后的动画

    问题 显示BottomSheetDialogFragment后.将当前应用放于后台,切换到其他APP,然后再返回当前应用.此时会看到BottomSheetDialogFragment从下而上的动画再次 ...

  2. Git 日志提交规范

    Commit messages的基本语法 当前业界应用的比较广泛的是 Angular Git Commit Guidelines 具体格式为: <type>: <subject> ...

  3. 1903021121—刘明伟—Java第三周作业—学习在eclipse上创建并运行java程序

    项目 内容 课程班级博客链接 19信计班(本) 作业要求链接 第三周作业 作业要求 每道题要有题目,代码,截图 扩展阅读 eclipse如何创建java程序 java语言基础(上) 扩展阅读心得: 想 ...

  4. react 疑问集锦

    在 setState 后未 re-render function component 初始化调用接口

  5. 由C# dynamic是否装箱引发的思考

    前言 前几天在技术群里看到有同学在讨论关于dynamic是否会存在装箱拆箱的问题,我当时第一想法是"会".至于为啥会有很多人有这种疑问,主要是因为觉得dynamic可能是因为有点特 ...

  6. AngularJS搭建环境

    一.搭建环境 1.1 调试工具:batarang Chrome浏览器插件 主要功能:查看作用域.输出高度信息.性能监控 1.2 依赖软件:Node.js 下载:https://nodejs.org/e ...

  7. CentOS7软件环境

    一.软件环境 1.1 centos7 [root@centos7 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [r ...

  8. unity---摄像机参数

    2D游戏一般选择填充,减少性能浪费,也一般选择正交模式 Fiel of View 类似望远镜的效果 Clipping Planes 摄像机开始摄像和结束,两个平面的位置 Depth 决定摄像头的优先级 ...

  9. CMake进行C/C++开发(linux下)

    开发环境配置 安装GCC,GDB sudo apt update # 通过以下命令安装编译器和调试器 sudo apt install build-essential gdb 安装成功确认 # 以下命 ...

  10. 基于PYQT5的截图翻译工具

    基于PYQT5的截图翻译工具 功能介绍 翻译功能 截图功能(快捷键 + 截图存储到剪切板中) 文字识别OCR(基于百度API的文字识别) UI 界面 截图 截图可以使用第三方截图 或 使用PyQt5截 ...