【原创】中文分词系统 ICTCLAS2015 的JAVA封装和多线程执行(附代码)
本文针对的问题是 ICTCLAS2015 的多线程分词,为了实现多线程做了简单的JAVA封装。如果有需要可以自行进一步封装其它接口。
首先ICTCLAS2015的传送门(http://ictclas.nlpir.org/),其对中文分词做的比较透彻,而且有一定的可调式性。但是应用到实际开发中的话,多线程操作是必须的,因此有了本文的初衷。
可能有的小伙伴不太清楚ICTCLASS是干嘛的,下面是一段介绍:NLPIR汉语分词系统(又名ICTCLAS2015),主要功能包括中文分词;词性标注;命名实体识别;用户词典功能;支持GBK编码、UTF8编码、BIG5编码。新增微博分词、新词发现与关键词提取;张华平博士先后倾力打造十余年,内核升级10次。全球用户突破20万,先后获得了2010年钱伟长中文信息处理科学技术奖一等奖,2003年国际SIGHAN分词大赛综合第一名,2002年国内973评测综合第一名。
虽然其开放文档里有指出是支持多线程操作的,但是并没给出具体的方法。所以本文主要针对ICTCLAS2015的分词操作做了JAVA封装,并实现了Windows和Linux下的多线程操作。
本文并不太多的涉及如何使用ICTCLAS,如果有需要可以去上面的网址查询开发文档。
似乎也没太大需要介绍的了,下面是具体的代码:
1.NLPIR类,封装了初始化,分词和释放资源操作。
package test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.sun.jna.Native; public class NLPIR {
//Windows下的加载方式。如果需要支持Linux,需要修改这一行为libNLPIR.so的路径。
private CLibrary Instance = (CLibrary) Native.loadLibrary(
"D:\\test\\NLPIR", CLibrary.class);
private boolean initFlag = false; public boolean init(){
String argu = null;
// String system_charset = "GBK";//GBK----0
int charset_type = 1; int init_flag = Instance.NLPIR_Init(argu, charset_type, "0");
String nativeBytes = null; if (0 == init_flag) {
nativeBytes = Instance.NLPIR_GetLastErrorMsg();
System.err.println("初始化失败!fail reason is "+nativeBytes);
return false;
}
initFlag = true;
return true;
} public boolean unInit(){
try {
Instance.NLPIR_Exit();
} catch (Exception e) {
System.out.println(e);
return false;
}
initFlag = false;
return true;
} public String parseSen(String str){
String nativeBytes = null;
try {
nativeBytes = Instance.NLPIR_ParagraphProcess(str, 0);
} catch (Exception ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
return nativeBytes;
} public CLibrary getInstance() {
return Instance;
} public boolean isInitFlag() {
return initFlag;
} public static void main(String[] args) {
NLPIR tt = new NLPIR();
tt.init();
String str = "最近,内江威远县一名7岁的患脑瘤的小男孩卧床不起。由于治愈无望,小男孩的母亲聂晓红在决定捐献儿子器官的同时,希望儿子的父亲能回来看看儿子。“儿子4年多没有见爸爸了,如果父子俩能见最后一面多好啊。”小男孩的愿望让母亲泣不成声然而,4年来谁都不知道小男孩的父亲人在何方,聂晓红只得向成都商报求助。6月10日,成都商报客户端及新浪官方微博发出“寻人”消息。几经周折,孩子父亲李连兴终于得知消息。12日晚,李连兴从广东东莞赶至威远,见到了病危的儿子。听到儿子叫“爸爸”,看到儿子的状况,他流下了无声的泪水。他表示,自己对不起儿子,一定要陪在儿子身边,不再离开。";
str = tt.parseSen(str.replaceAll("[\\pP‘’“”]", "")); System.out.println(str); ExecutorService exec = Executors.newCachedThreadPool();
for(int i=0; i<10; i++)
exec.submit(new ThreadNLP(tt));
exec.shutdown();
tt.unInit();
}
}
2.下面的是接口类
package test; import com.sun.jna.Library; // 定义接口CLibrary,继承自com.sun.jna.Library
public interface CLibrary extends Library {
// 定义并初始化接口的静态变量 public int NLPIR_Init(String sDataPath, int encoding,
String sLicenceCode); public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged); public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,
boolean bWeightOut);
public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,
boolean bWeightOut);
public int NLPIR_AddUserWord(String sWord);
public int NLPIR_DelUsrWord(String sWord);
public String NLPIR_GetLastErrorMsg();
public void NLPIR_Exit();
}
3.线程类
package test;
public class ThreadNLP implements Runnable {
private NLPIR tt;
public ThreadNLP(NLPIR tt){
this.tt = tt;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(tt.parseSen("中国人民解放军保卫祖国"));
}
}
把这三个文件复制到一个package下就可以实现多线程分词了。
整体上没什么太难的东西,算是抛砖引玉了。希望能对大家有帮助!
未经博主允许,不得转载任何文章。
【原创】中文分词系统 ICTCLAS2015 的JAVA封装和多线程执行(附代码)的更多相关文章
- NLPIR(北理工张华平版中文分词系统)的SDK(C++)调用方法
一.本文内容简介 二.具体内容 1. 中文分词的基本概念 2.关于NLPIR(北理工张华平版中文分词系统)的基本情况 3.具体SDK模块(C++)的组装方式 ①准备内容: ②开始组装 三.注意事项 一 ...
- Python环境下NIPIR(ICTCLAS2014)中文分词系统使用攻略
一.安装 官方链接:http://pynlpir.readthedocs.org/en/latest/installation.html 官方网页中介绍了几种安装方法,大家根据个人需要,自行参考!我采 ...
- Java 线程和多线程执行过程分析
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- java封装继承以及多态(含代码)
封装 该露的露,该藏的藏 我们常需设计要追求,"高内聚,低耦合".高内聚就是类的内部数据操作细节自己完成.不允许外部干涉:低耦合:仅暴漏少量的方法给外部使用. 封装(数据的隐藏) ...
- Java基本的线程操作(附代码)
啦啦啦啦,从头整理一遍java并发的内容.开始是基本的线程操作 线程状态切换: 新建线程: @Test public void newTread(){ Thread t1 = new Thread(n ...
- <原创>在PE最后一节中插入补丁程序(附代码)
完整文件 http://files.cnblogs.com/Files/Gotogoo/在PE最后一节中插入补丁程序.zip 在PE文件最后一节中插入补丁程序,是最简单也是最有效的一种,因为PE最后 ...
- 推荐十款java开源中文分词组件
1:Elasticsearch的开源中文分词器 IK Analysis(Star:2471) IK中文分词器在Elasticsearch上的使用.原生IK中文分词是从文件系统中读取词典,es-ik本身 ...
- Java开源中文分词类库
IKAnalyzer IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本.最初,它是以开 ...
- ICTCLA中科院分词工具用法(java)
摘要:为解决中文搜索的问题,最开始使用PHP版开源的SCWS,但是处理人名和地名时,会出现截断人名地名出现错误.开始使用NLPIR分词,在分词准确性上效果要比SCWS好.本文介绍如何在windows系 ...
随机推荐
- 大陆Azure 改版
好吧主页的又改版了这下终于容易区分大陆与国际版的区别了.2014年12月12日起改版. 主页再次沦落为找不到东西的后果,其实很少进入这个主页,一般也直接使用http://manage.windowsa ...
- oracle 11g rac 修改字符集
系统版本: Oracle Linux Server release 5.7 数据库版本: Oracle Database 11g Enterprise Edition Release 11.2.0.3 ...
- IOS开发经验分享
一些IOS开发的心得: 1) [Multiple Threads] IOS多线程注意, 所有的UI操作都必须在主线程上: Any code that will update the UI should ...
- 【转载】link和@import的区别
link和@import的区别 原文地址:http://www.cnblogs.com/zbo/archive/2010/11/17/1879590.html 页面中使用CSS的方式主要有3种:行内添 ...
- Windows Media Player安装了却不能播放网页上的视频
前段时间遇到Windows Media Player安装了却不能播放网页上的视频的问题,在网上查找资料时,发现大部分资料都没能解决我这个问题.偶尔试了网上一牛人的方法,后来竟然解决了.现在再找那个网页 ...
- SSH与EJB 比较
SSH完全的开源产品,如果用SSH就必然会用到大量的开源的东东,从数据库到逻辑到控制到前端,开源产品大拼装, 其中SSH中的三大核心,Struts相当于JSF,spring相当于EJB,hiberna ...
- Xcode8之后 XMPP 重定义问题 Redefinition of module 'dnssd'
在升级Xcode到8之后,原来的关于XMPP的项目运行报错,错误信息为: Redefinition of module 'dnssd' 系统和XMPP框架同时用到了 'dnssd',大概就是错误的原因 ...
- try-catch-finally中return的执行情况分析
try-catch-finally中return的执行情况分析: 1.在try中没有异常的情况下try.catch.finally的执行顺序 try --- finally 2.如果try中有异常,执 ...
- 【转】android 内存泄漏相关收藏博客。
关于android内存泄漏的研究 博客建了几个月,都没有去写,一是因为当时换工作,然后又是新入职(你懂的,好好表现),比较忙:二是也因为自己没有写博客的习惯了.现在还算是比较稳定了,加上这个迭代基 ...
- 1084: [SCOI2005]最大子矩阵 - BZOJ
Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...