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