Python:词频统计及排序

对一段文本,想要统计各种词语出现的次数,即词频统计,思路是先分词,再进行数量统计、排序。

 

分词可以用jieba库,同时snownlp库也是可以实现的。

jieba一般可以直接用jieba.lcut('你的文本内容abcdefg。。。')即可,非常简单。

snownlp除了分词还能实现转繁体、情感分类等等功能,可以参考这篇:

https://www.cnblogs.com/zhuminghui/p/10953717.html

 

分词结果一般是列表形式,例如:

>>> txt="我是中国人,我爱中国。中国位于亚洲。"
>>> jieba.lcut(txt)
['我', '是', '中国', '人', ',', '我', '爱', '中国', '。', '中国', '位于', '亚洲', '。']

 

下面进行数量统计。

思路:每个词有个频数,这个形式用键值对来表示就非常合适了。因此用字典的方式。

txt = "我是中国人,我爱中国。中国位于亚洲。"
fenci = jieba.lcut(txt)
>>> d = {}
>>> for c in fenci:
	d[c] = d.get(c,0) + 1

>>> d
{'我': 2, '是': 1, '中国': 3, '人': 1, ',': 1, '爱': 1, '。': 2, '位于': 1, '亚洲': 1}

d.get(c,0)的功能是:返回字典d中,键为c的元素的对应值,如果目前没有键为c的元素,则返回0。

如果不想要标点符号或一些停用词,可以在循环里加判断来筛选。如果停用词比较多,可以搜停用词表。

例如:  https://github.com/goto456/stopwords

 

接下来再把字典转换为属性的列表即可。

方法1(不排序):

>>> L = []
>>> for key in d:
	L.append('{}:{}'.format(key, d[key]))

>>> L
['我:2', '是:1', '中国:3', '人:1', ',:1', '爱:1', '。:2', '位于:1', '亚洲:1']

不过做词频统计,一般都是关注频率高的词,要做排序,因此推荐下述的方法。

方法2(排序):

>>> M = list(d.items())
>>> M.sort(key = lambda x:x[1], reverse = True)
>>> M
[('中国', 3), ('我', 2), ('。', 2), ('是', 1), ('人', 1), (',', 1), ('爱', 1), ('位于', 1), ('亚洲', 1)]

这里使用了匿名函数的方法。

匿名函数的格式是:  lambda 参数:表达式,这样写比def来的更简单。

例如,要实现两个数相乘:

##常规方法
>>> def f(x,y):    
...     return x*y
>>> f(3,4)
12

##匿名函数
>>> func = lambda x,y:x*y
>>> func(3,4)
12

另外就是列表的sort方法中,可以设一个参数key,主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

posted on 2020-08-14 12:48  青锋剃刀  阅读(3544)  评论(0编辑  收藏  举报