本文为本人学习pyhanlp的笔记,大多知识点来源于GitHubhttps://github.com/hankcs/HanLP/blob/master/README.md,文中的demo代码来源于该GitHub主
what's the pyhanlp
pyhanlp是HanLP的Python接口,支持自动下载与升级HanLP,兼容py2、py3。
安装
pip install pyhanlp
安装时可能遇到的问题:
- 报错:error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual
解决方法:手动下载,下载链接:https://pan.baidu.com/s/1WaBxFghTll6Zofz1DGOZBg
- 报错:jpype._jvmfinder.JVMNotFoundException: No JVM shared library file (jvm.dll) found. Try setting up the JAVA_HOME environment variable properly.
解决方法:HanLP主项目采用Java开发,所以需要Java运行环境,请安装JDK。需要保证JDK位数、操作系统位数和Python位数一致。pyhanlp在64位系统上通过了所有测试;在32位系统上可以运行但不做保证。
配置
默认在首次调用pyhanlp时自动下载jar包和数据包,并自动完成配置。
如果网速慢或者其他问题导致配置失败,需要自行下载data文件,然后放入pyhanlp文件的static目录中。下载地址:http://nlp.hankcs.com/download.php?file=data
如果还是失败,请参考https://github.com/hankcs/pyhanlp/wiki/手动配置
一、标准中文分词
使用命令hanlp segment进入交互分词模式,输入一个句子并回车,HanLP会输出分词结果:
$ hanlp segment 商品和服务 商品/n 和/cc 服务/vn 当下雨天地面积水分外严重 当/p 下雨天/n 地面/n 积水/n 分外/d 严重/a 龚学平等领导说,邓颖超生前杜绝超生 龚学平/nr 等/udeng 领导/n 说/v ,/w 邓颖超/nr 生前/t 杜绝/v 超生/vi
还可以重定向输入输出到文件等:
$ hanlp segment <<< '欢迎新老师生前来就餐' 欢迎/v 新/a 老/a 师生/n 前来/vi 就餐/vi
在Python中的实现
from pyhanlp import * print(HanLP.segment('你好,欢迎在Python中调用HanLP的API')) # [你好/vl, ,/w, 欢迎/v, 在/p, Python/nx, 中/f, 调用/v, HanLP/nx, 的/ude1, API/nx] ################### for term in HanLP.segment('下雨天地面积水'): print('{}\t{}'.format(term.word, term.nature)) # 获取单词与词性 ''' 下雨天 n 地面 n 积水 n ''' ################### testCases = [ "商品和服务", "结婚的和尚未结婚的确实在干扰分词啊", "买水果然后来世博园最后去世博会", "中国的首都是北京", "欢迎新老师生前来就餐", "工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作", "随着页游兴起到现在的页游繁盛,依赖于存档进行逻辑判断的设计减少了,但这块也不能完全忽略掉。"] for sentence in testCases: print(HanLP.segment(sentence)) ''' [商品/n, 和/cc, 服务/vn] [结婚/vi, 的/ude1, 和/cc, 尚未/d, 结婚/vi, 的/ude1, 确实/ad, 在/p, 干扰/vn, 分词/n, 啊/y] [买/v, 水果/n, 然后/c, 来/vf, 世博园/n, 最后/f, 去/vf, 世博会/n] [中国/ns, 的/ude1, 首都/n, 是/vshi, 北京/ns] [欢迎/v, 新/a, 老/a, 师生/n, 前来/vi, 就餐/vi] [工信处/n, 女干事/n, 每月/t, 经过/p, 下属/v, 科室/n, 都/d, 要/v, 亲口/d, 交代/v, 24/m, 口/n, 交换机/n, 等/udeng, 技术性/n, 器件/n, 的/ude1, 安装/v, 工作/vn] [随着/p, 页游/nz, 兴起/v, 到/v, 现在/t, 的/ude1, 页游/nz, 繁盛/a, ,/w, 依赖于/v, 存档/vi, 进行/vn, 逻辑/n, 判断/v, 的/ude1, 设计/vn, 减少/v, 了/ule, ,/w, 但/c, 这/rzv, 块/q, 也/d, 不能/v, 完全/ad, 忽略/v, 掉/v, 。/w] '''
说明
- HanLP中有一系列“开箱即用”的静态分词器,以Tokenizer结尾,在接下来的例子中会继续介绍。
- HanLP.segment其实是对StandardTokenizer.segmen的包装。
- 分词结果包含词性,每个词性的意思请查阅《HanLP词性标注集》。
算法详解
二、关键词提取、自动摘要
# 关键词提取 document = "水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露," \ "根据刚刚完成了水资源管理制度的考核,有部分省接近了红线的指标," \ "有部分省超过红线的指标。对一些超过红线的地方,陈明忠表示,对一些取用水项目进行区域的限批," \ "严格地进行水资源论证和取水许可的批准。" print(HanLP.extractKeyword(document, 2)) # [水资源, 陈明忠] # 自动摘要 print(HanLP.extractSummary(document, 3)) # [严格地进行水资源论证和取水许可的批准, 水利部水资源司司长陈明忠9月29日在国务院新闻办举行的新闻发布会上透露, 有部分省超过红线的指标]
# # -*- coding:utf-8 -*- from pyhanlp import * def demo_keyword(content): """ 关键词提取 [程序员, 程序, 分为, 人员, 软件] """ TextRankKeyword = JClass("com.hankcs.hanlp.summary.TextRankKeyword") keyword_list = HanLP.extractKeyword(content, 5) print(keyword_list) if __name__ == "__main__": content = ( "程序员(英文Programmer)是从事程序开发、维护的专业人员。" "一般将程序员分为程序设计人员和程序编码人员," "但两者的界限并不非常清楚,特别是在中国。" "软件从业人员分为初级程序员、高级程序员、系统" "分析员和项目经理四大类。") demo_keyword(content)