python进行词频统计_如何利用Python进行文本词频统计

欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

问题描述

Python在自然语言处理这个方面,有其天然的优势:简单,快捷。所以我们经常会遇到利用Python从一篇文档中,统计文本词频的问题。以《三国演义》这部名著为例,文中哪些人物的出场次数最多呢?让我们用Python来解决看看吧!

解决方案

在实际计算中,我们常常遇到需要同时处理多个数据的情况,所以我们引入了“组合数据类型”的概念。而我们今天主要用到的就是组合数据类型中映射类型“字典”的知识。字典具有处理任意长度和混合类型键值对的能力。

简单介绍了相关知识后,我们再来审审题。文本词频统计其实就是计算同一个词语出现的次数,通过对文本信息的自动检索,进行累加的简单计算就可以解决问题。

下面是此问题的IPO描述:

Input:读取《三国演义》内容

Process:利用“字典”统计词语的出现次数

Output:打印出《三国演义》中出场次数最多的人名和具体次数

我们一直在强调的是文本词频的统计,那么“词语”就成为了关键,如何从一段话中提取准确的词语呢?我们就要引入Python第三方库“jieba”的知识啦。Jieba是python中一个重要的第三方中文分词函数库,他将待分词的内容与分词词库依次进行比对,通过图结构和动态规划的方法找到最大概率的词组。

所以在第一行我们要引入jieba库

在第二行执行input,利用open函数,打开《三国演义》的文档。文档名为:sanguoyanyi.txt

接下来在第三行开始利用jieba 库的分词函数jieba.lcut()进行分词,这个分词函数是在精确模式下,可以形成列表类型的。我们把他命名为words。

接着,构造一个字典counts,对比词库,对文件进行列表分词。并通过counts.get的方法,对相关词语进行计数。‘

从第十行开始,正式进入累加的环节,将counts转换为列表格式。

第十一行是进一步对列表进行排序。然后用for i in range的方式,打印出排名前20的人物名称。

结果如下:

但是我们在打印出来的结果中发现,像“却说”,“二人”,“不可”这样的词是不属于人名的,而且像“孔明”和“孔明曰”这样词语又是一个意思,所以这个统计结果,并不是很准确。所以我们还要对刚刚的代码进行调整,比如加入一段排除词汇的代码。

为了解决问题一,排除不是人名的词汇,我们构造一个excludes的集合,将累计次数较高的词汇输入进去。这样的词汇怎么获得呢,我们只有一个笨办法,那就是“试”!不断的运行程序,让更多的词汇浮出水面,再把他们加到excludes的集合中,直到排名前20的词语都是人名为止。

为了解决问题二,我们要对词语进行整合,这就是第9到18行代码的作用了。

完整代码如下:

因为排除词汇的工作量太大了,所以我仅将出场排名前8名的人物打印出来了:

结果如下:

结语

这个实例的作用主要是让我们运用组合数据类型对文本进行词频统计。这里涉及到了列表和字典的知识,需要我们温故而知新。对于列表,我们可以用列表管理采集到的信息,用来构建数据结构;对于字典,我们可以用字典来处理复杂的数据信息。

总之,能完成一个实例,能写能理解,才代表你真正学会了这部分知识。也要记住,好的代码是靠着每一点点的修改,才能成为完美!!!

更多精彩文章:

where2go 团队

微信号:算法与编程之美

长按识别二维码关注我们!

温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值