2013-09-29 51 views
1

我正在使用Lucene 4.4來分析一個小型語料庫。我試過StopAnalyzer和StopAnalyzer。但是,我不需要的許多術語仍顯示在我的結果中。例如,「我會」,「我們」,「x」等。所以,我需要定製Lucene提供的停用詞列表。我的問題是:如何在Lucene 4.4中自定義停用詞列表

  1. 如何添加新的停用詞? 我知道Lucene的具有此構造函數使用一個定製的禁用詞

    公共StopAnalyzer(版本matchVersion,CharArraySet禁用詞)

    但我不想從頭開始構建停用詞。我想使用現有的停用詞,只需添加我需要的額外停用詞。

  2. 如何過濾掉所有的數字,如「1」,「20」,「5」,「10」等詞和文字數字?

我的解決方案

  1. 作爲femtoRgon表明,通過提供的Lucene停止字很小,不能更改。我創建了一個CustomizeStopAnalyzer,它帶有一個停用詞表。 我使用StandardTokenizer並將幾個過濾器鏈接在一起。
  2. 要刪除數字,我必須添加一個NumericFilter類來檢查每個標記以查看它是否是數字。 非常感謝,

回答

3

1 - 標準停止詞集是StopAnalyzer.ENGLISH_STOPWORD_SET。它是不可修改的,所以你應該代碼只是複製爲出發點:

final List<String> stopWords = Arrays.asList(
    "a", "an", "and", "are", "as", "at", "be", "but", "by", 
    "for", "if", "in", "into", "is", "it", 
    "no", "not", "of", "on", "or", "such", 
    "that", "the", "their", "then", "there", "these", 
    "they", "this", "to", "was", "will", "with" 
); 
final CharArraySet stopSet = new CharArraySet(Version.LUCENE_CURRENT, 
    stopWords, false); 

2 - 一種阻濾波器不是這個正確的方法。我懷疑,你可能正在尋找類似LetterTokenizer的東西,它會將令牌定義爲連續的字母串,從而消除任何非字母字符。

+0

感謝femtoRgon。我不僅要過濾非字母字符,而且還要過濾表示數字的單詞,例如「五,十,五十」等。在使用NLTK時,我可以檢查每個令牌並有方法檢查如果令牌包含任何數字或者它可以解析爲浮點數。我不知道在Lucene中是否可以做類似的事情? – chepukha

+0

我試過LetterTokenizer,它解決了一個問題,但又產生了另一個問題。它去除數字和標點符號。結果,我得到了像「isn,didn,ll,ve」這樣的令牌,這些令牌不會被停用詞表捕獲。繼續將這些字符串添加到停用詞列表中並不是一個很好的解決方案。 StandardTokenizer可以識別「不是,我會」等等,但它不會刪除數字。你有任何建議來解決它?謝謝, – chepukha

+0

我不知道任何過濾器都能完全符合您的要求。你可能需要實現你自己的。由於您只是想刪除令牌,['FilteringTokenFilter'](http://lucene.apache.org/core/4_0_0/analyzers-common/org/apache/lucene/analysis/util/FilteringTokenFilter.html)將是基類來實現。你只需要實現'accept'方法,然後將它合併到你的分析器中。 – femtoRgon