分词预处理java代码_【原创】中文分词系统 ICTCLASS2015 的JAVA封装和多线程执行(附代码)...

本文介绍了一种针对ICTCLASS2015分词工具的多线程JAVA封装方案,通过实现Windows和Linux平台下的多线程分词功能,提高了中文分词的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标签:

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

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

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

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

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

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

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

1 packagetest;2 importjava.util.concurrent.ExecutorService;3 importjava.util.concurrent.Executors;4 importcom.sun.jna.Native;5

6 public classNLPIR {7   //Windows下的加载方式。如果需要支持Linux,需要修改这一行为libNLPIR.so的路径。

8 private CLibrary Instance =(CLibrary) Native.loadLibrary(9 "D:\\test\\NLPIR", CLibrary.class);10 private boolean initFlag = false;11

12 public booleaninit(){13 String argu = null;14 //String system_charset = "GBK";//GBK----0

15 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 }28

29 public booleanunInit(){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 }39

40 publicString 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 block

46 ex.printStackTrace();47 }48 returnnativeBytes;49 }50

51 publicCLibrary getInstance() {52 returnInstance;53 }54

55 public booleanisInitFlag() {56 returninitFlag;57 }58

59 public static voidmain(String[] args) {60 NLPIR tt = newNLPIR();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(newThreadNLP(tt));70 exec.shutdown();71 tt.unInit();72 }73 }

2.下面的是接口类

1 packagetest;2

3 importcom.sun.jna.Library;4

5 //定义接口CLibrary,继承自com.sun.jna.Library

6 public interface CLibrary extendsLibrary {7 //定义并初始化接口的静态变量

8

9 public int NLPIR_Init(String sDataPath, intencoding,10 String sLicenceCode);11

12 public String NLPIR_ParagraphProcess(String sSrc, intbPOSTagged);13

14 public String NLPIR_GetKeyWords(String sLine, intnMaxKeyLimit,15 booleanbWeightOut);16 public String NLPIR_GetFileKeyWords(String sLine, intnMaxKeyLimit,17 booleanbWeightOut);18 public intNLPIR_AddUserWord(String sWord);19 public intNLPIR_DelUsrWord(String sWord);20 publicString NLPIR_GetLastErrorMsg();21 public voidNLPIR_Exit();22 }

3.线程类

1 packagetest;2

3 public class ThreadNLP implementsRunnable {4

5 privateNLPIR tt;6

7 publicThreadNLP(NLPIR tt){8 this.tt =tt;9 }10 @Override11 public voidrun() {12 //TODO Auto-generated method stub

13 System.out.println(tt.parseSen("中国人民解放军保卫祖国"));14 }15

16 }

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

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

转载请注明出处,谢谢~  http://www.cnblogs.com/xiaoboCSer/p/4580985.html

标签:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值