赞
踩
HanLP: Han Language Processing
面向生产环境的多语种自然语言处理工具包,基于 TensorFlow 2.x,目标是普及落地最前沿的NLP技术。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。目前,基于深度学习的HanLP 2.0正处于alpha测试阶段,将综合这一年来大家的批评建议,于年底发布2.1版。Java用户请使用1.x分支 ,经典稳定,永久维护。RESTful API已经上线,2.x正式版将支持包括Java、Python在内的开发语言。
GitHub仅在周末处理格式严谨的bug,深恐招待不周,提问请上蝴蝶效应互帮互助。
安装
pip install hanlp
要求Python 3.6以上,支持Windows,可以在CPU上运行,推荐GPU/TPU。
快速上手
分词(中文分词、中文斷詞、英文分词、任意语种分词)
作为终端用户,第一步需要从磁盘或网络加载预训练模型。比如,此处用两行代码加载一个名为 LARGE_ALBERT_BASE 的分词模型。
>>> import hanlp
>>> tokenizer = hanlp.load('LARGE_ALBERT_BASE')
HanLP 会自动将 LARGE_ALBERT_BASE 解析为一个URL,然后自动下载并解压。由于巨大的用户量,万一下载失败请使用国内镜像或参考提示手动下载。
一旦模型下载完毕,即可将tokenizer当成一个函数调用:
>>> tokenizer('商品和服务')
['商品', '和', '服务']
如果你要处理英文,一个基于规则的普通函数应该足够了。
>>> tokenizer = hanlp.utils.rules.tokenize_english
>>> tokenizer("Don't go gentle into that good night.")
['Do', "n't", 'go', 'gentle', 'into', 'that', 'good', 'night', '.']
并行
好消息,你可以运行得更快。在深度学习的时代,批处理最高带来batch_size的加速比。你可以并行切分多个句子,代价是消耗更多GPU显存。
>>> tokenizer(['萨哈夫说,伊拉克将同联合国销毁伊拉克大规模杀伤性武器特别委员会继续保持合作。',
'上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美国纽约现代艺术博物馆参观。',
'HanLP支援臺灣正體、香港繁體,具有新詞辨識能力的中文斷詞系統'])
[['萨哈夫', '说', ',', '伊拉克', '将', '同', '联合国', '销毁', '伊拉克', '大', '规模', '杀伤性', '武器', '特别', '委员会', '继续', '保持', '合作', '。'],
['上海', '华安', '工业', '(', '集团', ')', '公司', '董事长', '谭旭光', '和', '秘书', '张晚霞', '来到', '美国', '纽约', '现代', '艺术', '博物馆', '参观', '。'],
['HanLP', '支援', '臺灣', '正體', '、', '香港', '繁體', ',', '具有', '新詞', '辨識', '能力', '的', '中文', '斷詞', '系統']]
就是如此简单,你现在已经能够将HanLP提供的最新的深度学习模型应用到你的研究和工作中了。下面是一些小技巧:
打印 hanlp.pretrained.ALL 来列出HanLP中的所有预训练模型。比如,LARGE_ALBERT_BASE是在世界上最大的1亿字语料库LARGE上训练的ALBERT_BASE分词模型,比PKU*系列模型有质的提升。
参考demo挂载用户词典,或嵌入正则表达式来应对你的业务逻辑。
使用 hanlp.pretrained.* 来分门别类地浏览预训练模型,你还可以通过变量来加载模型。
>>> hanlp.pretrained.cws.LARGE_ALBERT_BASE
'https://file.hankcs.com/hanlp/cws/large_cws_albert_base_20200828_011451.zip'
词性标注
词性标注器的输入是单词,输出是每个单词的词性标签。
>>> tagger = hanlp.load(hanlp.pretrained.pos.PTB_POS_RNN_FASTTEXT_EN)
>>> tagger([['I', 'banked', '2', 'dollars', 'in', 'a', 'bank', '.'],
['Is', 'this', 'the', 'future', 'of', 'chamber', 'music', '?']])
[['PRP', 'VBD', 'CD', 'NNS', 'IN', 'DT', 'NN', '.'],
['VBZ', 'DT', 'DT', 'NN', 'IN', 'NN', 'NN', '.']]
词性标注同样支持多语种,取决于你加载的是哪个模型(注意变量名后面的EN)。
>>> tagger = hanlp.load(hanlp.pretrained.pos.CTB9_POS_ALBERT_BASE)
>>> tagger(['我', '的', '希望', '是', '希望', '世界', '和平'])
['PN', 'DEG', 'NN', 'VC', 'VV', 'NN', 'NN']
注意到句子中两个 希望的词性各不相同,第一个是名词而第二个是动词。关于词性标签,请参考CTB标记规范,或等待正式文档。这个标注器使用了fasttext[^fasttext] 或ALBERT作为嵌入层,所以免疫于OOV。
命名实体识别
命名实体识别模块的输入是单词列表,输出是命名实体的边界和类别。
>>> recognizer = hanlp.load(hanlp.pretrained.ner.CONLL03_NER_BERT_BASE_UNCASED_EN)
>>> recognizer(["President", "Obama", "is", "speaking", "at", "the", "White", "House"])
[('Obama', 'PER', 1, 2), ('White House', 'LOC', 6, 8)]
中文命名实体识别是字符级模型,所以不要忘了用 list将字符串转换为字符列表。至于输出,格式为 (e
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。