我用下面的代码。但是,结果不是我所期望的。结果是[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));
    }

}

最佳答案

理想的词法化应返回一组单词的规范形式(称为“引理”或“词条”)。但是,这种规范形式并不总是我们直觉上期望的。例如,您希望“学习”产生引理“学习”。但是名词“ learning”具有词条“ learning”,而只有当前的连续动词“ learning”才具有词条“ learn”。如果有歧义,则词机化器应依赖于词性标签中的信息。

好吧,这解释了机器学习,但是更大,更大和最大怎么办?

合法化取决于形态分析。 Stanford Morphology类通过仅去除变形(而不是派生词法)来计算英语单词的基本形式。也就是说,它仅处理名词复数,代词大小写和动词结尾,而不处理比较形容词或派生名词。它基于由John Carroll等人以flex编写的有限状态传感器。我找不到原始版本,但是Java版本似乎是available here

这就是为什么最大的不会产生大的原因。

但是,WordNet词汇数据库可以解决正确的引理。我通常使用WordNet进行词法化任务,到目前为止尚未发现重大问题。另外两个可以正确处理示例的知名工具是


CST Lemmatizer
MorphAdorner

关于java - StanfordCoreNLP无法按我的方式工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23086961/

10-15 13:50