无论是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。
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用法。
任务越少,速度越快。如指定仅执行词性标注,默认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()
同时执行所有标准的命名实体识别:
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()
任务越少,速度越快。如指定仅执行依存句法分析:
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()
任务越少,速度越快。如指定仅执行短语句法分析:
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()
任务越少,速度越快。如指定仅执行语义依存分析:
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())
任务越少,速度越快。如指定仅执行语义角色分析:
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()