2012-11-10 33 views
0

我想使用Lucene API從句子中提取ngram。不過,我似乎遇到了一個奇怪的問題。在JavaDoc有一個叫做NGramTokenizer的類。我已經下載了3.6.1和4.0 API,我沒有看到這個類的任何痕跡。例如,當我嘗試以下方法,我得到一個錯誤,指出該符號NGramTokenizer無法找到:Java Lucene Ngrams

NGramTokenizer myTokenizer; 

在它看來,NGramTokenizer是路徑org.apache.lucene.analysis.NGramTokenizer的文檔。我在電腦上看不到這個地方。似乎不可能發生下載或其他雜項錯誤,因爲3.6.1和4.0 API均發生這種情況

  1. 如何獲取NGramTokenizer類?
  2. 我加了Lucene核心-3.6.1.jar到我的項目

回答

3

您使用了錯誤的罐子。它在

lucene-analyzers-3.6.1.jar 

org.apache.lucene.analysis.ngram.NGramTokenizer 
0

這是一個實用的方法,我通常使用incase有人需要幫助。如果使用Lucene 4.10的工作(我沒有用更低或更高的版本測試)

private Set<String> generateNgrams(String sentence, int ngramCount) { 
    StringReader reader = new StringReader(sentence); 
    Set<String> ngrams = new HashSet<>(); 

    //use lucene's shingle filter to generate the tokens 
    StandardTokenizer source = new StandardTokenizer(reader); 
    TokenStream tokenStream = new StandardFilter(source); 
    TokenFilter sf = null; 

    //if only unigrams are needed use standard filter else use shingle filter 
    if(ngramCount == 1){ 
     sf = new StandardFilter(tokenStream); 
    } 
    else{ 
     sf = new ShingleFilter(tokenStream); 
     ((ShingleFilter)sf).setMaxShingleSize(ngramCount); 
    } 

    CharTermAttribute charTermAttribute = sf.addAttribute(CharTermAttribute.class); 
    try { 
     sf.reset(); 
     while (sf.incrementToken()) { 
      String token = charTermAttribute.toString().toLowerCase(); 
      ngrams.add(token); 
     } 
     sf.end(); 
     sf.close(); 
    } catch (IOException ex) { 
     // System.err.println("Scream and cry as desired"); 
     ex.printStackTrace(); 
    } 
    return ngrams; 
} 

的Maven的Lucene的所需的依賴關係:

<dependency> 
     <groupId>org.apache.lucene</groupId> 
     <artifactId>lucene-core</artifactId> 
     <version>4.10.3</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.lucene</groupId> 
     <artifactId>lucene-analyzers-common</artifactId> 
     <version>4.10.3</version> 
    </dependency>