python nlpir_NLPIR(ICTCLAS 2013)分词工具Python封装
本文只适用于python-nlpir V1.0版本,有关V2.0版本详情参照项目源代码。
python-nlpir是NLPIR中文分词工具的Python封装,利用SWIG完成C++到python的接口转换。
NLPIR汉语分词系统(又名ICTCLAS2013),主要功能包括中文分词;词性标注;命名实体识别;用户词典功能;支持GBK编码、UTF8编码、BIG5编码。新增微博分词、新词发现与关键词提取;是当前最好的中文分词工具之一。
1、使用SWIG进行接口转换
SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支持语言列表中也包括非脚本编译语言,例如C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及R,甚至是编译器或者汇编的计划应用(Guile, MzScheme, Chicken)。SWIG普遍应用于创建高级语言解析或汇编程序环境,用户接口,作为一种用来测试C/C++或进行原型设计的工具。SWIG还能够导出XML或Lisp s-expressions格式的解析树。SWIG可以被自由使用,发布,修改用于商业或非商业中。
1)编写interface文件
%module NLPIR
%{
#define SWIG_FILE_WITH_INIT
#include "NLPIR.h"
%}
#define POS_MAP_NUMBER 4
#define ICT_POS_MAP_FIRST 1
#define ICT_POS_MAP_SECOND 0
#define PKU_POS_MAP_SECOND 2
#define PKU_POS_MAP_FIRST 3
#define POS_SIZE 40
#define GBK_CODE 0
#define UTF8_CODE GBK_CODE+1
#define BIG5_CODE GBK_CODE+2
#define GBK_FANTI_CODE GBK_CODE+3
bool NLPIR_Init(const char * sDataPath=0,int encode=GBK_CODE,const char*sLicenceCode=0);
bool NLPIR_Exit();
const char * NLPIR_ParagraphProcess(const char *sParagraph,int bPOStagged=1);
const result_t * NLPIR_ParagraphProcessA(const char *sParagraph,int *pResultCount,bool bUserDict=true);
int NLPIR_GetParagraphProcessAWordCount(const char *sParagraph);
void NLPIR_ParagraphProcessAW(int nCount,result_t * result);
double NLPIR_FileProcess(const char *sSourceFilename,const char *sResultFilename,int bPOStagged=1);
unsigned int NLPIR_ImportUserDict(const char *sFilename);
int NLPIR_AddUserWord(const char *sWord);//add by qp 2008.11.10
int NLPIR_SaveTheUsrDic();
int NLPIR_DelUsrWord(const char *sWord);
double NLPIR_GetUniProb(const char *sWord);
bool NLPIR_IsWord(const char *sWord);
const char * NLPIR_GetKeyWords(const char *sLine,int nMaxKeyLimit=50,bool bWeightOut=false);
const char * NLPIR_GetFileKeyWords(const char *sFilename,int nMaxKeyLimit=50,bool bWeightOut=false);
const char * NLPIR_GetNewWords(const char *sLine,int nMaxKeyLimit=50,bool bWeightOut=false);
const char * NLPIR_GetFileNewWords(const char *sFilename,int nMaxKeyLimit=50,bool bWeightOut=false);
unsigned long NLPIR_FingerPrint(const char *sLine);
int NLPIR_SetPOSmap(int nPOSmap);
bool NLPIR_NWI_Start();//New Word Indentification Start
int NLPIR_NWI_AddFile(const char *sFilename);
bool NLPIR_NWI_AddMem(const char *sText);
bool NLPIR_NWI_Complete();
const char * NLPIR_NWI_GetResult(bool bWeightOut=false);
unsigned int NLPIR_NWI_Result2UserDict();
2)接口转换
swig -c++ -python NLPIR.interface
执行完成接口转换后,将生成NLPIR_wrap.cxx、NLPIR.py两个文件,到目前为止已经完成了接口的转换,不过现在接口还不能使用,因为还没有编译好相应的库。
2、编写setup.py文件
'''
setup.py file for NLPIR
'''
from distutils.core import setup, Extension
NLPIR_module = Extension('_NLPIR',sources=['NLPIR_wrap.cxx'], libraries = ['NLPIR'])
setup(name = 'NLPIR',
version = '1.1',
author = 'Killua',
description = 'Python for NLPIR',
ext_modules = [NLPIR_module],
py_modules = ['NLPIR'],
)
3、编译代码
1)复制libNLPIR.so到/usr/lib目录下
sudo cp libNLPIR.so /usr/lib
2)修改NLPIR.h文件
由于原来的NLPIR.h在gcc编译器中的兼容性并不好,所以需要对原来的头文件进行简单的修改。
将
#ifdef OS_LINUX
#define NLPIR_API
#else
#ifdef NLPIR_EXPORTS
#ifdef CSHARP_API
#define NLPIR_API extern "C" __declspec(dllexport)
#else
#define NLPIR_API __declspec(dllexport)
#endif
#else
#ifdef CSHARP_API
#define NLPIR_API extern "C" __declspec(dllimport)
#else
#define NLPIR_API __declspec(dllimport)
#endif
#endif
#endif
#if defined(NLPIR_JNI_EXPORTS)||defined(KEYEXTRACT_EXPORTS)
#define NLPIR_API
#endif
改为
#ifdef linux
#define NLPIR_API
#elif _WIN32 || _WIN64
#ifdef NLPIR_EXPORTS
#define NLPIR_API __declspec(dllexport)
#else
#define NLPIR_API __declspec(dllimport)
#endif
#endif
将
#ifdef OS_LINUXclass CNLPIR {#elseclass __declspec(dllexport) CNLPIR {#endif
改为
3)编译代码
python setup.py build_ext --inplace
4、编写PyNLPIR.py
为了方便使用对生成的NLPIR.py进行重封装。
#!/usr/bin/env python
#coding:utf-8
'''
Created on Fri 19, 2013
@author: killua
@e-mail: killua_hzl@163.com
@Decription: Python for NLPIR
'''
import NLPIR
import os
def nlpir_init(init_dir = '.', code_type = 'GBK'):
'''
Init the analyzer and prepare necessary data for NLPIR according the configure file.
'''
if code_type == 'GBK':
is_succeed = NLPIR.NLPIR_Init(init_dir, NLPIR.GBK_CODE)
elif code_type == 'UTF-8' or code_type == 'UTF8':
is_succeed = NLPIR.NLPIR_Init(init_dir, NLPIR.UTF8_CODE)
elif code_type == 'BIG5':
is_succeed = NLPIR.NLPIR_Init(init_dir, NLPIR.BIG5_CODE)
elif code_type == 'GBK_FANTI':
is_succeed = NLPIR.NLPIR_Init(init_dir, NLPIR.GBK_FANTI_CODE)
if is_succeed:
print 'NLPIR Successful.'
else:
print 'NLPIR Failed.'
def nlpir_exit():
'''
Exit the program and free all resources and destroy all working buffer used in NLPIR.
'''
return NLPIR.NLPIR_Exit()
def nlpir_import_user_dict(user_dict):
'''
Import user-defined dictionary from a text file.
'''
return NLPIR.NLPIR_ImportUserDict(user_dict)
def nlpir_paragraph_process(text, is_pos_tagged = False):
'''
Process a paragraph
'''
return NLPIR.NLPIR_ParagraphProcess(text, is_pos_tagged)
def nlpir_file_process(source_file, target_file, is_pos_tagged = False):
'''
Process a text file
'''
return NLPIR.NLPIR_FileProcess(source_file, target_file, is_pos_tagged)
def nlpir_add_user_word(word):
'''
Add a word to the user dictionary.
'''
return NLPIR.NLPIR_AddUserWord(word)
def nlpir_save_user_dict():
'''
Save the user dictionary to disk.
'''
return NLPIR.NLPIR_SaveTheUsrDic()
def nlpir_delete_user_word(word):
'''
Delete a word from the user dictionary.
'''
return NLPIR.NLPIR_DelUsrWord(word)
测试
编写demo.py
#!/usr/bin/env python
#encoding: utf8
from PyNLPIR import *
if __name__ == '__main__':
nlpir_init('.', 'UTF-8')
print nlpir_paragraph_process(r'@ICTCLAS张华平博士 应各位ICTCLAS用户的要求,张华平博士提前发布ICTCLAS2013 版本,为了与以前工作进行大的区隔,并推广NLPIR自然语言处理与信息检索共享平台,从本版本开始,系统名称调整为NLPIR汉语分词系统。')
print nlpir_paragraph_process(r'“屌丝”这个嘲讽意味的代词迅速爆红,迎合了大众的心理和趣味。因为你会发现从表面符合屌丝定义的人,到和屌丝属性八竿子打不着的人,都在争相认领这一名号。当人人都在忙着确认自己的屌丝身份,并乐此不疲时,屌丝一词一定与时代的什么特征实现了合拍。“屌丝”不是阿Q,他们公然比惨并乐在其中有评论认为,“屌丝”是新时代的阿Q,两者并不完全相同。首先,阿Q是文学巨匠鲁迅一己之力创造的,而“屌丝”则是网络群体狂欢的结果,它是真正由网民集体创作的形象;另外,阿Q最重要的特征是“精神胜利法”,梦想的是“银盔银甲”,意淫的是“我手持钢鞭将你打”。', True)
nlpir_exit()
运行结果
image
常见问题
“Unable to find vcvarsall.bat”解决办法
提示找不到NLPIR模块提示找不到NLPIR模块的文件
Windows:将NLPIR.dll copy到System32下
Linux:将libNLPIR.so copy到/usr/lib或者/usr/lib64下
提示License过期
Change Log
Date: 2013-11-15- 添加对Window 64bit和Linux 64bit的支持。- 对项目文件结构进行调整,将library文件进行分离。- 将NLPIR升级到最新版本。
感谢
Version 1.1: 感谢zzdwcm,所提供有关Linux 64bit的补丁。
参考资料
python nlpir_NLPIR(ICTCLAS 2013)分词工具Python封装相关推荐
- python常用的集成开发工具,python的主流开发工具
有哪些值得推荐的 Python 开发工具 推荐5个非常适合Python小白的开发工具:1.Python TutorPython Tutor是由Philip Guo开发的一个免费教育工具,可帮助开发者攻 ...
- python图形化界面开发工具,python如何做图形化界面
Python tkinter能做出好看的图形界面么 谷歌人工智能写作项目:小发猫 python 图形化界面 使用wxpython,import wxapp = ()win = wx.Frame(Non ...
- python捷豹_图像处理基本工具——Python 环境下的 Pillow( PIL )
由于笔者近期的研究课题与图像后处理有关,需要通过图像处理工具对图像进行变换和处理,进而生成合适的训练图像数据.该系列文章即主要记录笔者在不同的环境下进行图像处理时常用的工具和库.在 Python 环境 ...
- python 写入excel_实用小工具python数组快速写入excel表格
在进行数值计算时有时会产生大量的数据,有时候需要与其他软件计算的数据进行对比,这时候将数据输出excel表格就很重要了. 借助openpyxl可以方便地输出相应的数据,精简版如下: from open ...
- 结巴分词python安装_“结巴”分词:做最好的Python分词组件
python 结巴分词学习 https://www.toutiao.com/a6643201326710784520/ 2019-01-06 10:14:00 结巴分词(自然语言处理之中文分词器) j ...
- 磁盘清理工具(python)
磁盘清理工具(python) 文章目录 磁盘清理工具(python) 一.python代码 二.打包exe 一.python代码 # 删除文件夹下面的所有文件(只删除文件,不删除文件夹) import ...
- 图片坐标提取软件/图片坐标点和像素点颜色提取软件/图片坐标获取工具/Python图片坐标获取源码/图片像素坐标获取软件/python tkinter 图片显示(完全开源)
该软件使用python写的,可以提取像素点的坐标还有也能获取像素点的16进制数据RGB565和RGB888(RGB888仅最新的源码才支持),可以单点坐标也可以按键坐标,甚至可以使用简单的左右键配合使 ...
- 【Python】网页信息筛选工具
[Python]网页信息筛选工具 视频地址:[Python]网页信息筛选工具_哔哩哔哩_bilibili 下载地址:[Python]网页信息筛选工具-Python文档类资源-CSDN下载 简介: 1. ...
- python 分词工具训练_中文分词入门和分词工具汇总攻略
[注意]如果寻找分词和文本分析软件,为了完成内容分析和其他文本研究任务,直接使用集搜客分词和文本分析软件就可以了.本文是为了讲解集搜客分词和文本分析的实现原理,是给产品设计者和开发者看的. 最近在整理 ...
- 资源 | Python中文分词工具大合集
跟着博主的脚步,每天进步一点点 这篇文章事实上整合了之前文章的相关介绍,同时添加一些其他的Python中文分词相关资源,甚至非Python的中文分词工具,仅供参考. 首先介绍之前测试过的8款中文分词工 ...
最新文章
- 剑指offer:面试题28. 对称的二叉树
- win下的输入流结束符
- 设置MySQL服务的字符集为uft8
- 高通android开发摘要
- ninject 的 实现 的 理解
- @RequestParam和@RequestBody的区别 (结合 Get/Post )
- mysql 5.6.29.tar.gz_编译安装mysql5.6.29及安装报错的解决方法
- Codeforces Round #655 (Div. 2) B. Omkar and Last Class of Math 数学
- 为Ubuntu Server 安装图形桌面环境
- make -j32 21 | tee show.log
- CentOS 系统盘迁移
- (10)Zynq IIC控制器介绍
- 三年蜜罐实验:黑客想从物联网设备中得到什么?
- webp批量转换jpg_转换文件格式快人一步!右键菜单直接转换,支持图片、文档、视频等……...
- [转载] Python Web开发—进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程
- sublime text mac版实施输入处理程序的技巧
- linux中生成考核用的NTFS文件系统结构样例(一)
- 强化学习(RL)AlphaGo Zero训练五子棋
- Tomcat 500错误:实例化Servlet类异常
- Vim中如何全选并复制?
热门文章
- 计算机系统的日常运行维护,浅谈计算机系统的日常维护管理
- w10 计算机配置管理模板,Win10系统创建自定义默认用户配置文件
- 我的编程之路——VB篇
- 计算机cmd管理员,cmd获取管理员权限的命令是什么
- html信纸效果,纯css3实现信纸/同学录效果(代码示例)
- 下行文格式图片_写信封的正确格式图片 看完这些你就懂了
- TP-LINK无线网卡免驱版 安装使用问题整理
- 开源电路仿真软件CircuitJS1介绍与使用入门
- VM虚拟机浏览器替代软件-VMLogin虚拟多登指纹浏览器,超级浏览器,防关联浏览器
- Kendo UI使用方法与教程