SimpleNLG - возможно ли, чтобы SimpleNLG автоматически определял, является ли существительное единственным или множественным числом?

Следующий код 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));

person blu    schedule 01.12.2016    source источник


Ответы (2)


С последними изменениями в SimpleNLG вы можете взять словосочетание существительное и затем вручную назначить его для множественного числа. Вы можете сделать это, используя метод setFeature как:

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

где NumberAgreement в перечислении значений Singular / Plural / Both (которые одинаковы как для единственного, так и для множественного числа).

Однако я только что проверил, что вывод:

Обезьяны едят банан.

будет сгенерирован только в том случае, если мы укажем тему как «обезьяна», а не «обезьяны», и в этом случае o / p станет «Обезьяны едят банан».

Как отмечалось ранее, SimpleNLG не использует много интеллекта с точки зрения формы, способа и т.д., кроме простой морфологии «субъект-глагол-объект».

person Fleron-X    schedule 12.03.2018

Проблема с 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);
    }
}
person yiping    schedule 22.12.2016
comment
Я бы не рекомендовал взламывать код, чтобы получить части речевых тегов от SimpleNLG. Несмотря на то, что проще использовать simplenlg, это превращается в беспорядок, если вы пытаетесь использовать библиотеку, которая не соответствует исходному варианту использования. - person macmania314; 29.03.2017