HanLP 2.x 的安装与使用
HanLP 的 1.x 和 2.x 及安装
HanLP 有两个版本,1.x 和 2.x
HanLP 1.x
1.x 是基于 java 的,底层是传统的 NLP 方法,提供 python 接口,可以通过 pyhanlp 来调用 HanLP。2014年发布,至今依然在维护。
HanLP 1.x 的安装
从本质上来说,HanLP 1.x 是个 java 包,所以需要(1)先安装 java;(2)将java 添加到环境变量;(3)安装 python 的 pyhanlp 包;(4)在 python 中通过 pyhanlp 来调用 HanLP
# HanLP 1.x python 版的安装语句:pip install pyhanlp
具体安装教程,参考blog.csdn.net/Sun_Weiss/article/details/106956111?spm=1001.2014.3001.5501
底层的 NLP 原理,可以阅读 HanLP 作者何晗的书《自然语言处理入门》
参考:
Hanlp、pyhanlp 的区别是什么? - 综合讨论 - HanLP中文社区
HanLP 2.x
2.x 是基于 python 的,底层是机器学习方法,直接在 python 中安装和调用 hanlp 即可。2020年发布,和 1.x 完全是两个包了。
HanLP 2.x 的安装
官方建议安装在线 API 版,体积小,易使用,官方教程也比较完善。但是还得申请 API 密钥,且有调用额度限制,也挺麻烦。
安装 | 在线演示
所以还是打算安装本地版。
由于 HanLP 2.x 底层是机器学习方法,所以要依赖 Tensorflow 和 PyTorch 包。但最坑的地方在于,HanLP 2.x 对于 Tensorflow 和 PyTorch 的版本有严格的要求,如果自行安装了 Tensorflow 和 PyTorch ,很可能会和 HanLP 2.x 有兼容性冲突,导致各种报错。
所以本地版的安装建议是:
(1)如果可能,最好给 HanLP 2.x 一个独立的 Python 环境,和你的机器学习环境隔离开来
(2)如果做不到,最好先卸载自己已经安装的 Tensorflow ,在安装 HanLP 2.x 的时候,它会自己安装版本合适的 Tensorflow
# 卸载 Tensorflowpip uninstall tensorflow
(3)安装 HanLP 2.x 本地版时,务必安装完整版——精简版会各种报错,很难解决。
# HanLP 2.x 本地完整版的安装语句:pip install hanlp[full]
HanLP 2.x 的使用
安装完之后,可以开始使用 hanlp 了
HanLP 2.x 支持十几种不同的自然语言处理任务,具体的可以参考官方文档:hankcs/HanLP: 中文分词 词性标注 命名实体识别 依存句法分析 成分句法分析 语义依存分析 语义角色标注 指代消解 风格转换 语义相似度 新词发现 关键词短语提取 自动摘要 文本分类聚类 拼音简繁转换 自然语言处理
功能 | RESTful | 多任务 | 单任务 | 模型 | 标注标准 |
分词 | 教程 | 教程 | 教程 | tok | 粗分、细分 |
词性标注 | 教程 | 教程 | 教程 | pos | CTB、PKU、863 |
命名实体识别 | 教程 | 教程 | 教程 | ner | PKU、MSRA、OntoNotes |
依存句法分析 | 教程 | 教程 | 教程 | dep | SD、UD、PMT |
成分句法分析 | 教程 | 教程 | 教程 | con | Chinese Tree Bank |
语义依存分析 | 教程 | 教程 | 教程 | sdp | CSDP |
语义角色标注 | 教程 | 教程 | 教程 | srl | Chinese Proposition Bank |
抽象意义表示 | 教程 | 暂无 | 教程 | amr | CAMR |
指代消解 | 教程 | 暂无 | 暂无 | 暂无 | OntoNotes |
语义文本相似度 | 教程 | 暂无 | 教程 | sts | 暂无 |
文本风格转换 | 教程 | 暂无 | 暂无 | 暂无 | 暂无 |
关键词短语提取 | 教程 | 暂无 | 暂无 | 暂无 | 暂无 |
抽取式自动摘要 | 教程 | 暂无 | 暂无 | 暂无 | 暂无 |
生成式自动摘要 | 教程 | 暂无 | 暂无 | 暂无 | 暂无 |
文本语法纠错 | 教程 | 暂无 | 暂无 | 暂无 | 暂无 |
文本分类 | 教程 | 暂无 | 暂无 | 暂无 | 暂无 |
情感分析 | 教程 | 暂无 | 暂无 | 暂无 | [-1,+1] |
语种检测 | 教程 | 暂无 | 教程 | 暂无 | ISO 639-1编码 |
这里只讨论一些最常用的任务。
在 HanLP 2.x 中,基本是使用缩写来指代相应的任务模块,如 tok 是分词,ner 是命名实体识别。
任务 | 英文 | 缩写 | 说明 |
分词 | Tokenization | tok | 将一段文本分割成较小的单位,通常是词语或子词 |
词性标注 | Part-of-Speech Tagging | pos | 为文本中每个词语分配一个对应的词性标签(如名词、动词、形容词等) |
命名实体识别 | Named Entity Recognition | ner | 从文本中识别出具有特定意义的实体(如人名、地名、机构名、日期、时间等) |
依存句法分析 | Dependency Parsing | dep | 分析句子中词与词之间的依存关系 |
前面提到,HanLP 2.x 的底层是机器学习方法,基本每一种具体的方法,都有对应的训练数据集和机器学习模型。
同样的一句话,同样的任务,基于不同的训练集和模型,得到的结果很可能是不一样的。
而每个训练集和模型,都有不同的特点,适用于不同的任务,可以根据自己的需要选择。
预训练好的模型,都在 hanlp.pretrained 这个包中,按照NLP任务(tok, pos, ner 等)归类。
以一个分词任务为例:
# 导入 hanlp
import hanlp
# 查看所有预训练好的 XX 模型有哪些
# hanlp.pretrained.NPL任务缩写.ALL
print(hanlp.pretrained.tok.ALL)
# 加载模型,第一次加载时,模型需要下载,不同模型的体积不一样;之后再调用就不需要下载了
# 模型实例化变量名 = hanlp.load(hanlp.pretrained.NLP任务缩写.模型名称)
tok = hanlp.load(hanlp.pretrained.tok.COARSE_ELECTRA_SMALL_ZH)
# 也可以直接加载模型
# 模型实例化变量名 = hanlp.load('模型名称')
tok = hanlp.load('COARSE_ELECTRA_SMALL_ZH')
# 文本
text_list = ['2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。']
# 使用分词模型进行分词
tok_result = tok(text_list)
print(tok_result)
输出的结果:
Output:
[['2021年', 'HanLPv2.1', '为', '生产', '环境', '带来', '次世代', '最', '先进', '的', '多', '语种', 'NLP', '技术', '。']]
注意:
由于 HanLP 2.x 提供的模型中,BERT、ELECTRA、ALBERT 等大型模型,都依赖于 PyTorch 和 GPU,所以如果你的电脑上没有 NVIDIA 显卡,或者有显卡,但是显卡驱动,cuda,cudnn,TensorFlow版本有问题,导致GPU没有被调用(Hanlp 需要配置启用 GPU 吗? - HanLP - Butterfly Effect),都会报错,报错信息通常显示为:
AttributeError: module 'keras._tf_keras.keras.layers' has no attribute 'AbstractRNNCell'
这种情况下,只有 SMALL 模型和部分BASE模型能加载调用成功。
有显卡,要安装 PyTorch 和 cuda 可参考:hanlp安装指南_hanlp 安装教程-CSDN博客
接下来具体讲一下每一种任务在 HanLP 中怎么实现
分词任务
HanLP 2.x 提供了两种粒度的分词:
分词粒度 | 依赖的训练集 | 适用场景 |
coarse | The Segmentation Guidelines for the Penn Chinese Treebank (3.0) — HanLP Documentation | 粗粒度分词,通常用于词语切分 |
fine | 微软《中文文本标注规范(5.0 版)》 MSR中文文本标注规范 (5.0 版) — HanLP Documentation | 细粒度分词,可能会处理子词级别的分词 |
代码示例:
# 导入 hanlp
import hanlp
# 查看所有预训练好的分词模型有哪些
print(hanlp.pretrained.tok.ALL)
# 加载对应的分词模型
# tok = hanlp.load(hanlp.pretrained.tok.分词模型的名字)
tok = hanlp.load(hanlp.pretrained.tok.FINE_ELECTRA_SMALL_ZH)
# 输入为句子的列表
text_list = ['2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。']
# 使用分词模型进行分词
tok_result = tok(text_list)
print(tok_result)
输出结果:
Output:
[['2021年', 'HanLPv2.1', '为', '生产', '环境', '带来', '次', '世代', '最', '先进', '的', '多', '语种', 'NLP', '技术', '。']]
分词任务的模型:
模型 | 模型包链接 | 模型包体积 |
LARGE_ALBERT_BASE | https://file.hankcs.com/hanlp/tok/large_corpus_cws_albert_base_20211228_160926.zip | |
COARSE_ELECTRA_SMALL_ZH | https://file.hankcs.com/hanlp/tok/coarse_electra_small_20220616_012050.zip | 43.5M |
FINE_ELECTRA_SMALL_ZH | https://file.hankcs.com/hanlp/tok/fine_electra_small_20220615_231803.zip | 43.5M |
SIGHAN2005_MSR_CONVSEG | https://file.hankcs.com/hanlp/tok/convseg-msr-nocrf-noembed_20200110_153524.zip | |
MSR_TOK_ELECTRA_BASE_CRF | http://download.hanlp.com/tok/extra/msra_crf_electra_base_20220507_113936.zip | |
SIGHAN2005_PKU_CONVSEG | https://file.hankcs.com/hanlp/tok/sighan2005-pku-convseg_20200110_153722.zip | |
PKU_NAME_MERGED_SIX_MONTHS_CONVSEG | https://file.hankcs.com/hanlp/tok/pku98_6m_conv_ngram_20200110_134736.zip | |
SIGHAN2005_PKU_BERT_BASE_ZH | https://file.hankcs.com/hanlp/tok/sighan2005_pku_bert_base_zh_20201231_141130.zip | |
CTB6_CONVSEG | https://file.hankcs.com/hanlp/tok/ctb6_convseg_nowe_nocrf_20200110_004046.zip | |
CTB9_TOK_ELECTRA_SMALL | https://file.hankcs.com/hanlp/tok/ctb9_electra_small_20220215_205427.zip | |
CTB9_TOK_ELECTRA_BASE | http://download.hanlp.com/tok/extra/ctb9_tok_electra_base_20220426_111949.zip | |
CTB9_TOK_ELECTRA_BASE_CRF | http://download.hanlp.com/tok/extra/ctb9_tok_electra_base_crf_20220426_161255.zip | |
UD_TOK_MMINILMV2L6 | https://file.hankcs.com/hanlp/tok/ud_tok_mMiniLMv2L6_no_space_mul_20220619_091824.zip | |
UD_TOK_MMINILMV2L12 | https://file.hankcs.com/hanlp/tok/ud_tok_mMiniLMv2L12_no_space_mul_20220619_091159.zip |
加载自定义词典
分词任务中,常见的需求是加载用户的自定义词典,HanLP 2.x 提供了两种自定义词典的加载方法:强制和合并。
简单地来说,强制模式的优先级高于分词方法背后的统计模型,会无视上下文,强制将匹配词典中词的字符串分为一个词语,这往往会导致错误的分词结果,通常不推荐使用;
而合并模式的优先级低于统计模型,分词的时候在上下文的基础上合并匹配到的词,分词的结果更合理,通常推荐使用合并模式。
自定义词典的格式为集合。
代码示例:
# 导入 hanlp
import hanlp
# 加载对应的分词模型
# tok = hanlp.load(hanlp.pretrained.tok.分词模型的名字)
tok = hanlp.load(hanlp.pretrained.tok.COARSE_ELECTRA_SMALL_ZH)user_dict = {'川普', '美国总统'}
# 强制模式加载自定义词典,词典的格式为集合,一般不建议使用强制模式,会造成错分
# tok.dict_force = user_dict
# 合并模式加载自定义词典,词典的格式为集合,推荐使用合并模式
tok.dict_combine = user_dict
# 输入为句子的列表
text_list = ["首相和川普通电话,川普是美国总统。", "银川普通人与川普通电话讲四川普通话,川普是美国总统。", "美国总统筹部部长是谁?"]
tok_result = tok(text_list)
print(tok_result)
词性标注任务
HanLP 2.x 提供了三个不同的词性标注标准:
词性标注 | 依赖的训练集 | 词性标签 | 适用场景 |
CTB | CTB(Chinese Treebank)标准,由宾夕法尼亚大学的语言学家构建,不仅提供了词性标注,还包括句法分析的树结构。 | ctb — HanLP Documentation 37种词性标签,如:NN(名词),VV(动词),AD(副词) | 细粒度标注,包含大量的词性细分,适用于句法分析。 |
PKU | PKU (Peking University)标准,由北京大学自然语言处理与社会人文学科研究中心提出。相较于CTB,它更注重基础的语法类别。 | pku — HanLP Documentation 43种词性标签,如:N(名词),V(动词),A(形容词) | 较为简洁,主要覆盖常见的词性类别,但对细分类别的标注较少,适用于处理大规模中文文本。 |
863 | 863 (Chinese 863 Standard)标准,由中国科学技术部提出,标签集较为紧凑 | 863 — HanLP Documentation 34种词性标签,如:n(名词),v(动词),a(形容词) | 较为简洁的标签集,常用于基础词性标注任务。 |
代码示例:
# 导入 hanlp
import hanlp
# 查看所有预训练好的词性标注模型有哪些
print(hanlp.pretrained.pos.ALL)
# 加载对应的词性标注模型
# pos = hanlp.load(hanlp.pretrained.pos.词性标注模型的名字)
pos = hanlp.load(hanlp.pretrained.pos.PKU_POS_ELECTRA_SMALL)
# 输入为已分词的句子(词列表)
words_list = ["阿婆主", "来到", "北京", "立方庭", "参观", "自然", "语义", "科技", "公司", "。"]
# 使用词性标注模型对列表种词的词性标注
pos_result = pos(words_list)
print(pos_result)
输出结果:
Output:
['n', 'v', 'ns', 'nz', 'v', 'n', 'n', 'n', 'n', 'w']
词性标注任务的模型:
模型 | 模型包链接 | 模型包体积 |
CTB5_POS_RNN | https://file.hankcs.com/hanlp/pos/ctb5_pos_rnn_20200113_235925.zip | |
CTB5_POS_RNN_FASTTEXT_ZH | https://file.hankcs.com/hanlp/pos/ctb5_pos_rnn_fasttext_20191230_202639.zip | |
CTB9_POS_ALBERT_BASE | https://file.hankcs.com/hanlp/pos/ctb9_albert_base_20211228_163935.zip | |
CTB9_POS_ELECTRA_SMALL_TF | https://file.hankcs.com/hanlp/pos/pos_ctb_electra_small_20211227_121341.zip | |
CTB9_POS_ELECTRA_SMALL | https://file.hankcs.com/hanlp/pos/pos_ctb_electra_small_20220215_111944.zip | |
CTB9_POS_RADICAL_ELECTRA_SMALL | https://file.hankcs.com/hanlp/pos/pos_ctb_radical_electra_small_20220215_111932.zip | |
C863_POS_ELECTRA_SMALL | https://file.hankcs.com/hanlp/pos/pos_863_electra_small_20220217_101958.zip | |
PKU_POS_ELECTRA_SMALL | https://file.hankcs.com/hanlp/pos/pos_pku_electra_small_20220217_142436.zip | |
PTB_POS_RNN_FASTTEXT_EN | https://file.hankcs.com/hanlp/pos/ptb_pos_rnn_fasttext_20220418_101708.zip |
命名实体识别任务
代码示例:
# 导入 hanlp
import hanlp
# 查看所有预训练好的命名实体识别模型有哪些
print(hanlp.pretrained.ner.ALL)
# 加载对应的命名实体识别模型
# ner = hanlp.load(hanlp.pretrained.ner.命名实体识别模型的名字
ner = hanlp.load(hanlp.pretrained.ner.MSRA_NER_ELECTRA_SMALL_ZH)
# 输入为已分词的句子(词列表)
words_list = ['上海', '华安', '工业', '(', '集团', ')', '公司', '董事长', '谭旭光', '和', '秘书', '张晚霞', '来到', '美国', '纽约', '现代', '艺术', '博物馆', '参观', '。']
# 使用命名实体识别模型识别
ner_result = ner(words_list)
print(ner_result)
输出结果:
Output:
[('上海华安工业(集团)公司', 'ORGANIZATION', 0, 7), ('谭旭光', 'PERSON', 8, 9), ('张晚霞', 'PERSON', 11, 12), ('美国', 'LOCATION', 13, 14), ('纽约现代艺术博物馆', 'LOCATION', 14, 18)]
命名实体识别任务的模型:
模型 | 模型包链接 | 模型包体积 |
MSRA_NER_BERT_BASE_ZH | https://file.hankcs.com/hanlp/ner/ner_bert_base_msra_20211227_114712.zip | |
MSRA_NER_ALBERT_BASE_ZH | https://file.hankcs.com/hanlp/ner/msra_ner_albert_base_20211228_173323.zip | |
MSRA_NER_ELECTRA_SMALL_ZH | https://file.hankcs.com/hanlp/ner/msra_ner_electra_small_20220215_205503.zip | 45M |
CONLL03_NER_BERT_BASE_CASED_EN | https://file.hankcs.com/hanlp/ner/ner_conll03_bert_base_cased_en_20211227_121443.zip |
依存句法分析任务
HanLP 2.x 提供了三个不同的依存语法标注标准:
依存语法标注 | 依赖的训练集 | 适用场景 |
SD | SD (Standard Dependency) 标准依存句法分析 Stanford Dependencies Chinese — HanLP Documentation | 适用于中文句法分析 |
UD | UD (Universal Dependencies)通用依存句法标注,是一种跨语言的依存句法框架 Stanford Dependencies Chinese — HanLP Documentation | 适用于跨语言句法分析、多语言处理 |
PMT | PMT (PKU Model) 是基于北京大学数据集训练的中文依存句法分析模型 Stanford Dependencies Chinese — HanLP Documentation | 适用于高精度中文依存句法分析 |
代码示例:
# 导入 hanlp
import hanlp
# 查看所有预训练好的依存句法分析模型有哪些
print(hanlp.pretrained.dep.ALL)
# 加载对应的依存句法分析模型
# dep = hanlp.load(hanlp.pretrained.dep.依存句法分析模型的名字
dep = hanlp.load(hanlp.pretrained.dep.CTB9_DEP_ELECTRA_SMALL)
# 输入为已完成分词的一个或多个句子(词列表)
words_list = ["阿婆主", "来到", "北京", "立方庭", "参观", "自然", "语义", "科技", "公司", "。"]
# 使用依存句法分析模型
# 打印时为CoNLL格式
dep_result = dep(words_list)
# 如果不需要CoNLL格式的话,conll=False时的输出更加简洁
dep_result = dep(words_list, conll=False)
print(dep_result)
输出结果:
Output:
[(2, 'nsubj'), (0, 'root'), (4, 'nn'), (2, 'dobj'), (2, 'conj'), (9, 'nn'), (9, 'nn'), (9, 'nn'), (5, 'dobj'), (2, 'punct')]
依存句法分析任务的模型:
模型 | 模型包链接 | 模型包体积 |
CTB5_BIAFFINE_DEP_ZH | https://file.hankcs.com/hanlp/dep/biaffine_ctb5_20191229_025833.zip | |
CTB7_BIAFFINE_DEP_ZH | https://file.hankcs.com/hanlp/dep/biaffine_ctb7_20200109_022431.zip | |
CTB9_DEP_ELECTRA_SMALL | https://file.hankcs.com/hanlp/dep/ctb9_dep_electra_small_20220216_100306.zip | 47.2M |
PMT1_DEP_ELECTRA_SMALL | https://file.hankcs.com/hanlp/dep/pmt_dep_electra_small_20220218_134518.zip | |
CTB9_UDC_ELECTRA_SMALL | https://file.hankcs.com/hanlp/dep/udc_dep_electra_small_20220218_095452.zip | |
PTB_BIAFFINE_DEP_EN | https://file.hankcs.com/hanlp/dep/ptb_dep_biaffine_20200101_174624.zip |
多任务模型
上面这些介绍,执行的都是单个任务。而在实际的应用中,我们往往需要把这些任务结合起来,对原始的文本先分词,再把分词的结果输出给词性标注或实体词识别的模型。
那除了自己一步一步写代码把这些任务的输入输出结合起来,有没有什么方法能更简单地一次完成多个任务步骤呢?
HanLP 2.x 提供了多任务模型和单任务模型流水线两种方式来同时完成多个任务。
多任务模型
先说多任务模型,和其他的单任务模型类似,多任务模型也在 hanlp.pretrained.mtl 这个模块下
代码示例:
# 导入 hanlp
import hanlp
# 查看所有预训练好的多任务模型有哪些
print(hanlp.pretrained.mtl.ALL)
# 加载对应的多任务模型
# mtl = hanlp.load(hanlp.pretrained.dep.多任务模型的名字
mtl = hanlp.load(hanlp.pretrained.mtl.OPEN_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_BASE_ZH)
# 输入为句子列表
text_list = ['2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。']
# 查看多任务模型支持的任务有哪些
print(dir(hanlp.components.mtl.tasks))
# 指定多任务模型执行的任务
tasks_list = ['tok', 'sdp', 'pos', 'ner']
# 使用多任务模型
# 不指定 tasks_list,默认会输出所有任务的结果
mtl_result = mtl(text_list)
# 指定 tasks_list,则仅执行 tasks_list 中列出的任务
# 比如 tasks_list = ['tok'],则仅执行分词任务
mtl_result = mtl(text_list, tasks = tasks_list)
print(mtl_result)
# 输出视觉美化后的语言结构
# 依赖于 HTML 显示,在 jupyter 中可以很好地展示出来
mtl(text_list).pretty_print()
输出结果:
Output:
{"tok": [["2021年", "HanLPv2.1", "为", "生产", "环境", "带来", "次世代", "最", "先进", "的", "多", "语种", "NLP", "技术", "。"]],"pos": [["NT", "NR", "P", "NN", "NN", "VV", "NN", "AD", "VA", "DEC", "CD", "NN", "NN", "NN", "PU"]],"ner": [[["2021年", "DATE", 0, 1]]],"sdp": [[[[6, "Time"]], [[6, "Agt"]], [[5, "mPrep"]], [[5, "Desc"]], [[6, "Datv"]], [[4, "mRang"]], [[9, "Time"]], [[9, "mDegr"]], [[14, "Desc"]], [[9, "mAux"]], [[12, "Quan"]], [[14, "Desc"]], [[14, "Desc"]], [[6, "Cont"]], [[0, "Root"], [6, "mPunc"]]]]
}
多任务模型:
模型 | 模型包链接 |
OPEN_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH | https://file.hankcs.com/hanlp/mtl/open_tok_pos_ner_srl_dep_sdp_con_electra_small_20201223_035557.zip |
OPEN_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_BASE_ZH | https://file.hankcs.com/hanlp/mtl/open_tok_pos_ner_srl_dep_sdp_con_electra_base_20201223_201906.zip |
CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH | https://file.hankcs.com/hanlp/mtl/close_tok_pos_ner_srl_dep_sdp_con_electra_small_20210111_124159.zip |
CLOSE_TOK_POS_NER_SRL_UDEP_SDP_CON_ELECTRA_SMALL_ZH | https://file.hankcs.com/hanlp/mtl/close_tok_pos_ner_srl_dep_sdp_con_electra_small_20220626_175100.zip |
CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_BASE_ZH | https://file.hankcs.com/hanlp/mtl/close_tok_pos_ner_srl_dep_sdp_con_electra_base_20210111_124519.zip |
CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ERNIE_GRAM_ZH | https://file.hankcs.com/hanlp/mtl/close_tok_pos_ner_srl_dep_sdp_con_ernie_gram_base_aug_20210904_145403.zip |
UD_ONTONOTES_TOK_POS_LEM_FEA_NER_SRL_DEP_SDP_CON_MMINILMV2L6 | https://file.hankcs.com/hanlp/mtl/ud_ontonotes_tok_pos_lem_fea_ner_srl_dep_sdp_con_mMiniLMv2L6_no_space_20220731_161526.zip |
UD_ONTONOTES_TOK_POS_LEM_FEA_NER_SRL_DEP_SDP_CON_MMINILMV2L12 | https://file.hankcs.com/hanlp/mtl/ud_ontonotes_tok_pos_lem_fea_ner_srl_dep_sdp_con_mMiniLMv2L12_no_space_20220807_133143.zip |
UD_ONTONOTES_TOK_POS_LEM_FEA_NER_SRL_DEP_SDP_CON_XLMR_BASE | https://file.hankcs.com/hanlp/mtl/ud_ontonotes_tok_pos_lem_fea_ner_srl_dep_sdp_con_xlm_base_20220608_003435.zip |
NPCMJ_UD_KYOTO_TOK_POS_CON_BERT_BASE_CHAR_JA | https://file.hankcs.com/hanlp/mtl/npcmj_ud_kyoto_tok_pos_ner_dep_con_srl_bert_base_char_ja_20210914_133742.zip |
单任务流水线
多任务模型的优势在于速度,但精度不如单任务模型。
如果对精度要求高,又需要同时执行多个任务,则可以用流水线模式将单任务模型组装起来:
代码示例:
# 导入 hanlp
import hanlp
# 构建流水线,将单任务模型组装起来
pipline = hanlp.pipeline() \.append(hanlp.utils.rules.split_sentence, output_key='sentences') \.append(hanlp.load('FINE_ELECTRA_SMALL_ZH'), output_key='tok') \.append(hanlp.load('CTB9_POS_ELECTRA_SMALL'), output_key='pos') \.append(hanlp.load('MSRA_NER_ELECTRA_SMALL_ZH'), output_key='ner', input_key='tok') \.append(hanlp.load('CTB9_DEP_ELECTRA_SMALL', conll=0), output_key='dep', input_key='tok')\.append(hanlp.load('CTB9_CON_ELECTRA_SMALL'), output_key='con', input_key='tok')
# 输入为字符串
text_str = '2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。'
# 使用流水线
pipline_result = pipline(text_str)
print(pipline_result)
# 输出视觉美化后的语言结构
# 依赖于 HTML 显示,在 jupyter 中可以很好地展示出来
pipline(text_str).pretty_print()
输出结果:
Output:
{"sentences": ["2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。"],"tok": [["2021年", "HanLPv2.1", "为", "生产", "环境", "带来", "次", "世代", "最", "先进", "的", "多", "语种", "NLP", "技术", "。"]],"pos": [["NT", "NR", "P", "NN", "NN", "VV", "JJ", "NN", "AD", "VA", "DEC", "CD", "NN", "NR", "NN", "PU"]],"ner": [[["2021年", "DATE", 0, 1]]],"dep": [[[6, "tmod"], [6, "nsubj"], [6, "prep"], [5, "nn"], [3, "pobj"], [0, "root"], [8, "det"], [15, "nn"], [10, "advmod"], [15, "rcmod"], [10, "cpm"], [13, "nummod"], [15, "nn"], [15, "nn"], [6, "dobj"], [6, "punct"]]],"con": [["TOP", [["IP", [["NP", [["_", ["2021年"]]]], ["NP", [["_", ["HanLPv2.1"]]]], ["VP", [["PP", [["_", ["为"]], ["NP", [["_", ["生产"]], ["_", ["环境"]]]]]], ["VP", [["_", ["带来"]], ["NP", [["CP", [["CP", [["IP", [["VP", [["NP", [["DP", [["_", ["次"]]]], ["NP", [["_", ["世代"]]]]]], ["ADVP", [["_", ["最"]]]], ["VP", [["_", ["先进"]]]]]]]], ["_", ["的"]]]]]], ["NP", [["ADJP", [["_", ["多"]]]], ["NP", [["_", ["语种"]]]]]], ["NP", [["_", ["NLP"]], ["_", ["技术"]]]]]]]]]], ["_", ["。"]]]]]]]
}
语义文本相似度
代码示例:
# 导入 hanlp
import hanlp
# 查看所有预训练好的语义文本相似度模型有哪些
print(hanlp.pretrained.sts.ALL)
# 加载对应的语义文本相似度模型
# sts = hanlp.load(hanlp.pretrained.dep.语义文本相似度模型的名字
sts = hanlp.load(hanlp.pretrained.sts.STS_ELECTRA_BASE_ZH)
# 输入为两段短文本组成的二元组列表
text_couple_list = [('看图猜一电影名', '看图猜电影'),('无线路由器怎么无线上网', '无线上网卡和无线路由器怎么用'),('北京到上海的动车票', '上海到北京的动车票')]
# 使用语义文本相似度模型
sts_result = sts(text_couple_list)
print(sts_result)
输出结果:
Output:
[0.9764468669891357, 0.0, 0.0034587085247039795]
语义文本相似度模型:
模型 | 模型包链接 | 模型包体积 |
STS_ELECTRA_BASE_ZH | https://file.hankcs.com/hanlp/sts/sts_electra_base_zh_20210530_200109.zip | 362M |