1. 程式人生 > 實用技巧 >Python:詞頻統計及排序

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,主要是用來進行比較的元素,只有一個引數,具體的函式的引數就是取自於可迭代物件中,指定可迭代物件中的一個元素來進行排序。