Solr / Lucene令牌n-gram:仅删除前导和尾随停用词

时间:2015-09-25 14:30:36

标签: solr lucene

有没有办法从令牌n-gram中删除前导和尾随停用词?

目前我有以下组合删除任何包含停用词的n-gram:

<analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory" />
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.LowerCaseFilterFactory" />
            <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="3"
                    outputUnigrams="true" outputUnigramsIfNoShingles="false" tokenSeparator=" "/>
            <filter class="solr.PatternReplaceFilterFactory" pattern=".*_.*" replacement=""/>
</analyzer>

例如,如果我的文档包含这些ngrams:

“伦敦塔”,“伦敦塔”,“和伦敦”,“伦敦”,

以“of,in”作为停用词,木瓦过滤器将产生:

tower _ london,tower _ london,_ london,london

(请注意,然而第二个“tower _ london”与第一个不同,但这些信息丢失了)

然后模式过滤器将删除前3 n-gram。

我真正想做的是保持“伦敦塔”,“伦敦塔”,“伦敦”,“伦敦”。

这可能吗?

非常感谢!

3 个答案:

答案 0 :(得分:1)

当我尝试构建自动完成功能时,我遇到了同样的问题,该功能可以从带状符号标记中获取建议(尾随停用词看起来很有趣)。

我最终开发了一个完全符合要求的TokenFilter:https://github.com/spyk/shingle-stop-filter。如果您不介意向Solr添加额外的罐子,可以查看它。此外,它现在仅适用于跟踪停用词,尽管它也可以针对领先词进行调整。

答案 1 :(得分:0)

您可能需要查看CommonGrams分析器而不是Shingle分析器。我不认为他们是完美的匹配(他们只做bigrams),但你可能会发现他们在搜索你想要的东西时表现得更紧密。

另一个选择是在Shingle之后的链中粘贴一个PatternReplace过滤器工厂,并在n-gram的开头捕获那些常用词并将其替换掉。在此之后,您可能还需要RemoveDuplicate过滤器,只保留一个版本 - 现在相同 - 令牌。

答案 2 :(得分:0)

这可能有点晚了,但是它对我有用,我认为这对于可能面临相同问题的其他人来说很有趣。

将过滤器放入fieldType的顺序会干扰结果。 在StopFilterFactory之前使用ShingleFilterFactory时,我获得的正是您期望的结果。

    <analyzer type="index">
        <charFilter class="solr.HTMLStripCharFilterFactory"/>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.PatternReplaceFilterFactory" pattern="(^[^a-zA-Z0-9á-úÁ-Ú]*|[^a-zA-Z0-9á-úÁ-Ú]*$)" replacement=""/>
        <filter class="solr.ShingleFilterFactory" outputUnigrams="true" minShingleSize="2" maxShingleSize="6"
        tokenSeparator=" "/> 
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_pt.txt" />
    </analyzer>