maoerbao

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

 

分词可以用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,主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

分类:

技术点:

相关文章: