有没有办法只删除标记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。
不过我真正想做的是保留“伦敦塔”,“伦敦塔”,“伦敦”,“伦敦”。
这可能吗?
非常感谢!
3条答案
按热度按时间nnvyjq4y1#
当我试图构建一个自动完成功能时,我也遇到了同样的问题,这个功能将从重叠的标记中获得建议(尾随的停用词看起来很有趣)。
最后我开发了一个TokenFilter,它正好可以做到这一点:https://github.com/spyk/shingle-stop-filter。如果你不介意在Solr中添加一个额外的jar,你可以看看它。而且,它目前只对尾随的停止词有效,尽管它也可以调整为前导的停止词。
nnsrf1az2#
你可能想看看CommonGrams分析器,而不是Shingle分析器。我不认为它们是完美的匹配(它们只做二元分析),但你可能会发现它们在搜索你想要的东西时表现得更接近。
另一种选择是在Shingle之后的链中添加一个PatternReplace过滤器工厂,并在n-gram的开头捕获那些常见的单词,然后将它们替换掉。在此之后,您可能还需要RemoveDuplicate过滤器来只保留一个版本的(现在是相同的)token。
dojqjjoe3#
这可能有点晚了,但它对我起作用了,我想这对其他可能面临同样问题的人来说会很有趣。
你在fieldType中放置过滤器的顺序会影响结果。当在StopFilterFactory之前使用ShingleFilterFactory时,我得到了你所期望的结果。