首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找文本中的常用短语

查找文本中的常用短语
EN

Stack Overflow用户
提问于 2015-07-30 22:44:34
回答 1查看 112关注 0票数 0

有没有办法用Lucene搜索常用短语?

我正在成功地搜索常用单词:

代码语言:javascript
复制
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的地方吗?它似乎不工作,因为我的输出看起来是这样的:

代码语言:javascript
复制
ed d 
d 
d   p
 p
 p pl  
pl
pl le

我需要的是输出包括成对的完整单词。

下面是我的createComponents方法:

代码语言:javascript
复制
@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,现在我得到了完整的单词,但我不需要单个单词,只需要成对的单词。

代码如下:

代码语言:javascript
复制
Tokenizer source = new StandardTokenizer(Version.LUCENE_47, reader);        
ShingleFilter sf = new ShingleFilter(source, 2, 2);

请注意,根据文档,2, 2应生成的最小字数为2,最大字数为2。但实际上它会生成以下输出:

代码语言:javascript
复制
and
and other
other
other airborne
airborne
airborne particles

那么,如何摆脱单个单词并获得此输出呢?

代码语言:javascript
复制
and other
other airborne
airborne particles
EN

回答 1

Stack Overflow用户

发布于 2015-08-04 17:21:50

下面是完成这项工作的完整Analyzer类。请注意,TokenStreamComponents方法是在femtoRgon对我的问题的精彩评论之后声明ShingleFilter的地方。只需输入您自己的字符串,指定minWordsmaxWords并运行它。

代码语言:javascript
复制
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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31726940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档