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

  本文针对的问题是 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 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的路径。
 8     private CLibrary Instance = (CLibrary) Native.loadLibrary(
 9             "D:\\test\\NLPIR", CLibrary.class);
10     private boolean initFlag = false;
11
12     public boolean init(){
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 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     }
39
40     public 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 block
46             ex.printStackTrace();
47         }
48         return nativeBytes;
49     }
50
51     public CLibrary getInstance() {
52         return Instance;
53     }
54
55     public boolean isInitFlag() {
56         return initFlag;
57     }
58
59     public 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     // 定义并初始化接口的静态变量
 8
 9     public int NLPIR_Init(String sDataPath, int encoding,
10             String sLicenceCode);
11
12     public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);
13
14     public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,
15             boolean bWeightOut);
16     public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,
17             boolean bWeightOut);
18     public int NLPIR_AddUserWord(String sWord);
19     public int NLPIR_DelUsrWord(String sWord);
20     public String NLPIR_GetLastErrorMsg();
21     public void NLPIR_Exit();
22 }

3.线程类

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

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

  

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

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

时间: 2024-10-12 16:53:38

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

几款开源的中文分词系统

中文分词是做好中文内容检索.文本分析的基础,主要应用于搜索引擎与数据挖掘领域.中文是以词为基本语素单位,而词与词之间并不像英语一样有空格来分隔,因而中文分词的难点在于如何准确而又快速地进行分词 以下介绍4款开源中文分词系统. 1.ICTCLAS – 全球最受欢迎的汉语分词系统 中文词法分析是中文信息处理的基础与关键.中国科学院计算技术研究所在多年研究工作积累的基础上,研制出了汉语词法分析系统ICTCLAS(Institute of Computing Technology, Chinese Le

NLPIR(北理工张华平版中文分词系统)的SDK(C++)调用方法

一.本文内容简介 二.具体内容 1. 中文分词的基本概念 2.关于NLPIR(北理工张华平版中文分词系统)的基本情况 3.具体SDK模块(C++)的组装方式 ①准备内容: ②开始组装 三.注意事项 一.本文内容简介 关于中文分词的基本概念 关于NLPIR(北理工张华平版中文分词系统)的基本情况 具体SDK模块(C++版)的组装方法 二.具体内容 1. 中文分词的基本概念 中文分词是自然语言处理的一个分支,自然语言即人们在日常生活中使用的语言,包含书面语,口语,例如报纸上的一篇通讯,博客里面的一篇

简单中文分词系统的实现

中文分词系统工程报告 一.研究背景 随着互联网的快速发展,信息也呈了爆炸式的增长趋势.在海量的信息中,我们如何快速抽取出有效信息成为了必须要解决的问题.由于信息处理的重复性,而计算机又善于处理机械的.重复的.有规律可循的工作,因此自然就想到了利用计算机来帮助人们进行处理.在用计算机进行自然语言处理时,主要使用的还是基于统计的方法,并且实际的使用中取得了不错的效果. 因为中文句子的特点——没有分隔符来分离句子中的词,所以在进行中文处理的时候,首先要做的就是如何对中文语句进行分词.这也是本次工程所要

中科院中文分词系统ICTCLAS如何在安卓平台上使用

============问题描述============ 最近的安卓开发中需要用到中文分词,就用了中科院的这个分词系统,但是按java应用程序方法引入API中的文件(DATA,ICTCLAS,Configure)等程序总会报错,请问有人在安卓平台上用过吗?麻烦告诉我该如何引用,如果有别的分词系统使用方法也可以~~ ============解决方案1============ dll貌似不能行啊...

2020 Java核心面试问题 100+(附代码)

[本文参考原文地址]http://bjbsair.com/2020-03-09/it/1875/ 毋庸置疑,Java是获得丰厚薪资的主要编程选择之一.毕竟,基于类的通用,面向对象的编程语言是世界上使用最广泛的编程语言之一. Java面试问题 具有许多强大的功能,编程语言不仅是经验丰富的专家的首选,而且是编程领域的新手所追求的.因此,这里有一些重要的Java面试问题,可以帮助您完成Java工作,或者至少可以提高您的学习水平. 问题:什么是Java? 答:?Java是一种最初由James Gosli

Java linux lame 终端执行和代码执行命令生成的文件不一样?

public class Test{ public static void main(String[] args) {try{ String shellString = "lame -b 16 /java/5/a.wav"; String[] cmd = new String[]{"sh","-c",shellString}; Process process = Runtime.getRuntime().exec(cmd); //Process

Java基本的线程操作(附代码)

啦啦啦啦,从头整理一遍java并发的内容.开始是基本的线程操作 线程状态切换: 新建线程: @Test public void newTread(){ Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("ok..."); } }); t1.start(); } 终止线程: Thread.stop() 不推荐使用.它会释放所有monitor 中断线程: publ

java 脚本引擎Rhino执行js代码和文件

测试js脚本引擎 public class helloworld { public static void main(String[] args) throws Exception { //获得脚本引擎对象 ScriptEngineManager sem=new ScriptEngineManager(); ScriptEngine engine=sem.getEngineByName("javascript"); //定义变量,会存储到引擎上下文种,java和js都能取到 engin

中科院NLPIR中文分词java版

摘要:为解决中文搜索的问题,最开始使用PHP版开源的SCWS,但是处理人名和地名时,会出现截断人名地名出现错误.开始使用NLPIR分词,在分词准确性上效果要比SCWS好.本文介绍如何在windows系统下编译JAVA ,生成可以执行的jar文件. NLPIR的下载地址: http://ictclas.nlpir.org/downloads GitHub的地址: https://github.com/NLPIR-team/NLPIR 两个版本有一些不同,本文将分别讲解如何利用Eclipse建立工程