自然语言处理之hanlp,Python调用与构建,分词、关键词提取、命名主体识别

转载请注明出处:https://blog.csdn.net/HHTNAN

HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。在Python中一种是直接调用hanlp的接口pyhanlp.还有就是导入其基于Java的原始配置文件。

关于pyhanlp

HanLP的Python接口,支持自动下载与升级HanLP,兼容py2、py3。

安装

pip install pyhanlp

首次下载基本都会报错,请参考配置网站进行配置,或者参考此链接也可以

服务器

通过hanlp serve来启动内置的http服务器,默认本地访问地址为:http://localhost:8765 ;也可以访问官网演示页面:http://hanlp.hankcs.com/ 。

升级

通过hanlp update命令来将HanLP升级到最新版。该命令会获取GitHub最新版本并自动下载安装。

欢迎通过hanlp –help查看最新帮助手册。

hanlp

我主要安装的是hanlp,pyhanlp只有少数功能,其他复杂一点的功能需要使用python调用java代码来实现,

安装调用java的JPype1

python调用java需要jpype库,jdk和python 版本位数必须一致,我用的py3.6,也有人用的较低版本,我安装的是pip install JPype1,有些版本直接安装JPype。
通过以下代码测试

# -*- coding:utf-8 -*-
import jpype
from jpype import *
jvmPath = jpype.getDefaultJVMPath()
print(jvmPath)
jpype.startJVM(jvmPath)
jpype.java.lang.System.out.println("hello world!")
java.lang.System.out.println("hello world")
jpype.shutdownJVM()

输出如下形式表示成功
自然语言处理之hanlp,Python调用与构建,分词、关键词提取、命名主体识别_第1张图片

配置HanLP所需文件

使用自定义的HanLP——HanLP由3部分组成:类库hanlp.jar包、模型data包、配置文件hanlp.properties,请前往项目主页下载最新版:https://github.com/hankcs/HanLP/releases。
方式二、下载jar、data、hanlp.properties
HanLP将数据与程序分离,给予用户自定义的自由。

1、下载:data.zip

下载后解压到任意目录,接下来通过配置文件告诉HanLP数据包的位置。

HanLP中的数据分为词典和模型,其中词典是词法分析必需的,模型是句法分析必需的。

data

├─dictionary
└─model
用户可以自行增删替换,如果不需要句法分析等功能的话,随时可以删除model文件夹。

模型跟词典没有绝对的区别,隐马模型被做成人人都可以编辑的词典形式,不代表它不是模型。
GitHub代码库中已经包含了data.zip中的词典,直接编译运行自动缓存即可;模型则需要额外下载。

2、下载jar和配置文件:hanlp-release.zip

下载地址:https://github.com/hankcs/HanLP/releases
配置文件的作用是告诉HanLP数据包的位置,只需修改第一行

root=D:/JavaProjects/HanLP/
为data的父目录即可,比如data目录是/Users/hankcs/Documents/data,那么root=/Users/hankcs/Documents/ 。
自然语言处理之hanlp,Python调用与构建,分词、关键词提取、命名主体识别_第2张图片
最后将hanlp.properties放入classpath即可,对于任何项目,都可以放到src或resources目录下,编译时IDE会自动将其复制到classpath中。除了配置文件外,还可以使用环境变量HANLP_ROOT来设置root。
这里写图片描述
最终上面的两个文件在一个路径,其中的data路径通过root路径进行指定。
如果放置不当,HanLP会提示当前环境下的合适路径,并且尝试从项目根目录读取数据集。

分词

一个简单的例子
startJVM(getDefaultJVMPath(),
         "-Djava.class.path=E:/anaconda/new_library/hanlp-1.2.8.jar;E:/anaconda/new_library",
         "-Xms1g",
         "-Xmx1g")
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment('中国科学院计算技术研究所的教授正在教授自然语言处理课程'))

运行结果
[中国科学院计算技术研究所/nt, 的/ude1, 教授/nnt, 正在/d, 教授/v, 自然语言处理/nz, 课程/n]

一个复杂点的例子

question="请问北京大学怎么走?"
#运行jvm,并引用jar
startJVM(getDefaultJVMPath(),
         "-Djava.class.path=E:/anaconda/new_library/hanlp-1.2.8.jar;E:/anaconda/new_library",
         "-Xms1g",
         "-Xmx1g")
CustomDictionary = JClass('com.hankcs.hanlp.dictionary.CustomDictionary')
# 加载字典
# loadDict(CustomDictionary)
HanLP = JClass('com.hankcs.hanlp.HanLP')
# 中文分词
segment=HanLP.newSegment().enableCustomDictionary(True)
list_word=segment.seg(question)

print(list_word)

运行结果:

[请问/v, 北京大学/nt, 怎么走/nz, ?/w]

上面的loadDict(CustomDictionary)是可以自定义字典的函数,通过自定义字典可以实现较好的分词效果

def  loadDict(customeDictionary):
    loadMovieDict(customeDictionary,'data/dict/movieDict.txt')
    loadGenreDict(customeDictionary, 'data/dict/genreDict.txt')
    loadScoreDict(customeDictionary, 'data/dict/scoreDict.txt')
#对应的三个函数
def loadMovieDict(customeDictionary,file):
    with open(file,'r',encoding='utf-8')as fread:
        for line in fread:
            customeDictionary.add(line.rstrip(),'nm 0')


def loadGenreDict(customeDictionary,file):
    with open(file,'r',encoding='utf-8')as fread:
        for line in fread:
            customeDictionary.add(line.rstrip(),'ng 0')


def loadScoreDict(customeDictionary,file):
    with open(file,'r',encoding='utf-8')as fread:
        for line in fread:
            customeDictionary.add(line.rstrip(),'x 0')

单一字典示例,每一个txt文件中都有单一列进行词汇增加:
自然语言处理之hanlp,Python调用与构建,分词、关键词提取、命名主体识别_第3张图片

可能出现的问题:
字符集文件加载失败:data/dictionary/other/CharType.dat.yes
解决方法,换成最新版本的jar即可,

更多的分词
#!usr/bin/env python
#_*_ coding:utf-8 _*_
from jpype import *

startJVM(getDefaultJVMPath(),
         "-Djava.class.path=E:/anaconda/new_library/hanlp-1.6.6.jar;E:/anaconda/new_library",
         "-Xms1g",
         "-Xmx1g") # 启动JVM,Linux需替换分号;为冒号:

print("="*30+"HanLP分词"+"="*30)
HanLP = JClass('com.hankcs.hanlp.HanLP')
# 中文分词
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+" N-最短路径分词"+"="*30)
# CRFSegment = JClass('com.hankcs.hanlp.seg.CRF.CRFSegment')
# segment=CRFSegment()
# testCase ="今天,刘志军案的关键人物,山西女商人丁书苗在市二中院出庭受审。"
# print(segment.seg("你看过穆赫兰道吗"))
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 = "水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露," \
           "根据刚刚完成了水资源管理制度的考核,有部分省接近了红线的指标," \
           "有部分省超过红线的指标。对一些超过红线的地方,陈明忠表示,对一些取用水项目进行区域的限批," \
           "严格地进行水资源论证和取水许可的批准。"
print("="*30+"关键词提取"+"="*30)
print(HanLP.extractKeyword(document, 8))
print("-"*70)


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


# print("="*30+"地名识别"+"="*30)
# HanLP = JClass('com.hankcs.hanlp.HanLP')
# segment = HanLP.newSegment().enablePlaceRecognize(true)
# testCase=["武胜县新学乡政府大楼门前锣鼓喧天",
#         "蓝翔给宁夏固原市彭阳县红河镇黑牛沟村捐赠了挖掘机"]
# for sentence in testCase :
#   print(HanLP.segment(sentence))
# print("-"*70)
#
# print("="*30+"依存句法分析"+"="*30)
# print(HanLP.parseDependency("徐先生还具体帮助他确定了把画雄鹰、松鼠和麻雀作为主攻目标。"))
# print("-"*70)




text =r"算法工程师\n 算法(Algorithm)是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法工程师就是利用算法处理事物的人。\n \n 1职位简介\n 算法工程师是一个非常高端的职位;\n 专业要求:计算机、电子、通信、数学等相关专业;\n 学历要求:本科及其以上的学历,大多数是硕士学历及其以上;\n 语言要求:英语要求是熟练,基本上能阅读国外专业书刊;\n 必须掌握计算机相关知识,熟练使用仿真工具MATLAB等,必须会一门编程语言。\n\n2研究方向\n 视频算法工程师、图像处理算法工程师、音频算法工程师 通信基带算法工程师\n \n 3目前国内外状况\n 目前国内从事算法研究的工程师不少,但是高级算法工程师却很少,是一个非常紧缺的专业工程师。算法工程师根据研究领域来分主要有音频/视频算法处理、图像技术方面的二维信息算法处理和通信物理层、雷达信号处理、生物医学信号处理等领域的一维信息算法处理。\n 在计算机音视频和图形图像技术等二维信息算法处理方面目前比较先进的视频处理算法:机器视觉成为此类算法研究的核心;另外还有2D转3D算法(2D-to-3D conversion),去隔行算法(de-interlacing),运动估计运动补偿算法(Motion estimation/Motion Compensation),去噪算法(Noise Reduction),缩放算法(scaling),锐化处理算法(Sharpness),超分辨率算法(Super Resolution),手势识别(gesture recognition),人脸识别(face recognition)。\n 在通信物理层等一维信息领域目前常用的算法:无线领域的RRM、RTT,传送领域的调制解调、信道均衡、信号检测、网络优化、信号分解等。\n 另外数据挖掘、互联网搜索算法也成为当今的热门方向。\n"
print("="*30+"短语提取"+"="*30)

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

shutdownJVM()

最终结果,其中注释部分是存在错误的,如果有解决的同学请留言:

E:\anaconda\python.exe E:/pycreate/py_hanlp/hanlp_2.py
==============================HanLP分词==============================
[你好/vl, ,/w, 欢迎/v, 在/p, Python/nx, 中/f, 调用/v, HanLP/nx, 的/ude1, API/nx]
----------------------------------------------------------------------
==============================标准分词==============================
[你好/vl, ,/w, 欢迎/v, 在/p, Python/nx, 中/f, 调用/v, HanLP/nx, 的/ude1, API/nx]
----------------------------------------------------------------------
==============================NLP分词==============================
[中国科学院/nt, 计算/v, 技术/n, 研究所/n, 的/u, 宗成庆/nr, 教授/n, 正在/d, 教授/n, 自然语言处理/v, 课程/n]
----------------------------------------------------------------------
==============================索引分词==============================
主副食品/n [0:4]
主副食/j [0:3]
副食品/n [1:4]
副食/n [1:3]
食品/n [2:4]
----------------------------------------------------------------------
============================== N-最短路径分词==============================
----------------------------------------------------------------------
============================== CRF分词==============================
----------------------------------------------------------------------
============================== 极速词典分词==============================
[江西/ns, 鄱阳湖/ns, 干枯/v, ,/w, 中国/ns, 最/d, 大/a, 淡水湖/n, 变成/v, 大/a, 草原/n]
----------------------------------------------------------------------
============================== 自定义分词==============================
[攻城狮/nz, 逆袭/nz, 单身狗/nz, ,/w, 迎娶/v, 白富美/nr, ,/w, 走上/v, 人生/n, 巅峰/n]
----------------------------------------------------------------------
====================命名实体识别与词性标注==============================
[中国科学院/nt, 计算/v, 技术/n, 研究所/n, 的/u, 宗成庆/nr, 教授/n, 正在/d, 教授/n, 自然语言处理/v, 课程/n]
----------------------------------------------------------------------
==============================关键词提取==============================
[水资源, 陈明忠, 进行, 红线, 部分, 项目, 用水, 国务院新闻办]
----------------------------------------------------------------------
==============================自动摘要==============================
[严格地进行水资源论证和取水许可的批准, 水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露, 有部分省超过红线的指标]
----------------------------------------------------------------------
==============================短语提取==============================
[算法工程师, 算法处理, 一维信息, 算法研究, 信号处理, 信息算法, 通信物理层, 处理算法, 视频算法, 互联网搜索算法]
----------------------------------------------------------------------
JVM has been shutdown

参考文献:

hanlp源码
pyhanlp

你可能感兴趣的:(python,文本分析,自然语言处理,自然语言处理(NLP)专栏)