关于 Hanlp

https://github.com/hankcs/HanLP
https://www.hanlp.com


Hanlp 功能完善、性能高效、架构 清晰、语料时新、可自定义。
功能:中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 新词发现 短语提取 自动摘要 文本分类 拼音简繁。
(相比之下,jieba 没有依存句法分析)


版本

在这里插入图片描述


开发语言

  • 本地开发语言为C++和Python
    • 用C++实现基础数据结构(双数组trie树)
    • 用Python构建神经网络动态图
  • 为任何开发语言提供RESTful API
    • 自研高性能服务器
    • 官方提供Java和Python客户端
    • 其他语言依赖社区贡献
  • 利用swig实现语言接口
    • 双数组字典树/AC自动机词典匹配是 HanLP1.x 的优良传统
    • 在2.0中将利用C+ +实现高效算法,用SWIG实现Python语言的接口
      在这里插入图片描述

安装


安装 2.0+

(base) $ sudo pip install hanlp

安装 1.0+

1、安装 Java
2、安装 Jpype

(base) $ pip install JPype1==0.7.0

2021.05.01 安装时如果不指定版本,最新是 1.2.1 版本;
函数和旧版本不同,资料也少,所以建议使用上述方式安装。


Jpype:python 调用 java 的工具包
http://jpype.sourceforge.net


测试

from jpype import *

startJVM(getDefaultJVMPath(), "-ea")
java.lang.System.out.println("Hello World")
shutdownJVM()

3、安装 hanlp

1)下载 hanlp.jar 包
https://github.com/hankcs/HanLP


2)下载 data.zip
https://github.com/hankcs/HanLP/releases
在这里插入图片描述


3)配置文件
win 用户需要注意配置文件的路径斜杠为linux样式 /,python 文件中,startJVM 中 hanlp 的路径为系统的路径样式。

重点是修改 root 地址

#本配置文件中的路径的根目录,根目录+其他路径=完整路径(支持相对路径,请参考:https://github.com/hankcs/HanLP/pull/254)
#Windows用户请注意,路径分隔符统一使用/
root=/Users/xx/repos/nlp_rsc/hanlp  
#D:\ifchange\parsenoun\hanlp
#核心词典路径
CoreDictionaryPath=data/dictionary/CoreNatureDictionary.txt
#2元语法词典路径
BiGramDictionaryPath=data/dictionary/CoreNatureDictionary.ngram.txt
#停用词词典路径
CoreStopWordDictionaryPath=data/dictionary/stopwords.txt
#同义词词典路径
CoreSynonymDictionaryDictionaryPath=data/dictionary/synonym/CoreSynonym.txt
#人名词典路径
PersonDictionaryPath=data/dictionary/person/nr.txt
#人名词典转移矩阵路径
PersonDictionaryTrPath=data/dictionary/person/nr.tr.txt
#繁简词典根目录
tcDictionaryRoot=data/dictionary/tc
#自定义词典路径,用;隔开多个自定义词典,空格开头表示在同一个目录,使用“文件名 词性”形式则表示这个词典的词性默认是该词性。优先级递减。
#另外data/dictionary/custom/CustomDictionary.txt是个高质量的词库,请不要删除。所有词典统一使用UTF-8编码。
CustomDictionaryPath=data/dictionary/custom/CustomDictionary.txt; 现代汉语补充词库.txt; 全国地名大全.txt ns; 人名词典.txt; 机构名词典.txt; resume_nouns.txt; 上海地名.txt ns;data/dictionary/person/nrf.txt nrf;
#CRF分词模型路径
CRFSegmentModelPath=data/model/segment/CRFSegmentModel.txt
#HMM分词模型
HMMSegmentModelPath=data/model/segment/HMMSegmentModel.bin
#分词结果是否展示词性
ShowTermNature=true
#IO适配器,实现com.hankcs.hanlp.corpus.io.IIOAdapter接口以在不同的平台(Hadoop、Redis等)上运行HanLP
#默认的IO适配器如下,该适配器是基于普通文件系统的。
#IOAdapter=com.hankcs.hanlp.corpus.io.FileIOAdapter

使用 2.0+

官方示例:https://github.com/hankcs/HanLP/tree/master/plugins/hanlp_demo


分句

Type "help", "copyright", "credits" or "license" for more information.
>>> import hanlp
>>> split_sent = hanlp.load(hanlp.pretrained.eos.UD_CTB_EOS_MUL)
Downloading https://file.hankcs.com/hanlp/eos/eos_ud_ctb_mul_20201222_133543.zip to /Users/user/.hanlp/eos/eos_ud_ctb_mul_20201222_133543.zip
100%   5.4 MiB 772.0 KiB/s ETA:  0 s [=========================================================]
Decompressing /Users/xx/.hanlp/eos/eos_ud_ctb_mul_20201222_133543.zip to /Users/xx/.hanlp/eos
>>> output = split_sent('“希望公众能够理解警方,警方办案是一个很严谨的过程,不能有丝毫的差池,该案很多细节都是发生在私密空间,调查有难度。也请公众放心,警方调查侦办结果完成后,一定及时向社会公布。”该专班一成员这样告诉澎湃新闻。')
['“希望公众能够理解警方,警方办案是一个很严谨的过程,不能有丝毫的差池,该案很多细节都是发生在私密空间,调查有难度。', '也请公众放心,警方调查侦办结果完成后,一定及时向社会公布。”该专班一成员这样告诉澎湃新闻。']

使用 1.0+

以下代码基于 hanlp 1.5 版本

#-*- coding:utf-8 -*-
from jpype import *

# startJVM(getDefaultJVMPath(), "-ea")
# java.lang.System.out.println("Hello World")
# shutdownJVM()

startJVM(getDefaultJVMPath(), "-Djava.class.path=/Users/xx/repos/nlp_rsc/hanlp/hanlp-1.5.0.jar:/Users/xx/repos/nlp_rsc/hanlp",
         "-Xms1g",
         "-Xmx1g") # 启动JVM,Linux需替换分号;为冒号:  win以; 分隔地址

print("=" * 30 + "HanLP分词" + "=" * 30)
HanLP = JClass('com.hankcs.hanlp.HanLP')  # 初始化 java class 类

# 中文分词
print(HanLP.segment('你好,欢迎在Python中调用HanLP的API'))
print("-" * 70)

print("=" * 30 + "标准分词" + "=" * 30)
StandardTokenizer = JClass('com.hankcs.hanlp.tokenizer.StandardTokenizer')
print(StandardTokenizer.segment('你好,欢迎在Python中调用HanLP的API'))
print("-" * 70)

# NLP分词NLPTokenizer会执行全部命名实体识别和词性标注
print("=" * 30 + "NLP分词" + "=" * 30)
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment('中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程'))
print("-" * 70)

print("=" * 30 + "索引分词" + "=" * 30)
IndexTokenizer = JClass('com.hankcs.hanlp.tokenizer.IndexTokenizer')
termList = IndexTokenizer.segment("主副食品");
for term in termList:
    print(str(term) + " [" + str(term.offset) + ":" + str(term.offset + len(term.word)) + "]")
print("-" * 70)

print("=" * 30 + " CRF分词" + "=" * 30)
print("-" * 70)

print("=" * 30 + " 极速词典分词" + "=" * 30)
SpeedTokenizer = JClass('com.hankcs.hanlp.tokenizer.SpeedTokenizer')
print(NLPTokenizer.segment('江西鄱阳湖干枯,中国最大淡水湖变成大草原'))
print("-" * 70)

print("=" * 30 + " 自定义分词" + "=" * 30)
CustomDictionary = JClass('com.hankcs.hanlp.dictionary.CustomDictionary')
CustomDictionary.add('攻城狮')
CustomDictionary.add('单身狗')
HanLP = JClass('com.hankcs.hanlp.HanLP')
print(HanLP.segment('攻城狮逆袭单身狗,迎娶白富美,走上人生巅峰'))
print("-" * 70)

print("=" * 20 + "命名实体识别与词性标注" + "=" * 30)
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment('中国科学院计算技术研究所的宗成庆教授正在教授自然语言处理课程'))
print("-" * 70)

document = "随着5G基站越来越多地应用多输入多输出系统(Multiple-input Multiple-Output/MIMO)技术," \
           "5G基站侧配置数量更多、更大规模的天线阵列等现实变化,均给传统物流运输提出了新的要求。" \
           "其中,5G基站相关硬件相对4G基站更大、更重" \
           "但要求包装在材料、工艺上实现轻量化、节能减排等全新升级。"
print("=" * 30 + "关键词提取" + "=" * 30)
print(HanLP.extractKeyword(document, 8))
print("-" * 70)

print("=" * 30 + "自动摘要" + "=" * 30)
print(HanLP.extractSummary(document, 3))
print("-" * 70)


text = r"2021426日,福建电信、华宇织造、中兴通讯签署全面战略合作协议,在三方重点关注的5G、智能制造领域开展深度合作。

本次签约,三方本着“开放公平、互利共赢”的原则,将对方作为各自事业发展的全球战略合作伙伴。同时,发挥在各自领域的优势,整合资源,强强联合,探索5G在纺织行业领域的创新应用,加速纺织行业数字化转型升级。\n 430日消息,市场研究机构Strategy Analytics发布的最新研究数据指出,2021年第一季度,全球5G智能手机出货量接近1.34亿台,同比暴增458%。\n 2021年第一季度,排名全球5G智能手机市场出货量前五的厂商分别为:苹果、OPPO、vivo、三星、小米。\n 近日,realme又有了新的动作,realme带着它自身的千元机皇Q系列卷土重来。此次realme携手的是最近发布机型realme Q3,真我Q3 系列产品把“为年轻人打造同价位性能最强手机”作为核心目标,打造新一代 “千元机皇”。\n"
print("=" * 30 + "短语提取" + "=" * 30)

print(HanLP.extractPhrase(text, 10))
print("-" * 70)

shutdownJVM()

如出现下方提示,暂时可忽略,不影响程序执行。

Deprecated: convertStrings was not specified when starting the JVM. The default
behavior in JPype will be False starting in JPype 0.8. The recommended setting
for new code is convertStrings=False. The legacy value of True was assumed for
this session. If you are a user of an application that reported this warning,
please file a ticket with the developer.


2.0 使用

参考:https://hub.gke2.mybinder.org/user/hankcs-hanlp-5bui24bq/notebooks/plugins/hanlp_demo/hanlp_demo/zh/tutorial.ipynb


#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import hanlp

# 加载模型
hanlp.pretrained.mtl.ALL # MTL多任务,具体任务见模型名称,语种见名称最后一个字段或相应语料库

# 调用hanlp.load进行加载,模型会自动下载到本地缓存。自然语言处理分为许多任务,分词只是最初级的一个。与其每个任务单独创建一个模型,不如利用HanLP的联合模型一次性完成多个任务:
HanLP = hanlp.load(hanlp.pretrained.mtl.CLOSE_TOK_POS_NER_SRL_DEP_SDP_CON_ELECTRA_BASE_ZH)

# 多任务批量分析
doc = HanLP(['2021年HanLPv2.1为生产环境带来次世代最先进的多语种NLP技术。', '阿婆主来到北京立方庭参观自然语义科技公司。'])
print(doc)

# 可视化
doc.pretty_print()

# 执行分词和MSRA标准NER
HanLP('阿婆主来到北京立方庭参观自然语义科技公司。', tasks='ner/msra').pretty_print()
 		

相关资料

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐