Ada hack yang sangat sederhana untuk memasukkan urutan kata dalam implementasi model bag-of-words yang ada. Perlakukan beberapa frasa, seperti bi-gram yang sering muncul (misalnya New York) sebagai satu kesatuan, yaitu satu kata saja daripada memperlakukannya sebagai entitas yang terpisah. Ini akan memastikan bahwa "New York" berbeda dari "New York". Anda juga bisa menentukan sirap kata urutan tinggi seperti untuk n = 3,4 dll.
Anda bisa menggunakan Lucene ShingleFilter untuk menguraikan teks dokumen Anda menjadi sirap sebagai langkah pra-pemrosesan dan kemudian menerapkan classifier pada teks yang diurai ini.
import java.io.*;
import org.apache.lucene.analysis.core.*;
import org.apache.lucene.analysis.*;
import org.apache.lucene.analysis.shingle.ShingleFilter;
import org.apache.lucene.analysis.standard.*;
import org.apache.lucene.util.*;
import org.apache.lucene.analysis.util.*;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.charfilter.*;
import org.apache.lucene.analysis.core.WhitespaceTokenizer;
class TestAnalyzer extends Analyzer {
TestAnalyzer() {
super();
}
protected TokenStreamComponents createComponents( String fieldName, Reader reader ) {
String token;
TokenStream result = null;
Tokenizer source = new WhitespaceTokenizer( Version.LUCENE_CURRENT, reader );
result = new ShingleFilter(source, 2, 2);
return new TokenStreamComponents( source, result );
}
}
public class LuceneTest {
public static void main(String[] args) throws Exception {
TestAnalyzer analyzer = new TestAnalyzer();
try {
TokenStream stream = analyzer.tokenStream("field", new StringReader("This is a sample sentence."));
CharTermAttribute termAtt = stream.addAttribute(CharTermAttribute.class);
stream.reset();
// print all tokens until stream is exhausted
while (stream.incrementToken()) {
System.out.println(termAtt.toString());
}
stream.end();
stream.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}