Wvtool学习(四):实现wvtool与IK_Analyzer的分词结合

   今天纠结了一天,还是把这个弄出来了!太有成就感了……呵呵

      首先得把IK_Analyzer的jar包放到项目中,然后“当前project”->properities->java build path->add jar 把IKAnalyzer3.2.5Stable.jar增加进去。我用的是这个版本的 嘻嘻!

      现在就可以开始写代码了!我的做法是先看NGramTokenizer的源代码,然后依葫芦画瓢就可以了! 

       不过,画瓢之前呢,还是有必要了解一个IKAnalyzer是怎么分词的,不废话了,直接上分词的代码吧:

  
  
  
  
  1. package com.xh;  
  2. import java.io.IOException;  
  3. import java.io.StringReader;  
  4. import org.wltea.analyzer.IKSegmentation;  
  5. import org.wltea.analyzer.Lexeme;  
  6. public class Segment {  
  7.     public static void main(String[] args)  
  8.     {  
  9.         IKSegmentation seg=null;  
  10.         String text = "苏轼不是圣人,他最可贵的地方是在痛苦彷徨挣扎中," +  
  11.                 "总能把自己的心灵置于更广阔的天地中,如同《赤壁后赋》中横飞而去的老鹤," +  
  12.                 "戛戛于星空夜月,长河大江之上,澄明清澈,皎然不滓。" +  
  13.                 "苏轼是一个善于苦中找乐的人,这种乐观与真趣帮他度过了不少难关。" +  
  14.                 "画家陈丹青说鲁迅是一个有趣的人,我想,拿来说苏东坡一样也行。";  
  15.           
  16.         StringReader reader=new StringReader(text);  
  17.         seg=new IKSegmentation(reader);  
  18.         Lexeme lex=new Lexeme(0000);  
  19.         try {  
  20.             while((lex=seg.next())!=null)  
  21.             {  
  22.                 System.out.print(lex.getLexemeText() + "|");  
  23.             }  
  24.         } catch (IOException e) {  
  25.             // TODO Auto-generated catch block  
  26.             e.printStackTrace();  
  27.         }  
  28.     }  

    如果看不明白,可以看一下IKAnalyzer的api,在我上传的资源中有,直接在51cot里搜索就可以找到了!

    看明白IKAnalyzer是怎么分词后,我们就可以把它跟wvtool结合了,毕竟wvtool的分词不是真正意义上的分词!好了,贴代码吧,尽管我不喜欢很多博客一打开全是代码,但我自己确实也讲不太明白,可能代码能更直白吧:

 

  
  
  
  
  1. package com.xh;  
  2.  
  3. import java.io.IOException;  
  4. import java.io.Reader;  
  5. import java.io.StringReader;  
  6. import java.util.ArrayList;  
  7. import java.util.List;  
  8.  
  9. import org.wltea.analyzer.IKSegmentation;  
  10. import org.wltea.analyzer.Lexeme;  
  11.  
  12.  
  13. import edu.udo.cs.wvtool.generic.tokenizer.SimpleTokenizer;  
  14. import edu.udo.cs.wvtool.generic.tokenizer.WVTTokenizer;  
  15. import edu.udo.cs.wvtool.main.WVTDocumentInfo;  
  16. import edu.udo.cs.wvtool.util.TokenEnumeration;  
  17. import edu.udo.cs.wvtool.util.WVToolException;  
  18. /*  
  19.  * 这个程序是wvtool结合IKAnalyzer的分词而写成的分词代码,  
  20.  * 程序执行的速度有些慢,由于我也是初学,对于其中的原理也  
  21.  * 不甚明了,仅供大家做个参考而已  
  22.  * */ 
  23. public class IKAnalyzerTokenizer implements WVTTokenizer,TokenEnumeration{  
  24.     /*  
  25.      * 一般用Wvtool进行分词的时候,我们都习惯传入SimpleTokentizer,而SimpleTokenizer  
  26.      * 好像只是提取出了一行文本,根本就没有分词,  
  27.      * 而这里面,应该是对文本:一行一行的进行分词   
  28.      * 而且真正实现分词功能的代码在readTokenizer()方法中,这个方法也是这个类里  
  29.      * 唯一的私有方法  
  30.      * */ 
  31.     private final List<String> currentToken;  
  32.     private TokenEnumeration enumeration;  
  33.     private final WVTTokenizer tokenizer;  
  34.        
  35.      public IKAnalyzerTokenizer(WVTTokenizer tokenizer){  
  36.          this.tokenizer=tokenizer;  
  37.          currentToken=new ArrayList<String>();  
  38.          enumeration=null;  
  39.      }  
  40.     @Override 
  41.     public TokenEnumeration tokenize(Reader source, WVTDocumentInfo info)  
  42.             throws WVToolException {  
  43.         if(source!=null){  
  44.             //刚开始看到这段代码,我以为是递归,后来发现跟本不是的,这里它调用的是通过构造函数  
  45.             //传过来的对象的方法,而不是本方法  
  46.             enumeration=tokenizer.tokenize(source, info);  
  47.               
  48.             readNextTokenizer();  
  49.             return this;  
  50.         }else{  
  51.             return null;  
  52.         }  
  53.     }  
  54.  
  55.     @Override 
  56.     public boolean hasMoreTokens() {  
  57.          if (enumeration != null)  
  58.                 return (currentToken.size() > 0);  
  59.             else 
  60.                 return false;  
  61.     }  
  62.  
  63.     @Override 
  64.     public String nextToken() throws WVToolException {  
  65.  
  66.         String result = null;  
  67.  
  68.         // If unequal null, return the current token and read another one from  
  69.         // the stream  
  70.  
  71.         if (currentToken.size() > 0) {  
  72.             result = (String) currentToken.get(0);  
  73.             currentToken.remove(0);  
  74.             if (currentToken.size() == 0)  
  75.                 readNextTokenizer();  
  76.         } else 
  77.             result = null;  
  78.  
  79.         return result;  
  80.     }  
  81.       
  82.     private void readNextTokenizer() throws WVToolException{  
  83.         //我想吧:真正影响程序性能的代码在这里……但怎么优化呢?唉! 我也不知道啦……  
  84.         if(enumeration.hasMoreTokens()){  
  85.             //其实吧:就是读入一行文本  
  86.             String string=enumeration.nextToken();  
  87.             //包装一下吧  
  88.             StringReader reader=new StringReader(string);  
  89.             //好了,分词在这里完成  
  90.             IKSegmentation seg=new IKSegmentation(reader);  
  91.             Lexeme lex=new Lexeme(0000);  
  92.             try {  
  93.                 while((lex=seg.next())!=null)  
  94.                 {  
  95.                     currentToken.add(lex.getLexemeText());  
  96.                 }  
  97.             } catch (IOException e) {  
  98.                 // TODO Auto-generated catch block  
  99.                 e.printStackTrace();  
  100.             }  
  101.         }  
  102.     }  
  103.       
  104.     //最后测试一下吧  
  105. public static void main(String[] args) throws WVToolException {  
  106.     IKAnalyzerTokenizer toker=new IKAnalyzerTokenizer(new SimpleTokenizer());  
  107.         String string="雅虎新闻雅虎新闻并校十年难言成败\n雅虎新闻雅虎新闻并校十年难言成败";  
  108.           
  109.         StringReader reader=new StringReader(string);  
  110.         WVTDocumentInfo info=new WVTDocumentInfo("text.html""html""utf-8""chinese");  
  111.           
  112.         TokenEnumeration enumeration=toker.tokenize(reader, info);  
  113.           
  114.         while(enumeration.hasMoreTokens()){  
  115.             System.out.print(enumeration.nextToken()+"|");  
  116.         }  
  117.         //结果:雅虎|新闻|雅虎|新闻|并|校|十年|十|年|难言|成败|雅虎|新闻|雅虎|新闻|并|校|十年|十|年|难言|成败|  
  118.     }  
  119. }  

  其实吧,我只是在readTokenzer方法中加入了分词,其它都没变!

你可能感兴趣的:(中文分词,休闲,wvtool,IKAnalyzer分词)