中文文本的预处理过程有以下几个步骤:
- 使用结巴分词,对中文句子进行切分。
- 去除停用词。(推荐使用 dongxiexidian/Chinese 这一份停用词词表,收录的比较齐全。)
- 去除空格、换行符、标点符号等特定字符。
- 词频统计
- 按照词频进行排序,打印结果
实验目的:
使用 jieba 对垃圾短信数据集进行分词,然后统计其中的单词出现的个数,找出出现频率最高的 top100 个词。
实验环境:
- Python 3.7.4(Anaconda3)
- macOS 10.14.4
实验数据:
- 垃圾短信数据集(spam.txt)
- 停用词表(stopwords.dat)
实验步骤:
1. 观察实验数据:
垃圾短信数据:
![22029dd7ac3c5a9762b4d222bb2626c7.png](https://i-blog.csdnimg.cn/blog_migrate/478fd20b5f023c397de8b023c5319024.jpeg)
作为输入的垃圾短信数据集文本中,以一行一条文本信息的方式进行存储。所以我们可以对输入文本信息进行按行操作,按行进行读取,然后做分词等等操作。
另外,我们对文本中的无用词汇进行观察,在word中对前十条信息的无用词汇进行了颜色标记,其中有句子开头部分的以::为结尾的呼叫号码信息(红色标出部分),url 的信息(黄色标出部分),电话号码信息(蓝色部分),日期信息(绿色部分)。这些星期对于我们的垃圾短信的分类任务,可以说是无关紧要的。但是这部分信息如果再放到后续进行切词的时候就会出现问题,比如我们会把一个个完整的 url 进行切割,但是它应该是一个整体。不过, url 信息对于我们来说本来就是无用数据,所以可以直接用正则表达式来删除它们,省的切词的时候麻烦。
停用词词表数据:
![bb1cc50751fe441ad7283cf56f33cebd.png](https://i-blog.csdnimg.cn/blog_migrate/ac50dd996d52217a9bc08e446d132746.png)
停用词词表的数据也是按行进行存储的,这样子,我们就可以整合垃圾短信的文件读取方法和停用词词表的文本读取方法。定义一个统一的方法来同时实现对垃圾短信和停用词词表的读取工作。
2. 读取输入文本数据和停用词词表:
这一块代码的实现思路为:
#定义输入输出文件的地址信息
#定义一个统一的文件读取方法
#定义一个统一的文件存储方法
#对从文件中读取到的原始垃圾短信内容进行正则过滤
#在正则得到的结果中再进一步进行停用词过滤,并将一行行的字符串信息转化为k-v字典
#对得到的字典按值进行正序排序,并将结果存储到文件
这里输入文件和停用词词表的存储位置大家视自己的具体情况进行调整。
我定义的统一的按行读取文件的方法如下:
#按行读取文件,返回文件的行字符串列表
保存文件的方法为:
#将content内容保存在对应的file_name文件
3. 对输入数据进行切词
如前面所说,我们发现输入文本信息中存在很多的 url 标签和电话号码信息等,会对我们的分词产生干扰,于是我们需要对其进行过滤,最简单的方法就是使用正则表达式(如果你不了解正则表达式,可以看一下:正则表达式语法)。如果你不相信 url 会对后续的切词结果产生干扰,那么你可以自己测试一下,删除切词之前的 url 过滤操作,看看你的切词后的结果如何。
正则表达式没有什么好说的,直接上代码。
#对短信中的用户名前缀和内部的url链接进行过滤删除
我们一开始只选择了对前缀呼叫号码、url标签、日期和数字的剔除,而我们为什么选择要剔除这些,也是根据我们对垃圾短信数据集中前十条数据的观察所得。实际上,大家可以根据自己最终的实验结果重新再来添加需要过滤的词,不同的文本他们需要额外过滤的东西是不一样的。
好了,在去除完成切词的干扰项后,就要进行切词操作了。对于中文文本的切词,目前体验最好的就是 jieba 分词工具 。我们的操作也很简单,使用普通模式即可。
实现代码为:
jieba
4. 对分词结果过滤停用词
分词得到的结果中存在很多没有意义的词(也就是停用词),比如“呢”、“吗”等等。我们需要把这些停用词从我们得到的分词结果中删除。
我这里的实现方法就是对每次分词的结果进行检查,判断它是否属于停用词,如果不是就添加到一个 list 中,否则就不进行操作。
cutwordslist
5. 词频统计和排序
这里我们可以使用 collections 模型的 Counter 类来统计词频。最终返回的是一个字典类型。为了便于操作,我们需要使用 items() 方法把字典转化为列表,然后再使用 sort 方法对列表进行排序,删除前 100 名词频最高的数据进行观察。如果这里有无意义的词,就将其添加到自定义的停用词扩展词表中,在之前进行删除。
cutwords
6. 观察最终结果
最终输出结果如下:
![af078f5d25cd866009ec28cdd1bea660.png](https://i-blog.csdnimg.cn/blog_migrate/0b281f3f57d3e1732e4b228e9b0c633e.jpeg)
虽然结果中还是存在着很多的无意义词需要进一步完善,但是大体来说 100 个词已经能够很好的反应我的输入文本的词频分布状况。对于初步的实验已经完全满足了。
实现代码:
# encoding=utf-8
另外,有关本次实验的数据集和实现代码我已经上传到了 GitHub:shaonianruntu/SMS-Spam-Word-Frequency-Statistics
推荐阅读:
- 使用python实现一个小型的文本分类系统- Python教程-PHP中文网
- Python进行文本预处理(文本分词,过滤停用词,词频统计,特征选择,文本表示) - CSDN博客
- 使用jieba分词对中文文档进行分词|停用词去重 - CSDN博客