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粗分/细分
词性标注教程教程教程posCTBPKU863
命名实体识别教程教程教程nerPKUMSRAOntoNotes
依存句法分析教程教程教程depSDUDPMT
成分句法分析教程教程教程conChinese Tree Bank
语义依存分析教程教程教程sdpCSDP
语义角色标注教程教程教程srlChinese Proposition Bank
抽象意义表示暂无暂无教程amrCAMR
指代消解教程暂无暂无暂无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.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技术。阿婆主来到北京立方庭参观自然语义科技公司。')

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

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值