Luceneの7(オープンソースの中国語アナライザ)

3565 ワード


現在の中国語分析器は大体以下のいくつかあります.
1、IK Analyzer
   Java言語に基づいて開発された軽量級の中国語分詞ツールパッケージ.2006年12月にリリースされたバージョン1.0から、IKAnalyzerは4つの大きなバージョンをリリースしています.当初は,オープンソースプロジェクトLuenceを応用主体とし,辞書分詞と文法解析アルゴリズムを組み合わせた中国語分詞コンポーネントであった.3.0以降、IKはLuceneプロジェクトとは独立したJava向けの共通の分詞コンポーネントに発展し、Luceneのデフォルトの最適化を実現しました.2012年版では,IKは単純な分詞曖昧排除アルゴリズムを実現し,IK分詞器が単純な辞書分詞からシミュレーション意味分詞へ回折することを示している.
 
   ダウンロード先:http://code.google.com/p/ik-analyzer/
    操作ドキュメントがあり、開発バージョンの更新が速い
2、mmseg4j
   (1)、mmseg 4 jはChih-Hao TsaiのMMSegアルゴリズムで実現された中国語分詞器であり、luceneのanalyzerとsolrのTokenizerFactoryを実現し、LuceneとSolrでの使用を容易にする.
(2)、MMSegアルゴリズムには、SimpleとComplexの2つの分詞方法があり、いずれも順方向最大マッチングに基づいている.Complexは4つのルールを追加しました.公式によると、言葉の正確な認識率は98.41%に達した.mmseg 4 jはこの2つの分詞アルゴリズムを実現した.
 
ダウンロード先:http://code.google.com/p/mmseg4j/
操作ドキュメントがなく、開発バージョンの更新が速い
3、paoding
   個数を制限しない辞書ファイルに基づいて文章を有効に切り分け,語彙を分類して定義できるようにした.未知の語彙を合理的に解析できる
 
    ダウンロード先:http://code.google.com/p/paoding/
    ドキュメントを操作していないため、開発のアクティビティが低い
4、imdict
    imdictインテリジェント辞書で採用されているインテリジェント中国語分詞プログラム
 
    ドキュメントを操作していないため、開発のアクティビティが低い
 
 
public class ChineseAnalyerDemo {
	
	/**standardAnalyer    ,Lucene       */
	public void standardAnalyer(String msg){
		StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
		this.getTokens(analyzer, msg);
	}

	
	/**IK Analyzer   */
	public void iKanalyer(String msg){
		IKAnalyzer analyzer = new IKAnalyzer(true);//  true ,           
                //IKAnalyzer analyzer = new IKAnalyzer();
		this.getTokens(analyzer, msg);
	}

	
	private void getTokens(Analyzer analyzer,String msg){
		TokenStream tokenStream=analyzer.tokenStream("content", new StringReader(msg));
		try {
			tokenStream.reset();
			this.printTokens(analyzer.getClass().getSimpleName(),tokenStream);
			tokenStream.end();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	private void printTokens(String analyzerType,TokenStream tokenStream){
		CharTermAttribute ta = tokenStream.addAttribute(CharTermAttribute.class);
		StringBuffer result =new StringBuffer();
		try {
			while(tokenStream.incrementToken()){
				if(result.length()>0){
					result.append(",");
				}
				result.append("["+ta.toString()+"]");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		System.out.println(analyzerType+"->"+result.toString());
	}
}
 
 
 
 
 
public class TestChineseAnalyizer {

	private ChineseAnalyerDemo demo = null;
	
	private String msg = "    ,    !china   ,I love you!";
	//private String msg = "I love you, China!B2C";
	@Before
	public void setUp() throws Exception {
		demo=new ChineseAnalyerDemo();
	}
	@Test
	public void testStandardAnalyer(){
		demo.standardAnalyer(msg);
	}
	@Test
	public void testIkAnalyzer(){
		demo.iKanalyer(msg);
	}
}

 
 
出力結果:
 
 
StandardAnalyzer->[ ],[ ],[ ],[ ],[ ],[ ],[ ],[ ],[china],[ ],[ ],[i],[love],[you],[ ],[ ],[ ],[ ],[ ],[ ],[ ]
IKAnalyzer->[ ],[  ],[ ],[ ],[ ],[  ],[china],[  ],[i],[love],[you],[       ]