hanlp分词
介绍
HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。
HanLP有如下功能:
- 中文分词
- 词性标注
- 命名实体识别
- 依存句法分析
- 关键词提取新词发现
- 短语提取
- 自动摘要
- 文本分类
- 拼音简繁
安装方法
pip install pyhanlp
安装后在第一次使用时,当运行from pyhanlp import *时,会下载hanlp的数据文件,这个文件比较大,一般都会下载失败,推荐手动下载并放到要求的路径下。
data文件下载地址:https://file.hankcs.com/hanlp/data-for-1.7.5.zip
然后把下载的文件放到D:\Anaconda3\Lib\site-packages\pyhanlp\static (选择自己的python环境地址)目录下
再执行from pyhanlp import *,完成自动解压。
pyhanlp的参考文档:https://github.com/hankcs/pyhanlp
使用方式
pyhanlp实现的分词器有很多,同时pyhanlp获取hanlp中分词器也有两种方式
第一种是直接从封装好的hanlp类中获取,这种获取方式一共可以获取五种分词器,而现在默认的就是第一种维特比分词器
维特比(viterbi):效率和效果的最佳平衡。也是最短路分词,HanLP最短路求解采用Viterbi算法
双数组trie树 (dat):极速词典分词,千万字符每秒(可能无法获取词性,此处取决于你的词典)
条件随机场(crf):分词、词性标注与命名实体识别精度都较高,适合要求较高的NLP任务
感知机(perceptron):分词、词性标注与命名实体识别,支持在线学习
N最短路 (nshort):命名实体识别稍微好一些,牺牲了速度
第二种方式是使用JClass直接获取java类,然后使用。这种方式除了获取上面的五种分词器以外还可以获得一些其他分词器,如NLP分词器,索引分词,快速词典分词等等
比较
第一种是使用作者给的HanLP直接获取分词器,直接segment() 会获取 默认的标准分词器也就是维特比分词器,也可以使用newSegment函数,传入上面的分词器英文名称来获取新的分词器,如使用HanLP.newSegment("crf")来获取CRF分词器。
第二种方式是使用JClass从java中获取我们想要的类,好在这两种方式都比较方便。除此之外要注意的是,在pyhanlp中还给出了SafeJClass类,其为JClass的线程安全版,你也可以使用SafeClass来代替JClass。不过好在HanLP中的很多类本身已经实现了线程安全,因此许多时候两者是可以相互替代的。
HanLP的词性
a 形容词
ad 副形词
ag 形容词性语素
al 形容词性惯用语
an 名形词
b 区别词
begin
bg 区别语素
bl 区别词性惯用语
c 连词
cc 并列连词
d 副词
dg 辄,俱,复之类的副词
dl 连语
e 叹词
end 仅用于终##终
f 方位词
g 学术词汇
gb 生物相关词汇
gbc 生物类别
gc 化学相关词汇
gg 地理地质相关词汇
gi 计算机相关词汇
gm 数学相关词汇
gp 物理相关词汇
h 前缀
i 成语
j 简称略语
k 后缀
l 习用语
m 数词
mg 数语素
Mg 甲乙丙丁之类的数词
mq 数量词
n 名词
nb 生物名
nba 动物名
nbc 动物纲目
nbp 植物名
nf 食品,比如“薯片”
ng 名词性语素
nh 医药疾病等健康相关名词
nhd 疾病
nhm 药品
ni 机构相关(不是独立机构名)
nic 下属机构
nis 机构后缀
nit 教育相关机构
nl 名词性惯用语
nm 物品名
nmc 化学品名
nn 工作相关名词
nnd 职业
nnt 职务职称
nr 人名
nr1 复姓
nr2 蒙古姓名
nrf 音译人名
nrj 日语人名
ns 地名
nsf 音译地名
nt 机构团体名
ntc 公司名
ntcb 银行
ntcf 工厂
ntch 酒店宾馆
nth 医院
nto 政府机构
nts 中小学
ntu 大学
nx 字母专名
nz 其他专名
o 拟声词
p 介词
pba 介词“把”
pbei 介词“被”
q 量词
qg 量词语素
qt 时量词
qv 动量词
r 代词
rg 代词性语素
Rg 古汉语代词性语素
rr 人称代词
ry 疑问代词
rys 处所疑问代词
ryt 时间疑问代词
ryv 谓词性疑问代词
rz 指示代词
rzs 处所指示代词
rzt 时间指示代词
rzv 谓词性指示代词
s 处所词
t 时间词
tg 时间词性语素
u 助词
ud 助词
ude1 的 底
ude2 地
ude3 得
udeng 等 等等 云云
udh 的话
ug 过
uguo 过
uj 助词
ul 连词
ule 了 喽
ulian 连 (“连小学生都会”)
uls 来讲 来说 而言 说来
usuo 所
uv 连词
uyy 一样 一般 似的 般
uz 着
uzhe 着
uzhi 之
v 动词
vd 副动词
vf 趋向动词
vg 动词性语素
vi 不及物动词(内动词)
vl 动词性惯用语
vn 名动词
vshi 动词“是”
vx 形式动词
vyou 动词“有”
w 标点符号
wb 百分号千分号,全角:% ‰ 半角:%
wd 逗号,全角:, 半角:,
wf 分号,全角:; 半角: ;
wh 单位符号,全角:¥ $ £ ° ℃ 半角:$
wj 句号,全角:。
wky 右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >
wkz 左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { <
wm 冒号,全角:: 半角: :
wn 顿号,全角:、
wp 破折号,全角:—— -- ——- 半角:— —-
ws 省略号,全角:…… …
wt 叹号,全角:!
ww 问号,全角:?
wyy 右引号,全角:” ’ 』
wyz 左引号,全角:“ ‘ 『
x 字符串
xu 网址URL
xx 非语素字
y 语气词(delete yg)
yg 语气语素
z 状态词
zg 状态词
说明
- HanLP中有一系列“开箱即用”的静态分词器,以Tokenizer结尾,在接下来的例子中会继续介绍。
- HanLP.segment其实是对StandardTokenizer.segment的包装。
HanLP分词
text = '举办纪念活动铭记二战历史,不忘战争带给人类的深重灾难,是为了防止悲剧重演,确保和平永驻;记二战历史,' \
'更是为了提醒国际社会,需要共同捍卫二战胜利成果和国际公平正义,' \
'必须警惕和抵制在历史认知和维护战后国际秩序问题上的倒行逆施。'
# *****************************HanLP分词*****************************
print('-' * 40)
print('HanLP分词')
print('-' * 40)
# 返回一个list,每个list是一个分词后的Term对象,可以获取word属性和nature属性,分别对应的是词和词性
terms = HanLP.segment(text)
print(len(terms))
for term in terms:
print(term.word, term.nature)
----------------------------------------
HanLP分词
----------------------------------------
62
举办 v
纪念活动 nz
铭记 v
二战 n
历史 n
, w
不忘 v
战争 n
带给 v
人类 n
的 ude1
……(结果过多,省略)
的 ude1
倒行逆施 vl
。 w
标准分词
# *****************************标准分词*****************************
print('-' * 40)
print('标准分词')
print('-' * 40)
BasicTokenizer = JClass("com.hankcs.hanlp.tokenizer.BasicTokenizer")
terms = BasicTokenizer.segment(text)
print(len(terms))
for term in terms:
print(term.word, term.nature)
----------------------------------------
标准分词
----------------------------------------
62
举办 v
纪念活动 nz
铭记 v
二战 n
历史 n
, w
不忘 v
战争 n
带给 v
人类 n
的 ude1
……(结果过多,省略)
的 ude1
倒行逆施 vl
。 w
NLP分词
- NLP分词NLPTokenizer会执行词性标注和命名实体识别,由结构化感知机序列标注框架支撑。
- 默认模型训练自9970万字的大型综合语料库,是已知范围内全世界最大的中文分词语料库。语料库规模决定实际效果,面向生产环境的语料库应当在千万字量级。欢迎用户在自己的语料上训练新模型以适应新领域、识别新的命名实体。
# *****************************NLP分词*****************************
print('-' * 40)
print('HanLP分词')
print('-' * 40)
# NLP分词器NLPTokenizer会执行全部命名实体识别和词性标注
NLPTokenizer = JClass("com.hankcs.hanlp.tokenizer.NLPTokenizer")
terms = NLPTokenizer.segment(text)
print(len(terms))
for term in terms:
print(term.word, term.nature)
----------------------------------------
HanLP分词
----------------------------------------
61
举办 v
纪念 vn
活动 vn
铭记 v
二战 j
历史 n
……(结果过多,省略)
的 u
倒行逆施 i
。 w
索引分词
- 索引分词IndexTokenizer是面向搜索引擎的分词器,能够对长词全切分,另外通过term.offset可以获取单词在文本中的偏移量。
- 任何分词器都可以通过基类Segment的enableIndexMode方法激活索引模式。
# *****************************索引分词*****************************
print('-' * 40)
print('索引分词')
print('-' * 40)
IndexTokenizer = JClass("com.hankcs.hanlp.tokenizer.IndexTokenizer")
terms = IndexTokenizer.segment(text)
print(len(terms))
for term in terms:
print(term.word, term.nature, '[', term.offset, ':', term.offset + len(term.word), ']')
----------------------------------------
索引分词
----------------------------------------
69
举办 v [ 0 : 2 ]
纪念活动 nz [ 2 : 6 ]
纪念 v [ 2 : 4 ]
活动 vn [ 4 : 6 ]
铭记 v [ 6 : 8 ]
二战 n [ 8 : 10 ]
……(结果过多,省略)
的 ude1 [ 105 : 106 ]
倒行逆施 vl [ 106 : 110 ]
倒行 nz [ 106 : 108 ]
逆施 nz [ 108 : 110 ]
。 w [ 110 : 111 ]
急速词典分词
- 极速分词是词典最长分词,速度极其快,精度一般。
- 在i7-6700K上跑出了4500万字每秒的速度。
# *****************************急速词典分词*****************************
print('-' * 40)
print('急速词典分词')
print('-' * 40)
SpeedTokenizer = JClass('com.hankcs.hanlp.tokenizer.SpeedTokenizer')
terms = SpeedTokenizer.segment(text)
print(terms)
----------------------------------------
急速词典分词
----------------------------------------
[举办/null, 纪念活动/null, 铭记/null, 二战/null, 历史/null, ,/null, 不忘/null, 战争/null, 带给/null, 人类/null, 的/null, 深重/null, 灾难/null, ,/null, 是/null, 为了/null, 防止/null, 悲剧/null, 重演/null, ,/null, 确保/null, 和平/null, 永驻/null, ;/null, 记/null, 二战/null, 历史/null, ,/null, 更是/null, 为了/null, 提醒/null, 国际/null, 社会/null, ,/null, 需要/null, 共同/null, 捍卫/null, 二战/null, 胜利/null, 成果/null, 和/null, 国际/null, 公平/null, 正义/null, ,/null, 必须/null, 警惕/null, 和/null, 抵制/null, 在/null, 历史/null, 认知/null, 和/null, 维护/null, 战后/null, 国际/null, 秩序/null, 问题/null, 上/null, 的/null, 倒行逆施/null, 。/null]
自定义词典分词
# *****************************自定义词典分词*****************************
print('-' * 40)
print('自定义词典分词')
print('-' * 40)
text = '攻城狮逆袭单身狗,迎娶白富美,走向人生巅峰'
terms = HanLP.segment(text)
print('未添加自定义词典:', terms)
CustomDictionary = JClass('com.hankcs.hanlp.dictionary.CustomDictionary')
CustomDictionary.add('攻城狮')
CustomDictionary.add('单身狗')
terms = HanLP.segment(text)
print('使用自定义词典', terms)
----------------------------------------
自定义词典分词
----------------------------------------
未添加自定义词典: [攻城/vi, 狮/ng, 逆袭/nz, 单身/n, 狗/n, ,/w, 迎娶/v, 白富美/nr, ,/w, 走向/v, 人生/n, 巅峰/n]
使用自定义词典 [攻城狮/nz, 逆袭/nz, 单身狗/nz, ,/w, 迎娶/v, 白富美/nr, ,/w, 走向/v, 人生/n, 巅峰/n]
关键词提取
# *****************************关键词提取*****************************
print('-' * 40)
print('关键词提取')
print('-' * 40)
text = '举办纪念活动铭记二战历史,不忘战争带给人类的深重灾难,是为了防止悲剧重演,确保和平永驻;记二战历史,' \
'更是为了提醒国际社会,需要共同捍卫二战胜利成果和国际公平正义,' \
'必须警惕和抵制在历史认知和维护战后国际秩序问题上的倒行逆施。'
keywords = HanLP.extractKeyword(text, 8)
print(keywords)
----------------------------------------
关键词提取
----------------------------------------
[历史, 二战, 国际, 战后, 维护, 深重, 不忘, 灾难]
自动摘要
# *****************************自动摘要*****************************
print('-' * 40)
print('自动摘要')
print('-' * 40)
abstract = HanLP.extractSummary(text, 5)
print(abstract)
----------------------------------------
自动摘要
----------------------------------------
[记二战历史, 举办纪念活动铭记二战历史, 需要共同捍卫二战胜利成果和国际公平正义, 必须警惕和抵制在历史认知和维护战后国际秩序问题上的倒行逆施, 更是为了提醒国际社会]
命名实体识别
# *****************************命名实体识别*****************************
print('-' * 40)
print('命名实体识别')
print('-' * 40)
text = '河南大明建设工程管理有限公司受林州市水土保持生态建设管理局委托,' \
'林州市合涧镇刘家凹小流域2017年省级水土保持补偿费项目进行了公开招标'
segment = HanLP.newSegment().enablePlaceRecognize(True)
terms = segment.seg(text)
print(terms)
----------------------------------------
命名实体识别
----------------------------------------
[河南/ns, 大明/nz, 建设工程/nz, 管理/vn, 有限公司/nis, 受/v, 林州市/ns, 水土保持/gg, 生态建设/nz, 管理局/nis, 委托/vn, ,/w, 林州市/ns, 合涧镇/ns, 刘家凹/nr, 小流域/nz, 2017/m, 年/qt, 省级/b, 水土保持/gg, 补偿费/n, 项目/n, 进行/vn, 了/ule, 公开招标/v]
依存句法分析
# *****************************依存句法分析*****************************
print('-' * 40)
print('依存句法分析')
print('-' * 40)
dependency = HanLP.parseDependency(text)
print(dependency)
----------------------------------------
依存句法分析
----------------------------------------
1 河南大明建设工程管理有限公司 河南大明建设工程管理有限公司 ni nt _ 2 主谓关系 _ _
2 受 受 v v _ 0 核心关系 _ _
3 林州市 林州市 ns ns _ 4 定中关系 _ _
4 水土保持 水土保持 v v _ 2 动宾关系 _ _
5 生态建设 生态建设 nz nz _ 6 定中关系 _ _
6 管理局 管理局 n n _ 7 主谓关系 _ _
7 委托 委托 v v _ 4 并列关系 _ _
8 , , wp w _ 7 标点符号 _ _
9 林州市合涧镇 林州市合涧镇 ns ns _ 11 定中关系 _ _
10 刘 刘 nh nr _ 11 定中关系 _ _
11 家 家 n n _ 13 定中关系 _ _
12 凹小 凹小 a a _ 13 定中关系 _ _
13 流域 流域 n n _ 18 定中关系 _ _
14 2017年 2017年 nt t _ 18 定中关系 _ _
15 省级 省级 b b _ 16 定中关系 _ _
16 水土保持 水土保持 n n _ 17 定中关系 _ _
17 补偿费 补偿费 n n _ 18 定中关系 _ _
18 项目 项目 n n _ 19 主谓关系 _ _
19 进行 进行 v v _ 7 并列关系 _ _
20 了 了 u u _ 19 右附加关系 _ _
21 公开 公开 a ad _ 22 状中结构 _ _
22 招标 招标 v v _ 19 动宾关系 _ _
短语提取
# *****************************短语提取*****************************
print('-' * 40)
print('短语提取')
print('-' * 40)
phrase = HanLP.extractPhrase(text, 10)
print(phrase)
----------------------------------------
短语提取
----------------------------------------
[刘家凹小流域, 合涧镇刘家凹, 大明建设工程, 建设工程管理, 林州市合涧镇, 水土保持生态建设, 生态建设管理局, 小流域水土保持, 林州市水土保持, 水土保持补偿费]
其他用法
本分用法为基本用法,如需要更多功能请参考:https://github.com/hankcs/pyhanlp,进行更深入的了解
相关代码:https://gitee.com/tangjinghong/data_process
内容均来源于学习资料,在学习过程中进行记录,如有侵权联系作者进行删除