很高兴中科院计算所在NLPIR2014版中提供了的间接NLPIR/ICTCLAS 2014 Python API接口!
非常感谢郝碧波(老师/同学)的热情帮助!
该工具的基本原理是,基于NLPIR2014提供的API,写一个Python文件,在py代码中利用ctypes调用NLPIR API的相关库文件中的函数(方法)间接实现分词。
https://github.com/haobibo/ICTCLAS_Python_Warpper ,直接解压到任意位置即可,无需安装。
这里之所以要修改代码,是为了让其能够更好地Python3环境下运行。实际上,nlpir.py文件中,作者已经明确说明了针对Python3需要修改的代码。主要包括以下几点:
代码第14行: libFile = './nlpir/NLPIR64.dll' 作用是选择库文件,库文件的位置在nlpir文件夹中。要根据具体的系统环境,本质上是要根据Python的解释器版本来确定库文件。比如,虽然我的操作是64位的,但是由于我安装的是Python3.2 32位的,所以在这行代码中,我仍然需要选择NLPIR32.dll。
这里是判断初始化是否成功。具体作法是,将第220行首的###一起移动到219行首即可。第219行为Python2.x准备的,第220是为Python3.x准备的。
Init('',ENCODING.UTF8_CODE,'') #for py2
if not Init(b'',ENCODING.UTF8_CODE,b'') #for py3
在该文件最后的例子中,作者并没有给出如何设置词性标注集。但是分析被作者注释的第225到227行代码可以发现,可以通过SetPOSmap( POS_Set)语句来设置词性标注集,其参数POS_Set为0~3之间的int型,代表的标注集分别为:
0: 计算所二级标注集
1: 计算所一级标注集
2: 北大二级标注集
3: 北大一级标注集
该语句当然要放在调用Seg()方法之前。Seg()为具体实现分词的方法,具体参见文后的示例。
作法与原因同第2条。
yield (i, a.sPOS) #py2
yield (i.decode('UTF8'), a.sPOS.decode('UTF8')) #python3
代码的最后实际上是给了一个简单的使用示例。由于编码的原因,在Python3中,需要在待分词的字符串后面加上.encode('UTF8'),所以需要将第253行的注释取消;另外,如果要在这里打印该字符串,则需要在后面加上.decode('UTF8') ,(第254行)
通过上述设置后,nlpir.py就可以顺利执行了。
虽然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)
利用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)
利用ImportUserDict(dictPath)方法导入用户词典。参数含义:词典文件的路径;方法返回值:int型,从词典中读取出的词条数。该代码当然要放在调用Seg()方法之前
ImportUserDict(b'userdict.txt') #参数前有个b
词典内容格式为:词+空格或Tab+词性,每词一行。如:国家主席 np
以下为上述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