3

下面的 SimpleNLG 代码分别使用“monkeys”、“eat”、“bananas”指定主语、动词和宾语,产生句子“monkey eatsbananas”。因此,您看到它将复数名词转换为单数名词(并确保动词相应地一致)。有没有办法确保 SimpleNLG 检测到它们是复数并保持原样?我已经看到文档提到某些 Lexicon 文件可能会这样做,但我尝试了 NIH Lexicon 并没有帮助。SimpleNLG 根本不支持这一点吗?或者有没有办法使用 SimpleNLG 或其他方式来做到这一点?

    Lexicon = new Lexicon.getDefaultLexicon()
    nlgFactory = new NLGFactory(lexicon);
    Realiser realiser = new Realiser(lexicon);

    NPPhraseSpec subject = nlgFactory.createNounPhrase("monkeys");
    VPPhraseSpec verb = nlgFactory.createVerbPhrase("eat");
    NPPhraseSpec object = nlgFactory.createNounPhrase("bananas");

    SPhraseSpec clause  = nlgFactory.createClause();
    clause.setSubject(subject);
    clause.setVerbPhrase(verb);
    clause.setObject(object);

    System.out.print(realiser.realiseSentence(clause));
4

2 回答 2

2

随着 SimpleNLG 的最新变化,您可以采用名词短语,然后手动将其分配为复数。您可以通过使用 setFeature 方法来做到这一点:

subject.setFeature(Feature.NUMBER, NumberAgreement.PLURAL);

其中 NumberAgreement 在单数/复数/两者(单数和复数都相同)值的枚举中。

但是,我刚刚检查了输出:

猴子吃香蕉。

仅当我们将主题设置为“猴子”而不是“猴子”时才会生成,在这种情况下,o/p 变为“猴子吃香蕉”。

如前所述,SimpleNLG 在简单的主语-动词-宾语形态之外并没有在形式、方式等方面使用太多智能。

于 2018-03-12T07:34:27.233 回答
1

SimpleNLG 的问题在于它并不聪明。任何你需要的东西,你都必须声明它。如果你需要一个复数名词,你需要声明它而不是仅仅传递“monkeys”作为参数。

subject.setPlural(true);

默认情况下,SimpleNLG 会将单词转换为基本形式(对于名词 -> 单数)。如果名词不在词典中并且它是不规则的,它将不起作用。

底层 SimpleNLG 进行 POS 标记。但是除非您破解代码,否则您将无法访问它。我之前所做的是将 SimpleNLG 与外部预处理管道相结合(无论如何,我需要其他任务,例如依赖项解析(使用斯坦福 CoreNLP),而 SimpleNLG 不提供)。代码看起来像:

if (subjectHeadNode.getPos().equals("NNS") || subjectHeadNode.getPos().equals("NNPS")){
    if(!subjectHeadNode.getLemma().equalsIgnoreCase(subjectHeadNode.getWord())){
        tempSpec.setPlural(true);
    }
}
于 2016-12-22T02:55:14.727 回答