700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【原创】中文分词系统 ICTCLAS 的JAVA封装和多线程执行(附代码)

【原创】中文分词系统 ICTCLAS 的JAVA封装和多线程执行(附代码)

时间:2019-06-10 04:19:49

相关推荐

【原创】中文分词系统 ICTCLAS 的JAVA封装和多线程执行(附代码)

本文针对的问题是 ICTCLAS 的多线程分词,为了实现多线程做了简单的JAVA封装。如果有需要可以自行进一步封装其它接口。

首先ICTCLAS的传送门(/),其对中文分词做的比较透彻,而且有一定的可调式性。但是应用到实际开发中的话,多线程操作是必须的,因此有了本文的初衷。

可能有的小伙伴不太清楚ICTCLASS是干嘛的,下面是一段介绍:NLPIR汉语分词系统(又名ICTCLAS),主要功能包括中文分词;词性标注;命名实体识别;用户词典功能;支持GBK编码、UTF8编码、BIG5编码。新增微博分词、新词发现与关键词提取;张华平博士先后倾力打造十余年,内核升级10次。全球用户突破20万,先后获得了钱伟长中文信息处理科学技术奖一等奖,国际SIGHAN分词大赛综合第一名,2002年国内973评测综合第一名。

虽然其开放文档里有指出是支持多线程操作的,但是并没给出具体的方法。所以本文主要针对ICTCLAS的分词操作做了JAVA封装,并实现了Windows和Linux下的多线程操作。

本文并不太多的涉及如何使用ICTCLAS,如果有需要可以去上面的网址查询开发文档。

似乎也没太大需要介绍的了,下面是具体的代码:

1.NLPIR类,封装了初始化,分词和释放资源操作。

1 package test; 2 import java.util.concurrent.ExecutorService; 3 import java.util.concurrent.Executors; 4 import com.sun.jna.Native; 5 6 public class NLPIR { 7 //Windows下的加载方式。如果需要支持Linux,需要修改这一行为libNLPIR.so的路径。 8private CLibrary Instance = (CLibrary) Native.loadLibrary( 9 "D:\\test\\NLPIR", CLibrary.class); 10private boolean initFlag = false;1112public boolean init(){13 String argu = null;14 // String system_charset = "GBK";//GBK----015 int charset_type = 1;16 17 int init_flag = Instance.NLPIR_Init(argu, charset_type, "0");18 String nativeBytes = null;19 20 if (0 == init_flag) {21 nativeBytes = Instance.NLPIR_GetLastErrorMsg();22 System.err.println("初始化失败!fail reason is "+nativeBytes);23 return false;24 }25 initFlag = true;26 return true;27}2829public boolean unInit(){30 try {31 Instance.NLPIR_Exit();32 } catch (Exception e) {33 System.out.println(e);34 return false;35 }36 initFlag = false;37 return true;38}3940public String parseSen(String str){41 String nativeBytes = null;42 try {43 nativeBytes = Instance.NLPIR_ParagraphProcess(str, 0);44 } catch (Exception ex) {45 // TODO Auto-generated catch block46 ex.printStackTrace();47 }48 return nativeBytes;49}5051public CLibrary getInstance() {52 return Instance;53}54 55public boolean isInitFlag() {56 return initFlag;57}5859public static void main(String[] args) {60 NLPIR tt = new NLPIR();61 tt.init();62 String str = "最近,内江威远县一名7岁的患脑瘤的小男孩卧床不起。由于治愈无望,小男孩的母亲聂晓红在决定捐献儿子器官的同时,希望儿子的父亲能回来看看儿子。“儿子4年多没有见爸爸了,如果父子俩能见最后一面多好啊。”小男孩的愿望让母亲泣不成声然而,4年来谁都不知道小男孩的父亲人在何方,聂晓红只得向成都商报求助。6月10日,成都商报客户端及新浪官方微博发出“寻人”消息。几经周折,孩子父亲李连兴终于得知消息。12日晚,李连兴从广东东莞赶至威远,见到了病危的儿子。听到儿子叫“爸爸”,看到儿子的状况,他流下了无声的泪水。他表示,自己对不起儿子,一定要陪在儿子身边,不再离开。";63 str = tt.parseSen(str.replaceAll("[\\pP‘’“”]", ""));64 65 System.out.println(str);66 67 ExecutorService exec = Executors.newCachedThreadPool();68 for(int i=0; i<10; i++)69 exec.submit(new ThreadNLP(tt));70 exec.shutdown();71 tt.unInit();72}73 }

2.下面的是接口类

1 package test; 2 3 import com.sun.jna.Library; 4 5 // 定义接口CLibrary,继承自com.sun.jna.Library 6 public interface CLibrary extends Library { 7// 定义并初始化接口的静态变量 89public int NLPIR_Init(String sDataPath, int encoding,10 String sLicenceCode);11 12public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);13 14public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,15 boolean bWeightOut);16public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,17 boolean bWeightOut);18public int NLPIR_AddUserWord(String sWord);19public int NLPIR_DelUsrWord(String sWord);20public String NLPIR_GetLastErrorMsg();21public void NLPIR_Exit();22 }

3.线程类

1 package test; 2 3 public class ThreadNLP implements Runnable { 4 5private NLPIR tt; 67public ThreadNLP(NLPIR tt){ 8 this.tt = tt; 9}10@Override11public void run() {12 // TODO Auto-generated method stub13 System.out.println(tt.parseSen("中国人民解放军保卫祖国"));14}15 16 }

把这三个文件复制到一个package下就可以实现多线程分词了。

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

未经博主允许,任何文章。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。