转载请注明出处: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所需文件

使用自定义的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.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文件中都有单一列进行词汇增加:

可能出现的问题:
字符集文件加载失败: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

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

  1. python提取高频词_cygwin下用Python+jieba给文本分词并提取高频词

    本文信息本文由方法SEO顾问发表于2015-05-3023:05:55,共 2000 字,转载请注明:cygwin下用Python+jieba给文本分词并提取高频词_[方法SEO顾问],如果我网站的文 ...

  2. Python——利用AC自动机进行关键词提取

    Python--利用AC自动机进行关键词提取 目标:在之前写的文章[Python实现多模匹配--AC自动机]基础上,安装gcc(C编译器),再装ahocorasick ,并完成从文本中提取关键词的任务 ...

  3. python 英文文本中的关键词提取

    python 英文关键词提取详细教程: https://opensourcelibs.com/lib/pytextrank # To install from PyPi: 慢就加镜像 -i pytho ...

  4. python初学者笔记——百度搜索关键词提取问题解决

    声明:本文为作者原创,转载请标明出处,欢迎大家共同学习讨论.文章中有其他文章的链接,如有侵权,请及时联系我,进行处理. 引用的文章: 爬虫行动被限制,改换ip只是其中一个办法 python爬虫设置请求 ...

  5. Spring Boot中对自然语言处理工具包hanlp的调用详解

    2019独角兽企业重金招聘Python工程师标准>>> 概 述 HanLP 是基于 Java开发的 NLP工具包,由一系列模型与算法组成,目标是普及自然语言处理在生产环境中的应用.而 ...

  6. Python调用kafka构建完整实例分析与应用!

    近期遇到一个需求就是我们需要把当前比较耗费资源的接口开发成异步通讯的机制,简单来说就是有一个消息队列来不停地进行消息的集中分发与任务处理,这里应用端给出的方案是使用kafka来做,但是这个我在之前没有 ...

  7. windows下kafka环境完整搭建,Python调用kafka构建完整实例分析与应用

    今天临近下班的时候来了一个需求就是我们需要把当前比较耗费资源的接口开发成异步通讯的机制,简单来说就是有一个消息队列来不停地进行消息的集中分发与任务处理,这里应用端给出的方案是使用kafka来做,但是这 ...

  8. python调用jenkinsAPI构建jenkins,并传递参数

    安装jenkins 安装jenkins很简单,可以用多种方式安装,这里知道的有: 在官网下载rpm包,手动安装,最费事 centos系统通过yum安装,ubuntu通过apt-get安装(不推荐,因为 ...

  9. 【自然语言处理-1】TF-IDF简单最实用的关键词提取技术

    自然语言处理历史 阶段 时间 发展意义 早期阶段 1956 年以前 香农曾提出过概率模型来描述语言,乔姆斯基提出了基于规则的上下文无关文法.阶段还没有太明确的产出,只有一些简单的拼凑 快速发展 195 ...

最新文章

  1. Jquery和PHP Ajax JSON
  2. C#3.0笔记(五)Lambda表达式
  3. ACM模板--邻接矩阵 有向图
  4. JAVA自动补全插件
  5. 百度金融资深产品经理降峰:互金产品如何准确触达用户
  6. linux 定时备份mysql数据库
  7. python文件封装成jar_【Python】Python文件打包为可执行文件
  8. 页面的访问速度如何提高?(我所知道的,哪位高手有其它的高见,敬请提醒....)...
  9. u盘在磁盘管理可以显示 但是电脑中找不到_U盘无法识别怎么办?试试这种方法,没准还有救!...
  10. 为什么饿着饿着就不饿了
  11. MySQL通过命令修改密码
  12. VB 提取TextBox 文本框中指定一行字符串
  13. 并发编程---死锁||递归锁---信号量---Event事件---定时器
  14. 淘宝获得淘宝商品类目 API
  15. sqlserver按'一二三四五'排序(hibernate对中文数字进行排序)
  16. 2015年数模A题太阳影子定位学习笔记
  17. 统计学三大相关性系数(pearson、spearman、kendall)的区别。
  18. 2018Android面试题总结 上(附答案)
  19. 史上超级详细:银行外包java面试题目
  20. 《痞子衡嵌入式半月刊》 第 1 期

热门文章

  1. 西南大学计算机专硕907,西南大学907电子信息
  2. 最大池化层mp:3*3_您所说的话:电池寿命最大化提示
  3. HTML的文本输入框、密码输入框
  4. elementUI 使用 el-select 的远程搜索功能,导致数据无法回显怎么解决?
  5. Android项目运行提示unfortunately,xxx has stopped
  6. 2020-03-31 获取微信好友真实地址
  7. linux setfont设置大小,setfont命令
  8. Mysql的基本操作和用户权限----2021(ZSD版)
  9. 3dmax软件怎么保存低版本的模型
  10. 寫一個智能聊天機器人