2014-07-21 326 views
0

首先,我要感謝任何花時間幫助的人。互聯網社區對學習非常重要。實施Kstemmer

總體目標:我輸入.txt文件,在Eclipse中使用Java編譯的The 2003 CIIR KStemmer進行抑制,並將干擾詞列表輸出到不同的.txt文件中。

簡單:輸入txt文件,將.TXT整理成字符串或字符數組,輸出.TXT

問題:我不知道如何使用我的主代碼中的詞幹。

我已經包括在一個類文件(KStemmer.java)的CIIR代碼和進口下面的庫:

Apache的lucene的-analyzers.jar

Apache的lucene.jar

的Lucene分析儀,共4.2.0.jar

Lucene的核心 - 3.4.0.jar

在我的主類(StemThis.Java)我想要做這樣的事情:

String wordFromTextFile = new String(); // input word 
String stemmedWord = new String();  // output word 
printer = new PrintWriter("outputFile") // for file export 

KStemmer newStemmer = new KStemmer(); // creating a stemmer 
newStemmer.stem(wordFromTextFile); // stemming a word 
stemmedWord = newStemmer.return(); // get stemmed word from stemmer 

printer.println(stemmedWord); // desired output method 

這顯然是過於簡單了。也許KStemmer不以這種方式工作。如何將字符串放入KStemmer並獲得輸出?

回答

1

請注意KStemmer()是一個默認構造函數,它沒有任何訪問說明符,所以你不能通過使用import包org.apache.lucene.analysis.en來調用你自己的代碼;

一個解決方案是使用PorterStemFilter,但它是一個積極的詞幹。

第二種解決方案是下載所有的源文件並將它們包含在您自己的包中並更改包名稱。

0

KStemmer沒有任何公共方法,這表明它的意思是間接調用。 KStemFilter位於org.apache.lucene.analysis.en包的旁邊,所以我非常肯定這個stemmer是用於TokenStream(例如作爲分析鏈的一部分)。

這是一個簡單的主類,將java.io.Reader變成TokenStream,將它傳遞給KStemFilter,然後打印出令牌。

import org.apache.lucene.analysis.TokenStream; 
import org.apache.lucene.analysis.core.WhitespaceTokenizer; 
import org.apache.lucene.analysis.en.KStemFilter; 
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; 
import org.apache.lucene.util.Version; 

import java.io.IOException; 
import java.io.Reader; 
import java.io.StringReader; 

public class KStemmerTestMain { 

    public static void main(String[] args) throws IOException { 

     Reader inputReader = new StringReader("I liked to tested that my inputs are stemming fantastically"); 

     TokenStream whitespaceTokenizer = new WhitespaceTokenizer(Version.LUCENE_42, inputReader); 
     TokenStream kStemmedTokenStream = new KStemFilter(whitespaceTokenizer); 

     // This attribute is updated in place every time incrementToken() is called. 
     CharTermAttribute charTermAttribute = kStemmedTokenStream.addAttribute(CharTermAttribute.class); 

     // Many TokenStreams are stateful and must be reset before calling incrementToken() 
     kStemmedTokenStream.reset(); 
     while (kStemmedTokenStream.incrementToken()) { 
      String term = charTermAttribute.toString(); 
      System.out.print(term + " "); 
     } 
    } 
} 

下面是我用來獲取Maven依賴上述進口來解決:

<dependencies> 
    <dependency> 
     <groupId>org.apache.lucene</groupId> 
     <artifactId>lucene-analyzers-common</artifactId> 
     <version>4.2.1</version> 
    </dependency> 
</dependencies>