中文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']}
好了,分词完成!
虽然后续的程序中我不打算用到 词性,但是这里附上一张原论文中的对照表,供感兴趣的同学查看: