当前位置: 首页 > 工具软件 > HanLP > 使用案例 >

HanLp的RESTful部分

汝开畅
2023-12-01

安装

无论是Windows、Linux还是macOS,HanLP的安装只需一句话搞定:

pip install hanlp_restful -U

创建客户端

from hanlp_restful import HanLPClient
HanLP = HanLPClient('https://www.hanlp.com/api', auth=None, language='zh') # auth不填则匿名,zh中文,mul多语种

申请秘钥

由于服务器算力有限,匿名用户每分钟限2次调用。如果你需要更多调用次数,建议申请免费公益API秘钥auth

1.分词

分词

HanLP线上模型训练自9970万字的大型综合语料库,覆盖新闻、社交媒体、金融、法律等多个领域,是已知范围内全世界最大的中文分词语料库。语料库规模决定实际效果,面向生产环境的语料库应当在千万字量级。自然语义的语言学专家一直在持续标注该语料库,与时俱进保持最先进的分词质量。 在分词标准上,HanLP提供细粒度和粗粒度两种颗粒度,细粒度适合搜索引擎业务,粗粒度适合文本挖掘业务。

细粒度分词

默认细粒度:

HanLP.tokenize('商品和服务。阿婆主来到北京立方庭参观自然语义科技公司。')
HanLP('商品和服务。阿婆主来到北京立方庭参观自然语义科技公司。', tasks='tok').pretty_print()

返回类型为Document,是dict的子类,拓展了很多操作各种语言学结构的方法。

两个接口都会对文本进行分句,所以返回的结果一定是句子的列表。推荐在不超过服务器允许的最大长度的前提下,尽量传入整篇文章,以提高分词速度。

粗粒度分词

执行粗颗粒度分词:

HanLP.tokenize('商品和服务。阿婆主来到北京立方庭参观自然语义科技公司', coarse=True)

或者直接当函数调用:

HanLP('阿婆主来到北京立方庭参观自然语义科技公司。', tasks='tok/coarse').pretty_print()

同时执行细粒度和粗粒度分词

HanLP('阿婆主来到北京立方庭参观自然语义科技公司。', tasks='tok*')

多语种分词

得益于语言无关的设计,HanLP支持包括简繁中英日俄法德在内的104种语言上的分词。这一切,只需指定language='mul'即可实现。

HanLP(['In 2021, HanLPv2.1 delivers state-of-the-art multilingual NLP techniques to production environments.',
       '2021年、HanLPv2.1は次世代の最先端多言語NLP技術を本番環境に導入します。',
       '2021年 HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。'], tasks='tok', language='mul').pretty_print()

自然语言处理分为许多任务,分词只是最初级的一个。也许大家只听说过中文分词,但HanLP并不局限于分词。HanLP的使命是普及最前沿的自然语言处理技术到生产环境,所以在其他教程中你会见到许多更高级的NLP任务以及相应的API用法。

2.词性标注

任务越少,速度越快。如指定仅执行词性标注,默认CTB标准:

HanLP('HanLP为生产环境带来次世代最先进的多语种NLP技术。我的希望是希望张晚霞的背影被晚霞映红。', tasks='pos').pretty_print()
HanLP('HanLP为生产环境带来次世代最先进的多语种NLP技术。我的希望是希望张晚霞的背影被晚霞映红。', tasks='pos/pku').pretty_print()

同时执行所有标准的词性标注:

print(HanLP('HanLP为生产环境带来次世代最先进的多语种NLP技术。我的希望是希望张晚霞的背影被晚霞映红。', tasks='pos*'))

以pos开头的字段为词性,以tok开头的第一个数组为单词,两者按下标一一对应。

为已分词的句子执行词性标注:

HanLP(tokens=[
    ["HanLP", "为", "生产环境", "带来", "次世代", "最", "先进", "的", "多语种", "NLP", "技术", "。"],
    ["我", "的", "希望", "是", "希望", "张晚霞", "的", "背影", "被", "晚霞", "映红", "。"]
  ], tasks='pos').pretty_print()

3.命名实体识别

同时执行所有标准的命名实体识别:

print(HanLP('2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。阿婆主来到北京立方庭参观自然语义科技公司。', tasks='ner*')

每个四元组表示[命名实体, 类型标签, 起始下标, 终止下标],下标指的是命名实体在单词数组中的下标,单词数组默认为第一个以tok开头的数组。

任务越少,速度越快。如指定仅执行命名实体识别,默认MSRA标准:

HanLP('2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。阿婆主来到北京立方庭参观自然语义科技公司。', tasks='ner').pretty_print()
HanLP('2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。阿婆主来到北京立方庭参观自然语义科技公司。', tasks='ner/ontonotes').pretty_print()
HanLP(tokens=[["阿婆主", "来到", "北京立方庭", "参观", "自然语义科技公司", "。"]], tasks='ner').pretty_print()

4.依存句法分析

任务越少,速度越快。如指定仅执行依存句法分析:

doc = HanLP('2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。', tasks='dep')
doc

doc['dep']为句子们的依存句法树列表,第i个二元组表示第i个单词的[中心词的下标, 与中心词的依存关系]。

可视化依存句法树:

doc.pretty_print()
print(doc.to_conll())
HanLP(tokens=[
    ["HanLP", "为", "生产", "环境", "带来", "次世代", "最", "先进", "的", "多语种", "NLP", "技术", "。"],
    ["我", "的", "希望", "是", "希望", "张晚霞", "的", "背影", "被", "晚霞", "映红", "。"]
  ], tasks='dep').pretty_print()

5.短语句法分析

任务越少,速度越快。如指定仅执行短语句法分析:

doc = HanLP('2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。', tasks='con')
doc

doc['con']为Tree类型,是list的子类。

可视化短语句法树:

doc.pretty_print()
print(doc['con'][0])

为已分词的句子执行短语句法分析:

HanLP(tokens=[
    ["HanLP", "为", "生产", "环境", "带来", "次世代", "最", "先进", "的", "多语种", "NLP", "技术", "。"],
    ["我", "的", "希望", "是", "希望", "张晚霞", "的", "背影", "被", "晚霞", "映红", "。"]
  ], tasks='con').pretty_print()

6.语义依存分析

任务越少,速度越快。如指定仅执行语义依存分析:

doc = HanLP('2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。', tasks='sdp')
doc

doc['sdp']字段代表语义依存图的数组格式,数组中第i个子数组代表第i个单词的语义依存关系,子数组中每个二元组的格式为[中心词的下标, 与中心词的语义依存关系]。每个单词的语义依存关系可能有零个、一个或多个(任意数量)。

转换为CoNLLSentence格式更容易观察:

print(doc.to_conll())
print(HanLP(tokens=[
    ["HanLP", "为", "生产", "环境", "带来", "次世代", "最", "先进", "的", "多语种", "NLP", "技术", "。"],
    ["我", "的", "希望", "是", "希望", "张晚霞", "的", "背影", "被", "晚霞", "映红", "。"]
  ], tasks='sdp').to_conll())

7.语义角色分析

任务越少,速度越快。如指定仅执行语义角色分析:

doc = HanLP('2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。', tasks='srl')
doc

doc['srl']字段为语义角色标注结果,每个四元组的格式为[论元或谓词, 语义角色标签, 起始下标, 终止下标]。其中,谓词的语义角色标签为PRED,起止下标对应以tok开头的第一个单词数组。

可视化谓词论元结构:

doc.pretty_print()

遍历谓词论元结构:

for i, pas in enumerate(doc['srl'][0]):
    print(f'第{i+1}个谓词论元结构:')
    for form, role, begin, end in pas:
        print(f'{form} = {role} at [{begin}, {end}]')

为已分词的句子执行语义角色分析:

HanLP(tokens=[
    ["HanLP", "为", "生产", "环境", "带来", "次世代", "最", "先进", "的", "多语种", "NLP", "技术", "。"],
    ["我", "的", "希望", "是", "希望", "张晚霞", "的", "背影", "被", "晚霞", "映红", "。"]
  ], tasks='srl', skip_tasks='tok*').pretty_print()

 类似资料: