基於中文分詞工具pkuseg-python,我用張小龍的3萬字演講做了測試

劉志軍發表於2019-01-15

做過搜尋的同學都知道,分詞的好壞直接決定了搜尋的質量,在英文中分詞比中文要簡單,因為英文是一個個單詞通過空格來劃分每個詞的,而中文都一個個句子,單獨一個漢字沒有任何意義,必須聯絡前後文字才能正確表達它的意思。

因此,中文分詞技術一直是nlp領域中的一大挑戰。Python 中有個比較著名的分詞庫是結巴分詞,從易用性來說對使用者是非常友好的,但是準確度不怎麼好。這幾天發現另外一個庫,pkuseg-python,看起來應該是北大的某個學生團隊弄出來的,因為這方面沒看到過多的介紹,pkuseg-python 的亮點是領域細分的中文分詞工具,簡單易用,跟現有開源工具相比提高了分詞的準確率。

於是我想起用張小龍的3萬字演講做下測試,前幾天在朋友圈流傳了一張圖,採銅統計出張小龍演講中各個詞出現的頻率,不知他是怎麼統計的,不過作為技術人,我們用更專業的工具來試試會是什麼效果。

基於中文分詞工具pkuseg-python,我用張小龍的3萬字演講做了測試

安裝 pkuseg

pip3 install pkuseg
複製程式碼

第一步是將演講內容下載下來,儲存到一個txt檔案中,然後將內容載入到記憶體

content = []
with open("yanjiang.txt", encoding="utf-8") as f:
    content = f.read()
複製程式碼

我統計了一下,文字總數是32546個。

接下來我們用pkuseg對內容進行分詞處理,並統計出現頻率最高的前20個詞語是哪些。

import pkuseg
from collections import Counter
import pprint

content = []
with open("yanjiang.txt", encoding="utf-8") as f:
    content = f.read()

seg = pkuseg.pkuseg()
text = seg.cut(content)
counter = Counter(text)
pprint.pprint(counter.most_common(20))
複製程式碼

輸出結果:

[(',', 1445),
 ('的', 1378),
 ('。', 755),
 ('是', 707),
 ('一', 706),
 ('個', 591),
 ('我', 337),
 ('我們', 335),
 ('不', 279),
 ('你', 231),
 ('在', 230),
 ('會', 220),
 ('了', 214),
 ('有', 197),
 ('人', 190),
 ('就', 178),
 ('這', 172),
 ('它', 170),
 ('微信', 163),
 ('做', 149)]
複製程式碼

什麼鬼,這都是些啥玩意,別急,其實啊,分詞領域還有一個概念叫做停用詞,所謂停用詞就是在語境中沒有具體含義的文字,例如這個、那個,你我他,的得地,以及標點符合等等。因為沒人在搜尋的時候去用這些沒意義的停用詞搜尋,為了使得分詞效果更好,我們就要把這些停用詞過去掉,我們去網上找個停用詞庫。

第二版程式碼:

import pkuseg
from collections import Counter
import pprint

content = []
with open("yanjiang.txt", encoding="utf-8") as f:
    content = f.read()

seg = pkuseg.pkuseg()
text = seg.cut(content)


stopwords = []

with open("stopword.txt", encoding="utf-8") as f:
    stopwords = f.read()

new_text = []

for w in text:
    if w not in stopwords:
        new_text.append(w)


counter = Counter(new_text)
pprint.pprint(counter.most_common(20))
複製程式碼

列印的結果:

[('微信', 163),
 ('使用者', 112),
 ('產品', 89),
 ('朋友', 81),
 ('工具', 56),
 ('程式', 55),
 ('社交', 55),
 ('圈', 47),
 ('視訊', 40),
 ('希望', 39),
 ('時間', 39),
 ('遊戲', 36),
 ('閱讀', 33),
 ('內容', 32),
 ('平臺', 31),
 ('文章', 30),
 ('資訊', 29),
 ('團隊', 27),
 ('AI', 27),
 ('APP', 26)]
複製程式碼

看起來比第一次好多了,因為停用詞都過濾掉了,跟採銅那張圖片有點像了,不過他挑出來的詞可能是從另外一個維度來的,畢竟人家是搞心理學的。但是我們選出來的前20個高頻詞還是不準確,有些不應該分詞的也被拆分了,例如朋友圈,公眾號,小程式等詞,我們認為這是一個整體。

對於這些專有名詞,我們只需要指定一個使用者詞典, 分詞時使用者詞典中的詞固定不分開,重新進行分詞。

lexicon = ['小程式', '朋友圈', '公眾號']  #
seg = pkuseg.pkuseg(user_dict=lexicon)  # 載入模型,給定使用者詞典
text = seg.cut(content)
複製程式碼

最後的出來的結果前50個高頻詞是這樣的

163 微信
112 使用者
89 產品
72 朋友圈
56 工具
55 社交
53 小程式
40 視訊
39 希望
39 時間
36 遊戲
33 閱讀
32 內容
31 朋友
31 平臺
30 文章
29 資訊
27 團隊
27 AI
26 APP
25 公眾號
25 服務
24 好友
22 照片
21 時代
21 記錄
20 手機
20 推薦
20 企業
19 原動力
18 功能
18 真實
18 生活
17 流量
16 電腦
15 空間
15 發現
15 創意
15 體現
15 公司
15 價值
14 版本
14 分享
14 未來
13 網際網路
13 釋出
13 能力
13 討論
13 動態
12 設計
複製程式碼

張小龍講得最多的詞就是使用者、朋友、原動力、價值、分享、創意、發現等這些詞,這些詞正是網際網路的精神,如果我們把這些做成詞雲的話,可能效果會更好

基於中文分詞工具pkuseg-python,我用張小龍的3萬字演講做了測試

本文首發於公眾號:Python之禪

相關文章