目录
简介
轻量级RESTful API
海量级native API
多任务模型
自定义任务
删除任务
自定义字典
单任务模型
自定义词典
流水线组合
https://github.com/hankcs/HanLP
HanLP: Han Language Processing — HanLP Documentation
面向生产环境的多语种自然语言处理工具包,基于PyTorch和TensorFlow 2.x双引擎,目标是普及落地最前沿的NLP技术。HanLP具备功能完善、精度准确、性能高效、语料时新、架构清晰、可自定义的特点。
支持python、java、GO语言。
借助世界上最大的多语种语料库,HanLP2.1支持包括简繁中英日俄法德在内的104种语言上的10种联合任务以及多种单任务。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 | 暂无 |
文本风格转换 | 教程 | 暂无 | 暂无 | 暂无 | 暂无 |
仅数KB,适合敏捷开发、移动APP等场景。简单易用,无需GPU配环境,秒速安装,强烈推荐。服务器GPU算力有限,匿名用户配额较少,建议申请免费公益API秘钥auth。
Python
pip install hanlp_restful
创建客户端,填入服务器地址和秘钥:
from hanlp_restful import HanLPClient
HanLP = HanLPClient('https://www.hanlp.com/api', auth=None, language='zh') # auth不填则匿名,zh中文,mul多语种
无论何种开发语言,调用parse
接口,传入一篇文章,得到HanLP精准的分析结果。
doc = HanLP.parse("2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。阿婆主来到北京立方庭参观自然语义科技公司。")
print(doc)
'''
{
"tok/fine": [
["2021年", "HanLPv2.1", "为", "生产", "环境", "带来", "次世代", "最", "先进", "的", "多", "语种", "NLP", "技术"],
["阿婆主", "来到", "北京", "立方庭", "参观", "自然", "语义", "科技", "公司"]
],
"tok/coarse": [
["2021年", "HanLPv2.1", "为", "生产", "环境", "带来", "次世代", "最", "先进", "的", "多语种", "NLP", "技术"],
["阿婆主", "来到", "北京立方庭", "参观", "自然语义科技公司"]
],
"pos/ctb": [
["NT", "NR", "P", "NN", "NN", "VV", "NN", "AD", "VA", "DEC", "CD", "NN", "NR", "NN"],
["NN", "VV", "NR", "NR", "VV", "NN", "NN", "NN", "NN"]
],
"pos/pku": [
["t", "nx", "p", "vn", "n", "v", "n", "d", "a", "u", "a", "n", "nx", "n"],
["n", "v", "ns", "ns", "v", "n", "n", "n", "n"]
],
"pos/863": [
["nt", "w", "p", "v", "n", "v", "nt", "d", "a", "u", "a", "n", "ws", "n"],
["n", "v", "ns", "ni", "v", "n", "n", "n", "n"]
],
"ner/msra": [
[["2021年", "DATE", 0, 1], ["HanLPv2.1", "RATE", 1, 2]],
[["北京立方庭", "ORGANIZATION", 2, 4], ["自然语义科技公司", "ORGANIZATION", 5, 9]]
],
"ner/pku": [
[],
[["北京", "ns", 2, 3], ["立方庭", "ns", 3, 4]]
],
"ner/ontonotes": [
[["2021年", "DATE", 0, 1], ["HanLPv2.1", "CARDINAL", 1, 2]],
[["北京", "GPE", 2, 3], ["立方庭", "FAC", 3, 4], ["自然语义科技公司", "ORG", 5, 9]]
],
"srl": [
[[["2021年", "ARGM-TMP", 0, 1], ["HanLPv2.1", "ARG0", 1, 2], ["为生产环境", "ARG2", 2, 5], ["带来", "PRED", 5, 6], ["次世代最先进的多语种NLP技术", "ARG1", 6, 14]], [["次世代", "ARGM-TMP", 6, 7], ["最", "ARGM-ADV", 7, 8], ["先进", "PRED", 8, 9], ["技术", "ARG0", 13, 14]]],
[[["阿婆主", "ARG0", 0, 1], ["来到", "PRED", 1, 2], ["北京立方庭", "ARG1", 2, 4]], [["阿婆主", "ARG0", 0, 1], ["参观", "PRED", 4, 5], ["自然语义科技公司", "ARG1", 5, 9]]]
],
"dep": [
[[6, "tmod"], [6, "nsubj"], [6, "prep"], [5, "nn"], [3, "pobj"], [0, "root"], [9, "dep"], [9, "advmod"], [14, "rcmod"], [9, "cpm"], [12, "nummod"], [14, "nn"], [14, "nn"], [6, "dobj"]],
[[2, "nsubj"], [0, "root"], [4, "nn"], [2, "dobj"], [2, "conj"], [7, "nn"], [9, "nn"], [9, "nn"], [5, "dobj"]]
],
"sdp": [
[[[6, "Time"]], [[6, "Exp"]], [[5, "mPrep"]], [[5, "Desc"]], [[6, "Datv"]], [[0, "Root"]], [[9, "Time"]], [[9, "mDegr"]], [[14, "Desc"]], [[9, "mAux"]], [[12, "Quan"]], [[14, "Desc"]], [[14, "Nmod"]], [[6, "Pat"]]],
[[[2, "Agt"]], [[0, "Root"]], [[4, "Nmod"]], [[2, "Lfin"]], [[2, "ePurp"]], [[7, "Nmod"]], [[9, "Nmod"]], [[9, "Desc"]], [[5, "Cont"]]]
],
"con": [
["TOP", [["IP", [["NP", [["NT", ["2021年"]]]], ["NP", [["NR", ["HanLPv2.1"]]]], ["VP", [["PP", [["P", ["为"]], ["NP", [["NN", ["生产"]], ["NN", ["环境"]]]]]], ["VP", [["VV", ["带来"]], ["NP", [["NP", [["CP", [["CP", [["IP", [["VP", [["NP", [["NN", ["次世代"]]]], ["ADVP", [["AD", ["最"]]]], ["VP", [["VA", ["先进"]]]]]]]], ["DEC", ["的"]]]]]], ["NP", [["QP", [["CD", ["多"]]]], ["NP", [["NN", ["语种"]]]]]]]], ["NP", [["NR", ["NLP"]], ["NN", ["技术"]]]]]]]]]]]]]],
["TOP", [["IP", [["NP", [["NN", ["阿婆主"]]]], ["VP", [["VP", [["VV", ["来到"]], ["NP", [["NR", ["北京"]], ["NR", ["立方庭"]]]]]], ["VP", [["VV", ["参观"]], ["NP", [["NN", ["自然"]], ["NN", ["语义"]], ["NP", [["NN", ["科技"]], ["NN", ["公司"]]]]]]]]]]]]]]
]
}
'''
pip install hanlp
HanLP发布的模型分为多任务和单任务两种,多任务速度快省显存,单任务精度高更灵活。
HanLP的工作流程为加载模型然后将其当作函数调用,例如下列联合多任务模型:
import hanlp
HanLP = hanlp.load(hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH) # 世界最大中文语料库
doc= HanLP(['2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。', '阿婆主来到北京立方庭参观自然语义科技公司。'])
print(doc)
'''
{
"tok/fine": [
["2021年", "HanLPv2.1", "为", "生产", "环境", "带来", "次世代", "最", "先进", "的", "多", "语种", "NLP", "技术"],
["阿婆主", "来到", "北京", "立方庭", "参观", "自然", "语义", "科技", "公司"]
],
"tok/coarse": [
["2021年", "HanLPv2.1", "为", "生产", "环境", "带来", "次世代", "最", "先进", "的", "多语种", "NLP", "技术"],
["阿婆主", "来到", "北京立方庭", "参观", "自然语义科技公司"]
],
"pos/ctb": [
["NT", "NR", "P", "NN", "NN", "VV", "NN", "AD", "VA", "DEC", "CD", "NN", "NR", "NN"],
["NN", "VV", "NR", "NR", "VV", "NN", "NN", "NN", "NN"]
],
"pos/pku": [
["t", "nx", "p", "vn", "n", "v", "n", "d", "a", "u", "a", "n", "nx", "n"],
["n", "v", "ns", "ns", "v", "n", "n", "n", "n"]
],
"pos/863": [
["nt", "w", "p", "v", "n", "v", "nt", "d", "a", "u", "a", "n", "ws", "n"],
["n", "v", "ns", "ni", "v", "n", "n", "n", "n"]
],
"ner/msra": [
[["2021年", "DATE", 0, 1], ["HanLPv2.1", "RATE", 1, 2]],
[["北京立方庭", "ORGANIZATION", 2, 4], ["自然语义科技公司", "ORGANIZATION", 5, 9]]
],
"ner/pku": [
[],
[["北京", "ns", 2, 3], ["立方庭", "ns", 3, 4]]
],
"ner/ontonotes": [
[["2021年", "DATE", 0, 1], ["HanLPv2.1", "CARDINAL", 1, 2]],
[["北京", "GPE", 2, 3], ["立方庭", "FAC", 3, 4], ["自然语义科技公司", "ORG", 5, 9]]
],
"srl": [
[[["2021年", "ARGM-TMP", 0, 1], ["HanLPv2.1", "ARG0", 1, 2], ["为生产环境", "ARG2", 2, 5], ["带来", "PRED", 5, 6], ["次世代最先进的多语种NLP技术", "ARG1", 6, 14]], [["次世代", "ARGM-TMP", 6, 7], ["最", "ARGM-ADV", 7, 8], ["先进", "PRED", 8, 9], ["技术", "ARG0", 13, 14]]],
[[["阿婆主", "ARG0", 0, 1], ["来到", "PRED", 1, 2], ["北京立方庭", "ARG1", 2, 4]], [["阿婆主", "ARG0", 0, 1], ["参观", "PRED", 4, 5], ["自然语义科技公司", "ARG1", 5, 9]]]
],
"dep": [
[[6, "tmod"], [6, "nsubj"], [6, "prep"], [5, "nn"], [3, "pobj"], [0, "root"], [9, "dep"], [9, "advmod"], [14, "rcmod"], [9, "cpm"], [12, "nummod"], [14, "nn"], [14, "nn"], [6, "dobj"]],
[[2, "nsubj"], [0, "root"], [4, "nn"], [2, "dobj"], [2, "conj"], [7, "nn"], [9, "nn"], [9, "nn"], [5, "dobj"]]
],
"sdp": [
[[[6, "Time"]], [[6, "Exp"]], [[5, "mPrep"]], [[5, "Desc"]], [[6, "Datv"]], [[0, "Root"]], [[9, "Time"]], [[9, "mDegr"]], [[14, "Desc"]], [[9, "mAux"]], [[12, "Quan"]], [[14, "Desc"]], [[14, "Nmod"]], [[6, "Pat"]]],
[[[2, "Agt"]], [[0, "Root"]], [[4, "Nmod"]], [[2, "Lfin"]], [[2, "ePurp"]], [[7, "Nmod"]], [[9, "Nmod"]], [[9, "Desc"]], [[5, "Cont"]]]
],
"con": [
["TOP", [["IP", [["NP", [["NT", ["2021年"]]]], ["NP", [["NR", ["HanLPv2.1"]]]], ["VP", [["PP", [["P", ["为"]], ["NP", [["NN", ["生产"]], ["NN", ["环境"]]]]]], ["VP", [["VV", ["带来"]], ["NP", [["NP", [["CP", [["CP", [["IP", [["VP", [["NP", [["NN", ["次世代"]]]], ["ADVP", [["AD", ["最"]]]], ["VP", [["VA", ["先进"]]]]]]]], ["DEC", ["的"]]]]]], ["NP", [["QP", [["CD", ["多"]]]], ["NP", [["NN", ["语种"]]]]]]]], ["NP", [["NR", ["NLP"]], ["NN", ["技术"]]]]]]]]]]]]]],
["TOP", [["IP", [["NP", [["NN", ["阿婆主"]]]], ["VP", [["VP", [["VV", ["来到"]], ["NP", [["NR", ["北京"]], ["NR", ["立方庭"]]]]]], ["VP", [["VV", ["参观"]], ["NP", [["NN", ["自然"]], ["NN", ["语义"]], ["NP", [["NN", ["科技"]], ["NN", ["公司"]]]]]]]]]]]]]]
]
}
'''
多任务模型里面包含多个任务(task),tok/fine、dep、con就是这个多任务模型CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH里面的任务(task),也可以这样查看:
tasks = list(HanLP.tasks.keys())
print(tasks)
'''
['con', 'dep', 'ner/msra', 'ner/ontonotes', 'ner/pku', 'pos/863', 'pos/ctb', 'pos/pku', 'sdp', 'srl', 'tok/coarse', 'tok/fine']
'''
tok/fine: tok是分词, fine是粗粒度。 '/'前面是任务,后面是标注标准
多任务模型的位置都在 hanlp.pretrained.mtl这个包下:
mtl — HanLP Documentation
对应的多任务模型类是hanlp.components.mtl.multi_task_learning.MultiTaskLearning
多任务模型可以选择需要执行的task,任务越少,速度越快
分词任务(默认细粒度)
HanLP('阿婆主来到北京立方庭参观自然语义科技公司。', tasks='tok').pretty_print()
' 阿婆主 来到 北京 立方庭 参观 自然 语义 科技 公司 。'
执行粗颗粒度分词
HanLP('阿婆主来到北京立方庭参观自然语义科技公司。', tasks='tok/coarse').pretty_print()
'阿婆主 来到 北京立方庭 参观 自然语义科技公司 。'
同时执行细粒度和粗粒度分词
HanLP('阿婆主来到北京立方庭参观自然语义科技公司。', tasks='tok*')
'''
{'tok/fine': ['阿婆主', '来到', '北京', '立方庭', '参观', '自然', '语义', '科技', '公司', '。'],
'tok/coarse': ['阿婆主', '来到', '北京立方庭', '参观', '自然语义科技公司', '。']}
'''
coarse
为粗分,fine
为细分。
执行粗颗粒分词和PKU词性标注
HanLP('阿婆主来到北京立方庭参观自然语义科技公司。', tasks=['tok/coarse', 'pos/pku'], skip_tasks='tok/fine').pretty_print()
'阿婆主/n 来到/v 北京立方庭/ns 参观/v 自然语义科技公司/n 。/w'
skip_tasks 是跳过的任务
在内存有限的场景下,用户还可以sha可以删除不必要的任务达到模型瘦身的效果。
HanLP: MultiTaskLearning = hanlp.load(hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_SMALL_ZH) # 世界最大中文语料库
tasks = list(HanLP.tasks.keys())
print(tasks)
for task in tasks:
if task not in ('tok/fine', 'pos/pku'):
del HanLP[task]
print(HanLP.tasks.keys())
doc = HanLP(["2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术","阿婆主来到北京立方庭参观自然语义科技公司"])
print(doc)
'''
['con', 'dep', 'ner/msra', 'ner/ontonotes', 'ner/pku', 'pos/863', 'pos/ctb', 'pos/pku', 'sdp', 'srl', 'tok/coarse', 'tok/fine']
dict_keys(['pos/pku', 'tok/fine'])
{
"tok/fine": [
["2021年", "HanLPv2.1", "为", "生产", "环境", "带来", "次世代", "最", "先进", "的", "多", "语种", "NLP", "技术"],
["阿婆主", "来到", "北京", "立方庭", "参观", "自然", "语义", "科技", "公司"]
],
"pos/pku": [
["t", "nx", "p", "vn", "n", "v", "n", "d", "a", "u", "a", "n", "nx", "n"],
["n", "v", "ns", "ns", "v", "n", "n", "n", "n"]
]
}
'''
每个任务可以自定义词典,查看对应的教程即可,这里就举例ner(命名实体识别)任务:
doc = HanLP(["2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术","阿婆主来到北京立方庭参观自然语义科技公司"],tasks=['ner/msra'])
print("after:")
print(doc)
ner = HanLP["ner/msra"]
ner.dict_whitelist={'多语种': 'CNN'}
doc = HanLP(["2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术","阿婆主来到北京立方庭参观自然语义科技公司"],tasks=['ner/msra'])
print("before:")
print(doc)
'''
after:
{
"tok/fine": [
["2021年", "HanLPv2.1", "为", "生产", "环境", "带来", "次世代", "最", "先进", "的", "多", "语种", "NLP", "技术"],
["阿婆主", "来到", "北京", "立方庭", "参观", "自然", "语义", "科技", "公司"]
],
"ner/msra": [
[["2021年", "DATE", 0, 1], ["HanLPv2.1", "RATE", 1, 2]],
[["北京立方庭", "ORGANIZATION", 2, 4], ["自然语义科技公司", "ORGANIZATION", 5, 9]]
]
}
before:
{
"tok/fine": [
["2021年", "HanLPv2.1", "为", "生产", "环境", "带来", "次世代", "最", "先进", "的", "多", "语种", "NLP", "技术"],
["阿婆主", "来到", "北京", "立方庭", "参观", "自然", "语义", "科技", "公司"]
],
"ner/msra": [
[["2021年", "DATE", 0, 1], ["HanLPv2.1", "RATE", 1, 2], ["多语种", "CNN", 10, 12]],
[["北京立方庭", "ORGANIZATION", 2, 4], ["自然语义科技公司", "ORGANIZATION", 5, 9]]
]
}
'''
ner任务在多任务模型中自定义字典的具体教程:
https://github.com/hankcs/HanLP/blob/doc-zh/plugins/hanlp_demo/hanlp_demo/zh/ner_mtl.ipynb
多任务学习的优势在于速度和显存,然而精度往往不如单任务模型。
单任务模型的位置都在 hanlp.pretrained这个包下:
pretrained — HanLP Documentation
举例tok的任务模型使用:
hl = hanlp.load(hanlp.pretrained.tok.COARSE_ELECTRA_SMALL_ZH)
doc = hl(["2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术","阿婆主来到北京立方庭参观自然语义科技公司"])
print(doc)
'''
[['2021', '年', 'HanLPv2.1', '为', '生产', '环境', '带来', '次', '世代', '最', '先进', '的', '多', '语种', 'NLP', '技术'], ['阿婆主', '来到', '北京立方庭', '参观', '自然语义科技公司']]
'''
单任务模型也是一样有自定义词典,用法和多任务模型里面一样,可以直接看看对应教程
HanLP预训练了许多单任务模型并设计了流水线模式将其组装起来。
import hanlp
HanLP = 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')
HanLP('2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。阿婆主来到北京立方庭参观自然语义科技公司。')
个人感觉, 多任务模型就是官方通过流水线组装好的单任务模型