Có một cách hack rất đơn giản để kết hợp trật tự từ trong triển khai mô hình bag-of-words hiện có. Hãy coi một số cụm từ, chẳng hạn như bi-gram thường xuyên xảy ra (ví dụ New York) là một đơn vị, tức là một từ duy nhất thay vì coi chúng là các thực thể riêng biệt. Điều này sẽ đảm bảo rằng "New York" khác với "New York". Bạn cũng có thể xác định bệnh zona từ bậc cao hơn như n = 3,4, v.v.
Bạn có thể sử dụng Lucene ShingleFilter để phân tách văn bản tài liệu của bạn thành bệnh zona như một bước xử lý trước và sau đó áp dụng trình phân loại trên văn bản phân tách này.
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();
}
}
}