中文NLP的第一步:分詞,基於 PaddleHub 實現,絕對小白友好(學習心得)
接下來的幾天,會分步進行闡述 NLP 的實際程序操作
由於深度學習硬件資源的稀缺性,所以了 PaddlePaddle 作為這次實操的框架平台,雖然 Paddle 在國際上的流行度比不上 tensorflow 等架構,但是在國內 Paddle 對於開發者還是非常友好的,尤其是入門級的同學,在 Paddle 社區裏面可以用中文提問和探討,相對上手門檻就低了很多,外加有不少中文教程,確實對小白們很友好。
另外,Paddle 上有免費的 GPU 資源可以用!!!
而且是 Telsa V100,沒概念的可以自己搜一下這玩意兒多貴!!!
中文 NLP 第一步:中文分詞
為什麼說這是中文的第一步呢?
因為英文基本不用分詞啊,本身就是一個個單詞!
所以到了咱們中文這裡,需要進行有意義的劃分,把一個句子分成一個個有意義的「詞語」(而不是「字」)
只有劃分了「詞語」,然後才可以把這些詞語向量化,然後才可以做詞嵌入,然後才可以做 NLP 中的後續等等等等操作!
最簡單的實現形式:PaddleHub
分詞模型有挺多種類的,比如我聽說過的 Jieba 切詞,效果也不錯,這裡在 Paddle 平台上,我就直接用現成的 LAC 分詞模型了
該模型的 PaddleHub 地址:
Lexical Analysis of Chinese,簡稱 LAC 詞法分析
該模型的論文地址:
Chinese Lexical Analysis with Deep Bi-GRU-CRF Network
跑程序前,必要的基礎要安裝好:
pip install paddlepaddle
pip install paddlehub
程序實現:
import paddlehub as hub
# 首先準備好我們要進行分詞的素材
raw_data = [
["你覺得明天是個晴天嗎","我看還是下雨的可能性大"],
["中國哪家公司的人工智能最牛呢"],
["我在山上看見愛因斯坦"],
["我把車把一把把住了"]
]
# 然後直接調用 PaddleHub 中現成的分詞模型 LAC
lac = hub.Module(name="lac")
for texts in raw_data: # 每一次取一個列表中的 元素,這個 元素 是個 字符串 的 列表
results = lac.lexical_analysis(texts=texts, use_gpu=False, batch_size=1)
# lexical_analysis(texts=[], data={}, use_gpu=False, batch_size=1, user_dict=None, return_tag=True)
# lac預測接口,預測輸入句子的分詞結果
# texts(list): 待預測數據,如果使用texts參數,則不用傳入data參數,二選一即可
# data(dict): 預測數據,key必須為text,value是帶預測數據。如果使用data參數,則不用傳入texts參數,二選一即可。
# 建議使用texts參數,data參數後續會廢棄。
# use_gpu(bool): 是否使用GPU預測
# batch_size(int): 批處理大小
# user_dict(None): 該參數不推薦使用,請在使用lexical_analysis()方法之前調用set_user_dict()方法設置自定義詞典
# return_tag(bool): 預測結果是否需要返回分詞標籤結果
# 返回結果:results(list): 分詞結果是個列表
for result in results: # 取得結果列表中的一個元素
print(result)
# 這裡 單個分詞 的結果是個字典,其中兩個key,一個是分詞結果 "word",一個是詞性標註 "tag"
運行結果如下:
{'word': ['你', '覺得', '明天', '是', '個', '晴天', '嗎'], 'tag': ['r', 'v', 'TIME', 'v', 'q', 'n', 'xc']}
{'word': ['我', '看', '還是', '下雨', '的', '可能性', '大'], 'tag': ['r', 'v', 'd', 'v', 'u', 'n', 'a']}
{'word': ['中國', '哪家', '公司', '的', '人工智能', '最', '牛', '呢'], 'tag': ['LOC', 'r', 'n', 'u', 'n', 'd', 'a', 'xc']}
{'word': ['我', '在', '山上', '看見', '愛因斯坦'], 'tag': ['r', 'p', 's', 'v', 'PER']}
{'word': ['我', '把', '車', '把', '一把把', '住', '了'], 'tag': ['r', 'p', 'n', 'p', 'm', 'v', 'xc']}
好了,分詞完成!
雖然後續的程序中我不打算用到 詞性,但是這裡附上一張原論文中的對照表,供感興趣的同學查看: