0

我想使用 Lucene API 从句子中提取 ngram。但是,我似乎遇到了一个特殊的问题。在JavaDoc中有一个名为 NGramTokenizer 的类。我已经下载了 3.6.1 和 4.0 API,但我没有看到这个类的任何痕迹。例如,当我尝试以下操作时,我收到一条错误消息,指出找不到符号 NGramTokenizer:

NGramTokenizer myTokenizer;

在文档中,NGramTokenizer 似乎位于路径 org.apache.lucene.analysis.NGramTokenizer 中。我在电脑上的任何地方都看不到这个。似乎不太可能发生下载或其他杂项错误,因为 3.6.1 和 4.0 API 都会发生这种情况

  1. 如何获得 NGramTokenizer 类?
  2. 我将 lucene-core-3.6.1.jar 添加到我的项目中
4

2 回答 2

3

您使用了错误的罐子。在里面

lucene-analyzers-3.6.1.jar

org.apache.lucene.analysis.ngram.NGramTokenizer
于 2012-11-10T05:53:12.043 回答
0

这是我通常使用的实用方法,以防有人需要帮助。应该与 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;
}

lucene 所需的 Maven 依赖项是:

    <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>
于 2015-10-24T12:05:27.977 回答