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は英語での停用語のみを定義しており、中国語では厨房分詞の辞書にはすでに停用語が含まれている.