我很困惑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();
有人可以帮我修改它,以便实际输出双字母并且不会复制单词吗?谢谢!
纳塔利娅
答案 0 :(得分:1)
问题是您正在应用两个 ShingleFilter
。 ShingleAnalyzerWrapper
将{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个双子座 - 这就是,是一只狗。