Solr / Lucene标记n元语法:仅删除前导和尾随非索引字

disho6za  于 2022-11-07  发布在  Lucene
关注(0)|答案(3)|浏览(185)

有没有办法只删除标记n元语法中的前导和尾随停用词?
目前我有以下的组合,它删除了任何包含一个停止词的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>

例如,如果我的文档包含这些ngram:
“伦敦塔”、“伦敦塔”、“伦敦和伦敦”、“伦敦”、
使用“of,in”作为停止字,瓦片式过滤器将产生:
伦敦,伦敦塔,伦敦,伦敦
(note然而,第二个“tower _伦敦”与第一个不同,但是该信息位丢失)
并且模式过滤器然后将删除前3个n-gram。
不过我真正想做的是保留“伦敦塔”,“伦敦塔”,“伦敦”,“伦敦”。
这可能吗?
非常感谢!

nnvyjq4y

nnvyjq4y1#

当我试图构建一个自动完成功能时,我也遇到了同样的问题,这个功能将从重叠的标记中获得建议(尾随的停用词看起来很有趣)。
最后我开发了一个TokenFilter,它正好可以做到这一点:https://github.com/spyk/shingle-stop-filter。如果你不介意在Solr中添加一个额外的jar,你可以看看它。而且,它目前只对尾随的停止词有效,尽管它也可以调整为前导的停止词。

nnsrf1az

nnsrf1az2#

你可能想看看CommonGrams分析器,而不是Shingle分析器。我不认为它们是完美的匹配(它们只做二元分析),但你可能会发现它们在搜索你想要的东西时表现得更接近。
另一种选择是在Shingle之后的链中添加一个PatternReplace过滤器工厂,并在n-gram的开头捕获那些常见的单词,然后将它们替换掉。在此之后,您可能还需要RemoveDuplicate过滤器来只保留一个版本的(现在是相同的)token。

dojqjjoe

dojqjjoe3#

这可能有点晚了,但它对我起作用了,我想这对其他可能面临同样问题的人来说会很有趣。
你在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>

相关问题