Простой алгоритм с использованием String для ввода

Я смотрел на алгоритмы, основанные на словах, такие как алгоритм Портера, но все, что я нашел до сих пор, касалось файлов в качестве входных данных.

Существуют ли какие-либо алгоритмы, которые позволили бы мне просто передать стеммер строку и вернуть ли она стебель?

Что-то вроде:

String toBeStemmed = "The man worked tirelessly";
Stemmer s = new Stemmer();

String stemmed = s.stem(toBeStemmed);

2 ответа

Сами алгоритмы не принимают файлы. Код, вероятно, принимает файл и считывает его как последовательность строк, которые передаются в алгоритм. Вам просто нужно взглянуть на ту часть кода, которая считывает строки из файла, и передавать строки в себя аналогичным образом.

В вашем примере toBeStemmed это предложение, которое вы хотите токенизировать первым. Тогда вы остановите отдельные токены / слова, такие как "работал" или "неустанно".

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

JAR: Stemmer: https://code.google.com/p/hunglish-webapp/source/browse/trunk/
исходный код: https://code.google.com/p/j-morph/source/checkout
файлы языковых ресурсов: https://code.google.com/p/hunglish-webapp/source/browse/trunk/
Как я использую его с Lucene: https://code.google.com/p/hunglish-webapp/source/browse/trunk/src/main/java/hu/mokk/hunglish/jmorph/
файл свойств: https://code.google.com/p/hunglish-webapp/source/browse/trunk/src/main/resources/META-INF/spring/stemmer.properties

Пример использования:

import net.sf.jhunlang.jmorph.lemma.Lemma;
import net.sf.jhunlang.jmorph.lemma.Lemmatizer;
import net.sf.jhunlang.jmorph.analysis.Analyser;
import net.sf.jhunlang.jmorph.analysis.AnalyserContext;
import net.sf.jhunlang.jmorph.analysis.AnalyserControl;
import net.sf.jhunlang.jmorph.factory.Definition;
import net.sf.jhunlang.jmorph.factory.JMorphFactory;
import net.sf.jhunlang.jmorph.parser.ParseException;
import net.sf.jhunlang.jmorph.sample.AnalyserConfig;
import net.sf.jhunlang.jmorph.sword.parser.EnglishAffixReader;
import net.sf.jhunlang.jmorph.sword.parser.EnglishReader;
import net.sf.jhunlang.jmorph.sword.parser.SwordAffixReader;
import net.sf.jhunlang.jmorph.sword.parser.SwordReader;

AnalyserConfig acEn = new AnalyserConfig();
//TODO: set path to the English affix file
String enAff = "src/main/resources/resources-lang/jmorph/en.aff"; 
Definition affixDef = acEn.createDefinition(enAff, "utf-8", EnglishAffixReader.class);
//TODO set path to the English dict file
String enDic = "src/main/resources/resources-lang/jmorph/en.dic"; 
Definition dicDef = acEn.createDefinition(enDic, "utf-8", EnglishReader.class);
int enRecursionDepth = 3;
acEn.setRecursionDepth(affixDef, enRecursionDepth);
JMorphFactory jf = new JMorphFactory();
Analyser enAnalyser = jf.build(new Definition[] { affixDef, dicDef });
AnalyserControl acEn = new AnalyserControl(AnalyserControl.ALL_COMPOUNDS);
AnalyserContext analyserContextEn = new AnalyserContext(acEn);
boolean enStripDerivates = true;
Lemmatizer enLemmatizer = new net.sf.jhunlang.jmorph.lemma.LemmatizerImpl(enAnalyser, enStripDerivates, analyserContextEn);


//After somewhat complex initializing, here we go
List<Lemma> lemmas = enLemmatizer.lemmatize("worked");
for (Lemma lemma : lemmas) {
    System.out.println(lemma.getWord());
}
Другие вопросы по тегам