【NLP】pyhanlp的安装与使用

介绍pyhanlp

HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。

HanLP有如下功能:

  • 中文分词
  • 词性标注
  • 命名实体识别
  • 依存句法分析
  • 关键词提取新词发现
  • 短语提取
  • 自动摘要
  • 文本分类
  • 拼音简繁

安装pyhanlp

pip install pyhanlp

安装后在第一次使用时,当运行from pyhanlp import *时,会下载hanlp的数据文件,这个文件比较大,一般都会下载失败,推荐手动下载并放到要求的路径下。

data文件下载地址:https://github.com/hankcs/HanLP/releases

在页面中下载data-for-1.7.2.zip

然后把下载的文件放到C:\Anaconda3\Lib\site-packages\pyhanlp\static 目录下

再执行from pyhanlp import *,完成自动解压。

pyhanlp的使用

pyhanlp的参考文档:https://github.com/hankcs/pyhanlp

hanlp的参考文档:https://github.com/hankcs/HanLP/blob/master/README.md

pyhanlp的demo:https://github.com/hankcs/pyhanlp/tree/master/tests/demos

分词

pyhanlp可以自定义多种分词规则和模型,也可以加入自定义词典,经测试,默认的分词方法效果就不错,而且兼备词性标注以及命名实体识别,可以识别人名、地名、机构名等信息。

from pyhanlp import *
sentence = "下雨天地面积水"

# 返回一个list,每个list是一个分词后的Term对象,可以获取word属性和nature属性,分别对应的是词和词性
terms = HanLP.segment(sentence )  
for term in terms:
	print(term.word,term.nature)

关键词提取与自动摘要

from pyhanlp import *

document = "水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露," \
           "根据刚刚完成了水资源管理制度的考核,有部分省接近了红线的指标," \
           "有部分省超过红线的指标。对一些超过红线的地方,陈明忠表示,对一些取用水项目进行区域的限批," \
           "严格地进行水资源论证和取水许可的批准。"

# 提取document的两个关键词
print(HanLP.extractKeyword(document, 2))

# 提取ducument中的3个关键句作为摘要
print(HanLP.extractSummary(document, 3))

依存句法分析

from pyhanlp import *
print(HanLP.parseDependency("徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标。"))

共性分析

共性 是指 文本中词语共同出现的情况。

一阶共性分析也就是统计词频,二阶分析和三阶分析主要用来发现短语。

调用hanlp的共性分析模块,可以发现2个词或者3个词的出现次数(tf)、互信息(mi),左熵(le)、右熵(re)以及score。

参考自:https://blog.csdn.net/fontthrone/article/details/82824202

from pyhanlp import * 
# 共性分析
Occurrence = JClass("com.hankcs.hanlp.corpus.occurrence.Occurrence")
PairFrequency = JClass("com.hankcs.hanlp.corpus.occurrence.PairFrequency")
TermFrequency = JClass("com.hankcs.hanlp.corpus.occurrence.TermFrequency")
TriaFrequency = JClass("com.hankcs.hanlp.corpus.occurrence.TriaFrequency")

occurrence = Occurrence()
occurrence.addAll("在计算机音视频和图形图像技术等二维信息算法处理方面目前比较先进的视频处理算法")
occurrence.compute()

print("一阶共性分析,也就是词频统计")
unigram = occurrence.getUniGram()
for entry in unigram.iterator():
    term_frequency = entry.getValue()
    print(term_frequency)
print()

print('二阶共性分析')
bigram = occurrence.getBiGram()
for entry in bigram.iterator():
    pair_frequency = entry.getValue()
    if pair_frequency.isRight():
        print(pair_frequency)
print()

print('三阶共性分析')
trigram = occurrence.getTriGram()
for entry in trigram.iterator():
    tria_frequency = entry.getValue()
    if tria_frequency.isRight():
        print(tria_frequency)

短语提取

text = "在计算机音视频和图形图像技术等二维信息算法处理方面目前比较先进的视频处理算法"
phraseList = HanLP.extractPhrase(text, 10)
print(phraseList);

文本分类

pyhanlp自带的文本分类器选用朴素贝叶斯模型,训练语料需要自己收集,这里使用搜狗文本分类语料迷你版作为训练语料,下载地址为:

http://file.hankcs.com/corpus/sogou-text-classification-corpus-mini.zip

下载之后将文件放到pyhanlp包的pyhanlp/static/data/test文件夹下,即:

C:\Anaconda3\Lib\site-packages\pyhanlp\static\data\test

然后我们引用github官方的例子,参考链接:

https://github.com/hankcs/pyhanlp/blob/master/tests/demos/demo_text_classification.py

# -*- coding:utf-8 -*-
# Author:hankcs
# Date: 2018-05-23 17:26
import os

from pyhanlp import SafeJClass
from tests.test_utility import ensure_data

NaiveBayesClassifier = SafeJClass('com.hankcs.hanlp.classification.classifiers.NaiveBayesClassifier')
IOUtil = SafeJClass('com.hankcs.hanlp.corpus.io.IOUtil')
sogou_corpus_path = ensure_data('搜狗文本分类语料库迷你版',
                                'http://file.hankcs.com/corpus/sogou-text-classification-corpus-mini.zip')


def train_or_load_classifier():
    model_path = sogou_corpus_path + '.ser'
    if os.path.isfile(model_path):
        return NaiveBayesClassifier(IOUtil.readObjectFrom(model_path))
    classifier = NaiveBayesClassifier()
    classifier.train(sogou_corpus_path)
    model = classifier.getModel()
    IOUtil.saveObjectTo(model, model_path)
    return NaiveBayesClassifier(model)


def predict(classifier, text):
    print("《%16s》\t属于分类\t【%s】" % (text, classifier.classify(text)))
    # 如需获取离散型随机变量的分布,请使用predict接口
    # print("《%16s》\t属于分类\t【%s】" % (text, classifier.predict(text)))


if __name__ == '__main__':
    classifier = train_or_load_classifier()
    predict(classifier, "C罗获2018环球足球奖最佳球员 德尚荣膺最佳教练")
    predict(classifier, "英国造航母耗时8年仍未服役 被中国速度远远甩在身后")
    predict(classifier, "研究生考录模式亟待进一步专业化")
    predict(classifier, "如果真想用食物解压,建议可以食用燕麦")
predict(classifier, "通用及其部分竞争对手目前正在考虑解决库存问题")

文本分类的性能指标:

Classifier+Tokenizer P R F1 文档/秒
NaiveBayesClassifier+HanLPTokenizer 96.16 96.00 96.08 6172
NaiveBayesClassifier+BigramTokenizer 96.36 96.20 96.28 3378
LinearSVMClassifier+HanLPTokenizer 97.24 97.20 97.22 27777
LinearSVMClassifier+BigramTokenizer 97.83 97.80 97.81 12195

情感分析

情感分析和文本分类的默认分类模型一样,也是朴素贝叶斯模型,首先我们需要准备训练数据,这里使用谭松波的酒店评论语料,下载地址为:

http://file.hankcs.com/corpus/ChnSentiCorp.zip

下载之后将文件放到pyhanlp包的pyhanlp/static/data/test文件夹下,即:

C:\Anaconda3\Lib\site-packages\pyhanlp\static\data\test

然后我们引用github官方的例子,参考链接:

https://github.com/hankcs/pyhanlp/blob/master/tests/demos/demo_sentiment_analysis.py

# -*- coding:utf-8 -*-
# Author: hankcs
# Date: 2019-01-07 13:53

from pyhanlp import *
from tests.test_utility import ensure_data

IClassifier = JClass('com.hankcs.hanlp.classification.classifiers.IClassifier')
NaiveBayesClassifier = JClass('com.hankcs.hanlp.classification.classifiers.NaiveBayesClassifier')
# 中文情感挖掘语料-ChnSentiCorp 谭松波
chn_senti_corp = ensure_data("ChnSentiCorp情感分析酒店评论", "http://file.hankcs.com/corpus/ChnSentiCorp.zip")


def predict(classifier, text):
    print("《%s》 情感极性是 【%s】" % (text, classifier.classify(text)))


if __name__ == '__main__':
    classifier = NaiveBayesClassifier()
    #  创建分类器,更高级的功能请参考IClassifier的接口定义
    classifier.train(chn_senti_corp)
    #  训练后的模型支持持久化,下次就不必训练了
    predict(classifier, "前台客房服务态度非常好!早餐很丰富,房价很干净。再接再厉!")
    predict(classifier, "结果大失所望,灯光昏暗,空间极其狭小,床垫质量恶劣,房间还伴着一股霉味。")
predict(classifier, "可利用文本分类实现情感分析,效果不是不行")

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 	状态词

你可能感兴趣的:(【NLP】)