Теоретически невозможно восстановить определенное слово из основы, так как один из них может быть общим для многих слов. В зависимости от вашего приложения, одной из возможностей может быть создание базы данных основ, каждая из которых сопоставлена с массивом из нескольких слов. Но тогда вам нужно будет предсказать, какое из этих слов является подходящим, если дать основание для повторного преобразования.
В качестве очень наивного решения этой проблемы, если вы знаете теги слова, вы можете попробовать сохранить слова с тегами в вашей базе данных:
run:
NN: runner
VBG: running
VBZ: runs
Затем, учитывая ствол «run» и тег «NN», вы можете определить, что «runner» является наиболее вероятным словом в этом контексте. Конечно, это решение далеко от совершенства. Примечательно, что вам нужно учитывать тот факт, что одна и та же форма слова может быть помечена по-разному в разных контекстах. Но помните, что любая попытка решить эту проблему будет в лучшем случае приблизительной.
Редактировать: из комментариев ниже, похоже, что вы, вероятно, хотите использовать лемматизацию, а не основание. Вот как можно получить леммы слов с помощью инструментов Stanford Core NLP :
import java.util.*;
import edu.stanford.nlp.pipeline.*;
import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.ling.CoreAnnotations.*;
Properties props = new Properties();
props.put("annotators", "tokenize, ssplit, pos, lemma");
pipeline = new StanfordCoreNLP(props, false);
String text = "Hello, world!";
Annotation document = pipeline.process(text);
for(CoreMap sentence: document.get(SentencesAnnotation.class)) {
for(CoreLabel token: sentence.get(TokensAnnotation.class)) {
String word = token.get(TextAnnotation.class);
String lemma = token.get(LemmaAnnotation.class);
}
}