03.数据预处理之文本处理——hanlp分词

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类中获取,这种获取方式一共可以获取五种分词器,而现在默认的就是第一种维特比分词器

  1. 维特比(viterbi):效率和效果的最佳平衡。也是最短路分词,HanLP最短路求解采用Viterbi算法

  2. 双数组trie树 (dat):极速词典分词,千万字符每秒(可能无法获取词性,此处取决于你的词典)

  3. 条件随机场(crf):分词、词性标注与命名实体识别精度都较高,适合要求较高的NLP任务

  4. 感知机(perceptron):分词、词性标注与命名实体识别,支持在线学习

  5. 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


内容均来源于学习资料,在学习过程中进行记录,如有侵权联系作者进行删除

Change the world by program

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • 生而为鱼心藏真龙,风云际会降吾身处。 跃过龙门腾飞万里,翻手为云覆手为雨。
    叁拾弍厘阅读 426评论 0 0
  • 感赏桂军姐给我的简书点赞并留言:“孩子也一样需要被关注和被鼓励,当我们切身感受到这种感受的时候,就知道怎样去对待孩...
    黃燕华阅读 180评论 0 2
  • 无创DNA觉果均为低风险。预约12月12号做四维彩超,到时孕期为5个月多点了。 甲亢导致心跳过快,110/分。要控...
    含_阅读 192评论 0 0