对一段文本,想要统计各种词语出现的次数,即词频统计,思路是先分词,再进行数量统计、排序。
分词可以用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,主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。