我使用下面的代码。但是,结果并不是我的预期。结果是[machine, Learning]
但我希望得到[machine, learn]
。我怎样才能做到这一点?另外,当我的输入为"biggest bigger"
时,我想获得[big, big]
之类的结果,但结果只是[biggest bigger]
(PS:我只是在我的日食中添加这四个罐子:joda-time.jar, stanford-corenlp-3.3.1-models.jar, stanford-corenlp-3.3.1.jar, xom.jar
我还需要添加更多吗?)
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;
import edu.stanford.nlp.ling.CoreAnnotations.LemmaAnnotation;
import edu.stanford.nlp.ling.CoreAnnotations.SentencesAnnotation;
import edu.stanford.nlp.ling.CoreAnnotations.TokensAnnotation;
import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.pipeline.Annotation;
import edu.stanford.nlp.pipeline.StanfordCoreNLP;
import edu.stanford.nlp.util.CoreMap;
public class StanfordLemmatizer {
protected StanfordCoreNLP pipeline;
public StanfordLemmatizer() {
// Create StanfordCoreNLP object properties, with POS tagging
// (required for lemmatization), and lemmatization
Properties props;
props = new Properties();
props.put("annotators", "tokenize, ssplit, pos, lemma");
this.pipeline = new StanfordCoreNLP(props);
}
public List<String> lemmatize(String documentText)
{
List<String> lemmas = new LinkedList<String>();
// Create an empty Annotation just with the given text
Annotation document = new Annotation(documentText);
// run all Annotators on this text
this.pipeline.annotate(document);
// Iterate over all of the sentences found
List<CoreMap> sentences = document.get(SentencesAnnotation.class);
for(CoreMap sentence: sentences) {
// Iterate over all tokens in a sentence
for (CoreLabel token: sentence.get(TokensAnnotation.class)) {
// Retrieve and add the lemma for each word into the
// list of lemmas
lemmas.add(token.get(LemmaAnnotation.class));
}
}
return lemmas;
}
// Test
public static void main(String[] args) {
System.out.println("Starting Stanford Lemmatizer");
String text = "Machine Learning\n";
StanfordLemmatizer slem = new StanfordLemmatizer();
System.out.println(slem.lemmatize(text));
}
}
答案 0 :(得分:4)
理论上,词形还原应该返回一组词的规范形式(称为“引理”或“词条”)。然而,这种规范形式并不总是我们直觉所期望的。例如,您希望“学习”能够产生引导“学习”。但名词“学习”具有引导“学习”,而只有现在的连续动词“学习”具有引导“学习”。在含糊不清的情况下,词形变换器应该依赖于词性标记的信息。
嗯,这解释了机器学习,但大,大,大怎么样?
词形还原取决于形态分析。斯坦福形态学课程通过仅删除变形(非衍生形态学)来计算英语单词的基本形式。也就是说,它只做名词复数,代词情形和动词结尾,而不是比较形容词或派生名词。它基于由John Carroll等人实现的有限状态传感器,用flex编写。我找不到原始版本,但Java版本似乎是available here。
这就是最大不会产生大的原因。
WordNet词汇数据库解析为正确的引理。我通常使用WordNet进行词形还原任务,到目前为止还没有发现任何重大问题。正确处理您的示例的另外两个众所周知的工具是