以下SimpleNLG代码使用“猴子”,“吃”,“香蕉”分别指定主语,动词和对象,分别产生句子“猴子吃香蕉”。因此,您可以看到它将复数名词转换为单数名词(并确保动词同意)。有没有办法确保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));
答案 0 :(得分:1)
使用SimpleNLG的最新更改,您可以使用名词短语,然后手动将其指定为Plural。您可以使用setFeature方法执行此操作:
subject.setFeature(Feature.NUMBER,NumberAgreement.PLURAL);
其中,单数/复数/两者的枚举中的NumberAgreement(对于单数和复数都是相同的)值。
然而,我刚刚检查过,输出:
只有当我们将主题作为“猴子”时才会生成猴子吃香蕉。
而不是猴子,在这种情况下,o / p成为"猴子吃香蕉。"
如前所述,SimpleNLG在简单的主语 - 动词 - 宾语形态之外的形式,方式等方面并没有太多的智能。
答案 1 :(得分:0)
SimpleNLG的问题在于它并不意味着聪明。你需要什么,你必须声明它。如果你需要一个复数名词,你需要声明它而不只是传递"猴子"作为论点。
subject.setPlural(true);
默认情况下,SimpleNLG会将单词转换为基本形式(对于名词 - >单数)。如果名词不在词典中并且它不规则,它就不会起作用。
底层SimpleNLG进行POS标记。但除非您破解代码,否则您无法访问它。我之前做的是将SimpleNLG与外部预处理管道相结合(我还需要其他任务,如依赖解析(使用Stanford CoreNLP),SimpleNLG无法提供)。代码看起来像:
if (subjectHeadNode.getPos().equals("NNS") || subjectHeadNode.getPos().equals("NNPS")){
if(!subjectHeadNode.getLemma().equalsIgnoreCase(subjectHeadNode.getWord())){
tempSpec.setPlural(true);
}
}