• 【原创】中文分词系统 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类,封装了初始化,分词和释放资源操作。

     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下就可以实现多线程分词了。

      

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

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

  • 相关阅读:
    [转贴]35岁之前成功12条法则
    any type,any name
    The quick brown fox jumps over the lazy dog.
    [总结]软件工程师笔试题目(C++)
    [转]IOCP介绍
    A simple IOCP Server/Client Class
    Flash for Linux
    看看你是否需要更新SYMBOL文件了??
    [转贴]The Code Project Visual C++ Forum FAQ
    (搜集)一些少走弯路的话语+参考信息
  • 原文地址:https://www.cnblogs.com/xiaoboCSer/p/4580985.html
Copyright © 2020-2023  润新知