2012-11-21 97 views
0

我有大約500個句子,我想編譯一組ngram。我無法刪除停用詞。我嘗試添加lucene StandardFilter和StopFilter,但我仍然遇到同樣的問題。這裏是我的代碼:Java Lucene停用詞過濾器

for(String curS: Sentences) 
{ 
      reader = new StringReader(curS); 
      tokenizer = new StandardTokenizer(Version.LUCENE_36, reader); 
      tokenizer = new StandardFilter(Version.LUCENE_36, tokenizer); 
      tokenizer = new StopFilter(Version.LUCENE_36, tokenizer, stopWords); 
      tokenizer = new ShingleFilter(tokenizer, 2, 3); 
      charTermAttribute = tokenizer.addAttribute(CharTermAttribute.class); 

    while(tokenizer.incrementToken()) 
    { 
     curNGram = charTermAttribute.toString().toString(); 
     nGrams.add(curNGram);     //store each token into an ArrayList 
    } 
} 

例如,我測試的第一個短語是:「對於每個聽的人」。在這個例子中,curNGram被設置爲「For」,這是我的列表stopWords中的一個停用詞。另外,在這個例子中,「every」是一個停用詞,所以「person」應該是第一個ngram。

  1. 爲什麼停用詞被添加到我的列表中時,我正在使用StopFiler?

所有幫助表示讚賞!

+0

stopWords是如何創建的?你是否使用[StopFilter.makeStopSet]創建它(http://lucene.apache.org/core/3_6_0/api/all/org/apache/lucene/analysis/StopFilter.html#makeStopSet(org.apache.lucene.util) .Version,%20java.util.List,%20boolean))? – femtoRgon

+0

我使用靜態函數逐行讀取txt文件。 – CodeKingPlusPlus

回答

1

你發佈的內容對我來說看起來沒什麼問題,所以我懷疑stopWords沒有提供你想要的信息給過濾器。

試着這麼做:

//Let's say we read the stop words into an array list (A simple array, or any list implementation should be fine) 
List<String> words = new ArrayList(); 
//Read the file into words. 
Set stopWords = StopFilter.makeStopSet(Version.LUCENE_36, words, true); 

假設列表你,你生成停用詞(一我命名「單詞」)看起來像你想象的那樣,這應該把它們轉變成可用的格式StopFilter。

您是否已經生成了這樣的停用詞?

+0

這似乎是工作,但對於我的一些輸出,我得到的是相同的單詞,除了一個會有一個額外的下劃線或兩個。例如,我會將USA,USA_,USA__全部作爲不同的值。 – CodeKingPlusPlus

+0

這是來自API的ShingleFilter的預期行爲:「此過濾器通過插入填充令牌(帶有termtext」_「的令牌)處理位置增量大於1,它不處理位置增量爲0的位置增量。這是由於停止過濾器刪除單詞,ShingleFilter以這種方式保持其位置。 – femtoRgon

+0

如果你願意,我相信你可以停用stopfilter.setEnablePositionIncrements(false) – femtoRgon