HanLP-简单使用

目录

简介

轻量级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 暂无
文本风格转换 教程 暂无 暂无 暂无 暂无

轻量级RESTful API

仅数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", ["公司"]]]]]]]]]]]]]]
  ]
}
'''

海量级native API

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-简单使用_第1张图片

对应的多任务模型类是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-简单使用_第2张图片

单任务模型

多任务学习的优势在于速度和显存,然而精度往往不如单任务模型。

单任务模型的位置都在 hanlp.pretrained这个包下:

pretrained — HanLP Documentation

HanLP-简单使用_第3张图片

举例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技术。阿婆主来到北京立方庭参观自然语义科技公司。')

个人感觉, 多任务模型就是官方通过流水线组装好的单任务模型

你可能感兴趣的:(nlp,nlp)