RT。代码如下。
package com.CKmeans.Tokenizer;
import java.io.IOException;
import java.io.StringReader;
import java.util.*;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cn.smart.*;
import org.apache.lucene.analysis.tokenattributes.TermAttribute;
import org.apache.lucene.util.Version;
/*
* 基于SmartChinseTokenizer的中文分词方法
* (SmartChineseTokenizer是基于隐马尔科夫模型的中文分词方法,
* 感谢Lucene社区的无私支持)
* 科普一下:Nutch是Lucene的子项目,而Hadoop又是Nutch的子项目,Apache很好很强大
*/
public class ChineseTokenizer {
public static ArrayList<String> tokenizer(String page)
{
ArrayList<String> words=new ArrayList<String>();
//滤去所有的非中文字符
page=page.replaceAll("[^\u4E00-\u9FA0]","");
//读取page中的内容
StringReader sr=new StringReader(page);
//使用SmartChineseTokenizer,构造函数需要传入Lucene的版本号码
SmartChineseAnalyzer analyzer=new SmartChineseAnalyzer(Version.LUCENE_30);
//获得分词流
TokenStream tokenStream=analyzer.tokenStream("", sr);
//分词
TermAttribute ta=tokenStream.getAttribute(TermAttribute.class);
//用法真的变了很多,感觉Lucene2.9和Lucene3.0完全不同
try{
while(tokenStream.incrementToken())
{
//一个字的词去掉.因为像年、月、日,这种词基本没意义
if(ta.term().length()>=2)
{
words.add(ta.term());
}
}
}
catch(IOException ex)
{
ex.printStackTrace();
}
finally
{
if(tokenStream!=null)
{
try {
tokenStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(analyzer!=null)
{
analyzer.close();
}
}
return words;
}
//测试的main方法,用于进行分词
public static void main(String[] args)
{
String str="绿波水无痕,源竭曷为青。";
ArrayList<String> list=ChineseTokenizer.tokenizer(str);
for(int i=0;i<list.size();i++)
{
System.out.println(list.get(i));
}
}
}