中文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']}

好了,分詞完成!
雖然後續的程式中我不打算用到 詞性,但是這裡附上一張原論文中的對照表,供感興趣的同學查看:
截屏2020-05-09 下午7.47.23.png