Внедрение Кстеммера

Во-первых, я благодарю всех, кто находит время, чтобы помочь. Интернет-сообщество очень важно для обучения.

Общая цель: я ввожу файл .txt, останавливая его, используя сборку Java KStemmer CIIR 2003 в Eclipse и вывод списка слов с основой в другой файл .txt .

Легко: ввод .txt, сортировка .txt в массив строк или символов, вывод .txt

Проблема: я не понимаю, как использовать стеммер в моем основном коде.

Я включил код CIIR в файл класса (KStemmer.java) и импортировал следующие библиотеки:

apache-lucene-analyzers.jar

apache-lucene.jar

lucene-analyzers-common-4.2.0.jar

lucene-core-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 и получить вывод?


person user3862565    schedule 21.07.2014    source источник


Ответы (2)


имейте в виду, что KStemmer() является конструктором по умолчанию, у него нет спецификаторов доступа, поэтому вы не можете вызывать его в своем собственном коде, используя пакет импорта org.apache.lucene.analysis.en;

одно из решений — использовать PorterStemFilter, но это агрессивный стеммер.

второе решение — загрузить все исходные файлы, включить их в свой собственный пакет и изменить имя пакета.

person ck reddy    schedule 01.12.2014

KStemmer не имеет общедоступных методов, что указывает на то, что он предназначен для косвенного вызова. KStemFilter находится рядом с ним в пакете org.apache.lucene.analysis.en, поэтому я почти уверен, что стеммер предназначен для использования с 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>
person tgray    schedule 29.01.2016