下面的SimpleNLG代码分别使用“猴子”、“吃”和“香蕉”来指定主语、动词和宾语,生成句子“猴子吃香蕉”。因此,您可以看到它将复数名词转换为单数名词(并确保动词相应地一致)。有没有一种方法可以确保SimpleNLG检测到它们是复数并保持它们是复数呢?我已经看到文档中提到某些词典文件可以做到这一点,但我尝试了NIH词典,但这没有帮助。这仅仅是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));发布于 2018-03-12 15:34:27
使用SimpleNLG中的最新更改,您可以采用名词短语,然后手动将其指定为复数。您可以通过使用setFeature方法来完成此操作,如下所示:
subject.setFeature(Feature.NUMBER,NumberAgreement.PLURAL);
其中NumberAgreement在单数/复数/两者(对于单数和复数都相同)值的枚举中。
但是,我刚才检查了一下,输出:
猴子吃香蕉。
只有当我们将主题设置为“猴子”而不是“猴子”时才会生成,在这种情况下,o/p变成了“猴子吃香蕉”。
正如前面评论的那样,除了简单的主谓宾语形态学之外,SimpleNLG在形式、方式等方面并没有使用太多的智能。
发布于 2016-12-22 10:55:15
SimpleNLG的问题是它不应该是聪明的。任何你需要的东西,你必须声明它。如果你需要一个复数名词,你需要声明它,而不是仅仅传递“猴子”作为参数。
subject.setPlural(true);默认情况下,SimpleNLG会将单词转换为基本形式(对于名词->单数)。如果名词不在词典中,并且它是不规则的,它就不会起作用。
底层SimpleNLG进行词性标记。但是除非你破解了代码,否则你将无法访问它。我之前所做的是将SimpleNLG与外部预处理管道相结合(我还需要其他任务,比如依赖项解析(使用斯坦福大学的CoreNLP),而SimpleNLG不提供这些任务)。代码看起来像这样:
if (subjectHeadNode.getPos().equals("NNS") || subjectHeadNode.getPos().equals("NNPS")){
if(!subjectHeadNode.getLemma().equalsIgnoreCase(subjectHeadNode.getWord())){
tempSpec.setPlural(true);
}
}https://stackoverflow.com/questions/40921818
复制相似问题