中文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