目录
英文词频率统计
统计英文词频的第一步是分解并提取英文文章的单词。同一个单词会存在大小写不同形式,但计数却不能区分大小写。
假设文本由变量txt表示
对txt文件的读取:
txt = open('你的文件名.txt','r').read()
可以通过txt.Iower()函数将字母变成小写,排除原文大小写差异对词频统计的干扰。
英文单词的分隔可以是空格、标点符号或者特殊符号。为统一分隔方式,可以将各种特殊字符和标点符号使用txt.replace()方法替换成空格,再提取单词
统计词频的第二步是对每个单词进行计数。
假设将单词保存在变量str中,使用一个字典类型d,统计单词出现的次数可采用如下代码:
d[s] = d[s] + 1
当遇到一个新词时,计数为1,但是单词没有出现在字典结构中,则需要在字典中新建键值对:
d[s] = 1
因此,无论词是否在字典中,加入字典coumns中的处理逻辑可以统一表示如下
str ='abcdeeee'
d = {}
for s in str:
if s in d.keys():
d[s] = d[s] + 1
else:
d[s] = 1
print(d)
也可以优化为
d[s] = d.get(s,0) + 1
构建排除词库
对于文本中大量出现的冠词,连接词,代词如The,and,but,he,she等并不能代表文章含义,需要进一步排除,可以构建一个排除数据结构
exlcude = ['a','an','the','he','him']
从而,进行处理
for s in exlcude:
if s in d.keys():
del d[s]
对字典进行排序
Python中有非常便捷的排序方法sort,但是它只能对列表进行排序
对字典使用sort需要先将字典转化为list类型
在强制转化为list后,其元素是由字典的键值对组成的一个元组列表
使用 lambda函数对排序规则进行修改 选中元组中的‘‘值’’
items = list(d.items())
items.sort(key=lambda x:x[1],reverse= True)
整体代码如下:
exlcude = ['a','an','the','he','him']
for s in str:
d[s] = d.get(s,0) + 1
for s in exlcude:
if s in d.keys():
del d[s]
items = list(d.items())
items.sort(key=lambda x:x[1],reverse= True)
print(items)
中文词频率统计
jieba库
对于中文文本,其单词不像英文一样有空格分隔,而python的第三方jieba库很好的解决了这个问题
jieba库的安装这里不介绍
由于列表类型通用且灵活,jieba库推荐以下三种方法
jicbalIcut() 函数返回精确模式,输出的分词能够完整不多余地组成原始文本
jicba lcut(, cut_all = True) 函数返回全模式,输出原始文本中可能产生的所有问题,冗余性最大
jieba.lcut_for_search() 函数返回搜索引擎模式,该模式首先行执行精确模式,然后再对其中的长句子进一步切分获得结果。
对于无法识别的分词,也可以通过
jieba.add_word() 函数向分词库添加
方法
中文词与英文词的统计方法方法大同小异
这里只列出需要注意的地方
对于中文的近义词可能在统计的时候出现重复的情况,,如一些人名:孔明和诸葛
我们都知道他们是一个人但程序并不这样想
对于近义词 统一定义一个新变量,以这个变量为计数器,存放到字典中就可以了
如下
for word in s:
if word == '诸葛亮' or '孔明曰':
rword = '孔明'
d[rword] = d.get(rword,0) + 1
END