Lucene 4.6中的ShingleFilter为双字母添加了单词

时间:2014-04-02 18:15:40

标签: java lucene

我很困惑ShingleFilter在Lucene 4.6中的奇怪行为。我想做的是从一个句子中提取所有可能的双字母。因此,如果句子是“这是一只狗”,我想要“这是”,“是一只”,“一只狗”。

我所看到的是:

“这是”

“这是”

“是一个”

“是一个”

“一只狗”

“狗狗”

所以它以某种方式复制单词并制作3克而不是双字母。

这是我的Java代码:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);
ShingleAnalyzerWrapper shingleAnalyzer = new ShingleAnalyzerWrapper(analyzer,2,2);

String theSentence = "this is a dog";
StringReader reader = new StringReader(theSentence);
TokenStream tokenStream = shingleAnalyzer.tokenStream("content", reader);
ShingleFilter theFilter = new ShingleFilter(tokenStream);
theFilter.setOutputUnigrams(false);

CharTermAttribute charTermAttribute = theFilter.addAttribute(CharTermAttribute.class);                                                                                   
theFilter.reset();

 while (theFilter.incrementToken()) {                                                 
            System.out.println(charTermAttribute.toString());                                  
 }

 theFilter.end();
 theFilter.close();

有人可以帮我修改它,以便实际输出双字母并且不会复制单词吗?谢谢!

纳塔利娅

2 个答案:

答案 0 :(得分:1)

问题是您正在应用两个 ShingleFilterShingleAnalyzerWrapper将{1}添加到StandardAnalyzer,然后明确添加另一个。由于ShingleAnalyzerWrapper使用了它输出unigrams的默认行为,因此您最终会获得第一个ShingleFilter的以下标记:

  • 这个
  • 这是
  • 一个
  • 一只狗

所以当第二个过滤器出现时(这次没有unigrams),它只是将每个连续的标记组合在一起,从而产生你所看到的结果。

因此,要么取消ShingleAnalyzerWrapper,要么取消稍后添加的ShingleFilter。例如,这应该有效:

Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_46);

String theSentence = "this is a dog";
StringReader reader = new StringReader(theSentence);
TokenStream tokenStream = analyzer.tokenStream("content", reader);
ShingleFilter theFilter = new ShingleFilter(tokenStream);
theFilter.setOutputUnigrams(false);

CharTermAttribute charTermAttribute = theFilter.addAttribute(CharTermAttribute.class);
theFilter.reset();

while (theFilter.incrementToken()) {
    System.out.println(charTermAttribute.toString());
}

theFilter.end();
theFilter.close();

答案 1 :(得分:1)

我能够使用此代码生成正确的结果

    String theSentence = "this is a dog";
    StringReader reader = new StringReader(theSentence);
    StandardTokenizer source = new StandardTokenizer(Version.LUCENE_46, reader);
    TokenStream tokenStream = new StandardFilter(Version.LUCENE_46, source);
    ShingleFilter sf = new ShingleFilter(tokenStream);
    sf.setOutputUnigrams(false);

    CharTermAttribute charTermAttribute = sf.addAttribute(CharTermAttribute.class);
    sf.reset();

    while (sf.incrementToken()) {
        System.out.println(charTermAttribute.toString());
    }

    sf.end();
    sf.close();

按预期得到3个双子座 - 这就是,是一只狗。