有没有办法用Lucene搜索常用短语?
我正在成功地搜索常用单词:
TermStats[] ts = HighFreqTerms.getHighFreqTerms(reader, 20, fieldName, comparator);但这带来了单个单词,我正在寻找一种方法来搜索频繁出现的两个(或任何数字)单词组合。
为了澄清,我不是在寻找我知道的前两个单词(例如,fast和car),而是在寻找前两个频繁出现的单词组合。因此,如果我的文本是"this is a fast car and this is a fast car“,我会得到"fast car”和"this is“是最常用的两个单词组合。
我看了一下讨论here,但它提供了一个使用solr的解决方案,我正在寻找使用Lucene的解决方案,无论如何,相关的链接都会断开。
编辑:在femtoRgon的评论之后,这里是我的Analyzer的一些代码。这是应该添加ShingleFilter的地方吗?它似乎不工作,因为我的输出看起来是这样的:
ed d
d
d p
p
p pl
pl
pl le我需要的是输出包括成对的完整单词。
下面是我的createComponents方法:
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
Tokenizer source = new NGramTokenizer(Version.LUCENE_47, reader, 2, 2);
ShingleFilter sf = new ShingleFilter(source, 2, 2);
TokenStreamComponents tsc = new TokenStreamComponents(source, sf);
return tsc;
}EDIT2:在femtoRgon的评论之后,我将NGramTokenizer改为StandardTokenizer,现在我得到了完整的单词,但我不需要单个单词,只需要成对的单词。
代码如下:
Tokenizer source = new StandardTokenizer(Version.LUCENE_47, reader);
ShingleFilter sf = new ShingleFilter(source, 2, 2);请注意,根据文档,2, 2应生成的最小字数为2,最大字数为2。但实际上它会生成以下输出:
and
and other
other
other airborne
airborne
airborne particles那么,如何摆脱单个单词并获得此输出呢?
and other
other airborne
airborne particles发布于 2015-08-04 17:21:50
下面是完成这项工作的完整Analyzer类。请注意,TokenStreamComponents方法是在femtoRgon对我的问题的精彩评论之后声明ShingleFilter的地方。只需输入您自己的字符串,指定minWords和maxWords并运行它。
public class RMAnalyzer extends Analyzer {
public static String someString = "some string";
private int minWords = 2;
private int maxWords = 2;
public static void main(String[] args) {
RMAnalyzer rma = new RMAnalyzer(2, 2);
rma.findFrequentTerms();
rma.close();
}
public RMAnalyzer(int minWords, int maxWords) {
this.minWords = minWords;
this.maxWords = maxWords;
}
public void findFrequentTerms() {
StringReader sr = new StringReader(someString);
try {
TokenStream tokenStream = tokenStream("title", sr);
OffsetAttribute offsetAttribute = tokenStream.addAttribute(OffsetAttribute.class);
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
tokenStream.reset();
while (tokenStream.incrementToken()) {
String term = charTermAttribute.toString();
System.out.println(term);
}
} catch(Exception e) {
e.printStackTrace();
}
}
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
Tokenizer source = new StandardTokenizer(Version.LUCENE_47, reader);
ShingleFilter sf = new ShingleFilter(source, minWords, maxWords);
sf.setOutputUnigrams(false); // makes it so no one word phrases out in the output.
sf.setOutputUnigramsIfNoShingles(true); // if not enough for min, show anyway.
TokenStreamComponents tsc = new TokenStreamComponents(source, sf);
return tsc;
}
}https://stackoverflow.com/questions/31726940
复制相似问题