python3.2 调用NLPIR(ICTLAS)2014的方法

很高兴中科院计算所在NLPIR2014版中提供了的间接NLPIR/ICTCLAS 2014 Python API接口!

非常感谢郝碧波(老师/同学)的热情帮助!

该工具的基本原理是,基于NLPIR2014提供的API,写一个Python文件,在py代码中利用ctypes调用NLPIR API的相关库文件中的函数(方法)间接实现分词。

1、下载

https://github.com/haobibo/ICTCLAS_Python_Warpper ,直接解压到任意位置即可,无需安装。

2、修改nlpir.py代码

这里之所以要修改代码,是为了让其能够更好地Python3环境下运行。实际上,nlpir.py文件中,作者已经明确说明了针对Python3需要修改的代码。主要包括以下几点:

1、选择库文件

代码第14行:  libFile = './nlpir/NLPIR64.dll'   作用是选择库文件,库文件的位置在nlpir文件夹中。要根据具体的系统环境,本质上是要根据Python的解释器版本来确定库文件。比如,虽然我的操作是64位的,但是由于我安装的是Python3.2 32位的,所以在这行代码中,我仍然需要选择NLPIR32.dll。

2、注释第219行,取消注释第220行

这里是判断初始化是否成功。具体作法是,将第220行首的###一起移动到219行首即可。第219行为Python2.x准备的,第220是为Python3.x准备的。

Init('',ENCODING.UTF8_CODE,'')  #for py2
if not Init(b'',ENCODING.UTF8_CODE,b'') #for py3

3、设置词性标注集

在该文件最后的例子中,作者并没有给出如何设置词性标注集。但是分析被作者注释的第225到227行代码可以发现,可以通过SetPOSmap( POS_Set)语句来设置词性标注集,其参数POS_Set为0~3之间的int型,代表的标注集分别为:

 0: 计算所二级标注集
 1: 计算所一级标注集
 2: 北大二级标注集
 3: 北大一级标注集

该语句当然要放在调用Seg()方法之前。Seg()为具体实现分词的方法,具体参见文后的示例。

4、注释第248行,取消注释第249行

作法与原因同第2条。

yield (i, a.sPOS)  #py2
yield (i.decode('UTF8'), a.sPOS.decode('UTF8')) #python3

5、设置待分词字符串的编码

代码的最后实际上是给了一个简单的使用示例。由于编码的原因,在Python3中,需要在待分词的字符串后面加上.encode('UTF8'),所以需要将第253行的注释取消;另外,如果要在这里打印该字符串,则需要在后面加上.decode('UTF8')  ,(第254行)

通过上述设置后,nlpir.py就可以顺利执行了。

3、个性化调用

1、在其他Python文件中调用该工具

虽然nlpir.py文件本身已经能够实现分词功能,但是该文件已经较长,涉及内容较多,如果再在它的基础上继续写实现其他功能的代码,总觉得文件过大,编写起来比较麻烦,且容易出错。所以我考虑再建一个py文件,来调用nlpir.py中的函数同样来实现分词。比如,我在与nlpir.py相同目录下新建一个callAPI.py,其代码为:

from nlpir import * #导入nlpir.py文件

#设置词性标注集
SetPOSmap(2) 

#调用nlpir.py中的Seg()函数,对字符串分词
p = '国家主席习近平4月11日到湖北省武汉市考察工作。'
p = p.encode('UTF8')
print(p)
s=''
for t in Seg(p):
    s+= '%s/%s' % (t[0],t[1])
print(s)

2、对文件分词

利用FileProcess(iPath,oPath,isTAG)函数实现。参数含义:

iPath: 待分词文件路径

oPath: 分词结果文件路径

isTAG: 是否需要词性标注。1:需要;0:仅分词 不标注。

如在上述callAPI.py代码中加入下面语句:

FileProcess(b'i.txt',b'o.txt',0) #注意前两个参数前有个b

还可写为:

FileProcess('i.txt'.encode("UTF-8"),'o.txt'.encode("UTF-8"),0)

3、导入用户词典

利用ImportUserDict(dictPath)方法导入用户词典。参数含义:词典文件的路径;方法返回值:int型,从词典中读取出的词条数。该代码当然要放在调用Seg()方法之前

ImportUserDict(b'userdict.txt')  #参数前有个b

词典内容格式为:词+空格或Tab+词性,每词一行。如:国家主席 np

4、示例

以下为上述callAPI.py文件的内容。

说明:

1、所有相关文件的编码统一为utf-8

2、i.txt文件内容:

据新华社电 中共中央总书记、国家主席、中央军委主席习近平14日专程到空军机关就空军建设和军事斗争准备进行调研,代表党中央、中央军委向空军全体官兵致以诚挚的问候,强调要紧紧围绕党在新形势下的强军目标,全面加强部队革命化现代化正规化建设,加快建设一支空天一体、攻防兼备的强大人民空军,为实现中国梦、强军梦提供坚强力量支撑。
9时15分许,习近平来到空军机关指挥楼,了解部队战备值班情况。他观摩空情处置课目指挥演练,对战备值班部队高度戒备、反应灵敏,展现出的良好军政素质和战斗作风给予高度评价。

国家主席 np

注:默认情况下,“国家主席“的分词结果为”国家/n 主席/n“

from nlpir import *

#设置词性标注集
SetPOSmap(2) 

#导入用户词典
print('导入词条数:',ImportUserDict(b'userdict.txt'))

# 字符串文本分词
p = '国家主席习近平4月11日到湖北省武汉市考察工作。'
p = p.encode('UTF-8')
print(p)
s=''
for t in Seg(p): # 调用Seg方法进行分词
  s+= '%s/%s' % (t[0],t[1])  #设置输出字符串的内容及其格式
print(s)

#文件分词
FileProcess(b'i.txt',b'o.txt',1)

#退出
Exit()

结果:

导入词条数: 1
国家主席习近平4月11日到湖北省武汉市考察工作。
国家主席/np习近平/nr4月/t11日/t到/p湖北省/ns武汉市/ns考察/v工作/vn。/w
[Finished in 0.3s]

执行完成后,o.txt内容:

据/p 新华社/nt 电/n   中共中央/nt 总书记/n 、/w 国家主席/np 、/w 中央军委/nt 主席/n 习近平/nr 14日/t 专程/d 到/v 空军/n 机关/n 就/p 空军/n 建设/vn 和/cc 军事/n 斗争/vn 准备/vn 进行/v 调研/vn ,/w 代表/n 党中央/nt 、/w 中央军委/nt 向/p 空军/n 全体/n 官兵/n 致以/v 诚挚/a 的/u 问候/vn ,/w 强调/v 要/v 紧紧/d 围绕/v 党/n 在/p 新/a 形势/n 下/f 的/u 强/a 军/n 目标/n ,/w 全面/ad 加强/v 部队/n 革命化/vn 现代化/vn 正规化/vn 建设/vn ,/w 加快/v 建设/v 一/m 支/q 空/a 天/qt 一体/n 、/w 攻防/v 兼备/v 的/u 强大/a 人民/n 空军/n ,/w 为/p 实现/v 中国/ns 梦/n 、/w 强军/nr 梦/n 提供/v 坚强/a 力量/n 支撑/vn 。/w
9时/t 15分/t 许/v ,/w 习近平/nr 来到/v 空军/n 机关/n 指挥/vn 楼/n ,/w 了解/v 部队/n 战备/vn 值班/vn 情况/n 。/w 他/r 观摩/v 空情/n 处置/vn 课目/n 指挥/vn 演练/vn ,/w 对/p 战备/vn 值班/vn 部队/n 高度/d 戒备/v 、/w 反应/vn 灵敏/an ,/w 展现/v 出/v 的/u 良好/a 军政/n 素质/n 和/cc 战斗/vn 作风/n 给予/v 高度/d 评价/v 。/w

你可能感兴趣的:(python3.2 调用NLPIR(ICTLAS)2014的方法)