有没有办法从令牌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。
我真正想做的是保持“伦敦塔”,“伦敦塔”,“伦敦”,“伦敦”。
这可能吗?
非常感谢!
答案 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>