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
    评论
HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用.HanLP具备功能完善,性能高效,架构清晰,语料时新,可自定义的特点。 HanLP提供下列功能: 中文分词 HMM-两字组(速度与精度最佳平衡;一百兆内存) 最短路分词,N-最短路分词 由字构词(侧重精度,全世界最大语料库,可识别新词;适合NLP任务) 感知机分词,CRF分词 词典分词(侧重速度,每秒数千万字符;省内存) 极速词典分词 所有分词器都支持: 索引全切分模式 用户自定义词典 兼容繁体中文 训练用户自己的领域模型 词性标注 HMM词性标注(速度快) 感知机词性标注,CRF词性标注(精度高) 命名实体识别 基于HMM角色标注的命名实体识别(速度快) 中国人名识别,音译人名识别,日本人名识别,地名识别,实体机构名识别 基于线性模型的命名实体识别(精度高) 感知机命名实体识别,CRF命名实体识别 关键词提取 TextRank关键词提取 自动摘要 TextRank自动摘要 短语提取 基于互信息和左右信息熵的短语提取 拼音转换 多音字,声母,韵母,声调 简繁转换 简繁分歧词(简体,繁体,台湾正体,香港繁体) 文本推荐 语义推荐,拼音推荐,字词推荐 依存句法分析 基于神经网络的高性能依存句法分析器 基于ArcEager转移系统的柱搜索依存句法分析器 文本分类 情感分析 文本聚类 KMeans,Repeated Bisection,自动推断聚类数目k word2vec 词向量训练,加载,词语相似度计算,语义运算,查询,KMEANS聚类 文档语义相似度计算 语料库工具 部分默认模型训练自小型语料库,鼓励用户自行训练。模块所有提供训练接口,语料可参考98年人民日报语料库。 在提供丰富功能的同时,HanLP内部模块坚持低耦合,模型坚持惰性加载,服务坚持静态提供,词典坚持明文发布,使用非常方便。默认模型训练自全世界最大规模的中文语料库,同时自带一些语料处理工具,帮助用户训练自己的模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值