java多线程 封装_【原创】中文分词系统 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下就可以实现多线程分词了。

整体上没什么太难的东西,算是抛砖引玉了。希望能对大家有帮助!

未经博主允许,不得转载任何文章。

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并发的内容.开始是基本的线程操作 线程状态切换: 新建线程: @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系 ...

中文分词工具探析(一):ICTCLAS (NLPIR)

1. 前言 ICTCLAS是张华平在2000年推出的中文分词系统,于2009年更名为NLPIR.ICTCLAS是中文分词界元老级工具了,作者开放出了free版本的源代码(1.0整理版本在此). 作者在 ...

随机推荐

Python验证码6位自动生成器

Python验证码6位自动生成器

poj3368(RMQ——ST)

Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16543   Accepted: 5985 ...

编译libjpeg库

最近在写车牌识别软件,需要用到BMP转成JPG的功能,自然就想到借助libjpeg来实现 OS: win7 64位 编译器: VS2008 1. 下载源代码下载地址:http://www.ijg.or ...

python---sys

简介 sys模块用于提供对python解释器的相关操作 sys.argv 命令行参数List,第一个元素是程序本身路径 sys.modules 返回系统导入的模块字段,key是模块名,value是模块 ...

C++11 多线程 基础

C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等,使用 ...

CentOS 7 结构体GCC 4.8.2 32位编译环境

centos 7 结构体gcc 32位编译环境 1介绍 1.1背景 学习新 C++ 2011和C11标准. 1.2使用软件 CentOS 7(Linux version 3.10.0-123.el7. ...

分享一个javascript alert精简框架

如果你不喜欢浏览器自带的alert你可以尝试总共不超过10KB somke js  下载地址:http://smoke-js.com/ 使用方法 somke.alert("hello wor ...

index_merge引发的死锁排查

概述 前几天排查了一个死锁问题,最开始百思不得其解,因为发生死锁的两个事务是单语句事务,语句类型相同(where属性列相同,仅值不同),而且语句都走了相同的索引,但最终确实发生了死锁.通过定位排查发现 ...

ie、firefox、chrome中关于style=";display:block"; 引发的页面布局错乱的解决办法

ie.firefox.chrome中关于style="display:block" 引发的页面布局错乱的解决办法: table中tr 添加style="display:b ...

mybatis generator生成文件大小写问题

mybatis generator插件中,如果 mysql数据表中的字段是用下划线划分的(个人一般都是喜欢这么创建表的字段,如:company_name),那么生成的Vo中会自动对应为companyN ...

你可能感兴趣的:(java多线程,封装)