2015-09-25 14 views
1

有沒有辦法從令牌n-gram中去除前導和尾隨停用詞?Solr/Lucene令牌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> 

例如,如果我的文檔中包含這些n元語法:

「倫敦塔」,「塔在倫敦」,‘倫敦’,‘倫敦’,

用‘的,在’爲停止詞,瓦板過濾器會產生:

塔_倫敦,塔_倫敦,_倫敦,倫敦

(注意,然而,第二個「塔_倫敦」是從第一,但這個信息比特被丟失不同)

,然後將圖案濾波器將刪除所述第一3的n-gram 。

我真正想要做的是保持「倫敦塔」,「倫敦塔」,「倫敦」,「倫敦」。

這可能嗎?

非常感謝!

+0

如果您擔心信息丟失,爲什麼要刪除停用詞?在我看來,常見的停用詞在句子的開頭或結尾並不比中間的影響小。畢竟「在途中」和「在途中」的意義明顯不同。爲什麼不直接從分析儀中徹底刪除'StopFilterFactory'? – femtoRgon

回答

0

您可能想要查看CommonGrams分析儀而不是Shingle。我不認爲他們是一個完美的搭配(他們只是做bigrams),但是你可能會發現他們在尋找你想要的東西時會更加密切。

另一種方法是在Shingle之後的一個鏈條中粘上一個PatternReplace過濾器工廠,並在n-gram開頭捕獲這些常見詞並將其替換掉。之後,您可能還需要RemoveDuplicate篩選器,以僅保留一個版本 - 現在相同的令牌。

1

當我試圖構建一個自動完成功能,可以從瓦楞紙幣中獲得建議(尾隨停用詞看起來很有趣)時,我遇到了同樣的問題。

我最終開發的TokenFilter完全符合:https://github.com/spyk/shingle-stop-filter。如果您不介意爲Solr添加額外的jar,可以查看它。此外,它現在只適用於尾隨停用詞,儘管它也可以針對主要詞彙進行調整。

相關問題