Classifier 4 Jの中国語サポート

5532 ワード

Classifier 4 Jは軽量クラスの分類ツールであり,ベイズ分類,ベクトル空間モデル,情報要約などをサポートする.しかし、中国語はサポートされていない.異常情報は大体以下の通りである.
Exception in thread "main" java.util.NoSuchElementException
	at java.util.HashMap$HashIterator.nextEntry(HashMap.java:813)
	at java.util.HashMap$ValueIterator.next(HashMap.java:839)
	at java.util.Collections.max(Collections.java:657)
主な原因はClassifier 4 Jが持参したDefaultTokenizerが正規表現「W」を用いて分詞することであり、英語には天然の区切りがあるため、中国語には適用されない.そのため、Classifier 4 Jの中国語サポートを自分で実現する必要があります.分詞ツールはコック分詞を選択します.包net.sf.classifier 4 Jには、
package net.sf.classifier4J;

import java.io.IOException;
import java.io.StringReader;
import java.util.Vector;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.TermAttribute;

import net.paoding.analysis.analyzer.PaodingAnalyzer;

/**
 * @author hongyu
 */
public class PaodingTokenizer implements ITokenizer {
	
	private Analyzer paoding;
	
	public PaodingTokenizer() {
		paoding = new PaodingAnalyzer();
	}

	@Override
	public String[] tokenize(String input) {
		if(input != null) {
			StringReader inputReader = new StringReader(input);
			TokenStream ts = paoding.tokenStream("", inputReader);
			TermAttribute termAtt = (TermAttribute)ts.getAttribute(TermAttribute.class);
			
			Vector<String> tokens = new Vector<String>();
			try {
				while(ts.incrementToken()) {
					tokens.add(termAtt.term());
				}
				return tokens.toArray(new String[0]);
			} catch (IOException e) {
				return new String[0];
			}
		} else {
			return new String[0];
		}
	}

}
net.sf.classifier4J.Utilitiesの2つ目の構成方法は、
    public static Map getWordFrequency(String input, boolean caseSensitive) {
        //return getWordFrequency(input, caseSensitive, new DefaultTokenizer(), new DefaultStopWordsProvider());
    	return getWordFrequency(input, caseSensitive, new PaodingTokenizer(), new DefaultStopWordsProvider());
    }
net.sf.classifier4J.vector.VectorClassifierの最初の構造方法の最初の行は、
        //tokenizer = new DefaultTokenizer();
    	tokenizer = new PaodingTokenizer();
その他にもいくつかの小さなバグ:1があり、クエリ文字列がヘッダに表示される場合を正しく処理するためにSimpleClassifierの最後の方法は、
    public double classify(String input) {
        if ((input != null) && (input.indexOf(searchWord) >= 0)) {
            return 1;
        } else {
            return 0;
        }
    }
2が、中国語情報の抽出要約を正しく行うために、UtilitiesのgetSentencesメソッドは、
    public static String[] getSentences(String input) {
        if (input == null) {
            return new String[0];
        } else {
            // split on a ".", a "!", a "?" followed by a space or EOL
            //return input.split("(\\.|!|\\?)+(\\s|\\z)");
            return input.split("(\\。|\\.|!|\\?)+(\\s|\\z)?");
        }
    }
3が、中国語の文は普通句点で終わるので、SimpleSummariserの122行目は
result.append("。");
以下はいくつかの簡単なテストクラス:1、基本分類器:
public class BasicUsage {

	public static void main(String args[]) throws Exception {
		
		SimpleClassifier classifier = new SimpleClassifier();
		classifier.setSearchWord(" ");
		String sentence = " ";
		
		System.out.println("The string '" + sentence +
				"' contains the word ' ': " + classifier.isMatch(sentence));
		System.out.println("The match rate is: " + classifier.classify(sentence));
	}

} 
実行結果:
The string ' ' contains the word ' ': true
The match rate is: 1.0
2、ベイズ分類器:
public class Bayesian {
	
	public static void main(String args[]) throws Exception {
		
		IWordsDataSource wds = new SimpleWordsDataSource();
		IClassifier classifier = new BayesianClassifier(wds);
		System.out.println( "Matches = " + classifier.classify(" ") );
	}

} 
実行結果:
Matches = 0.5
3、情報要約:
public class Summariser {
	
	public static void main(String args[]) {
		
		String input = " , , 。 , 。";
		ISummariser summariser = new SimpleSummariser();
		
		String result = summariser.summarise(input, 1);
		System.out.println(result);
	}

} 
実行結果:
 , , 。
4、ベクトル空間モデル:
public class Vector {

	public static void main(String args[]) throws Exception {
		TermVectorStorage storage = new HashMapTermVectorStorage();
		VectorClassifier vc = new VectorClassifier(storage);
		
		vc.teachMatch(" "," ");
		double result = vc.classify(" ", " ");
		System.out.println(result);
	}

} 
実行結果:
0.9999999999999998
最後にClassifier 4 Jは英語での停用語のみを定義しており、中国語では厨房分詞の辞書にはすでに停用語が含まれている.