2016-12-01 14 views
1

"monkeys"、 "eat"、 "bananas"を使ってサブジェクト、動詞、およびオブジェクトを指定する次のSimpleNLGコードは、それぞれ "monkey eats bananas"という文を生成します。したがって、複数の名詞を単数形に変換したことがわかります(それに応じて動詞が同意することが保証されます)。 SimpleNLGがそれらが複数であることを確実に検出し、そのように保つ方法がありますか?特定のレキシコンファイルがこれを行うかもしれないことをドキュメンテーションで見てきましたが、NIH Lexiconを試しましたが、それは役に立たなかった。これは単純にSimpleNLGでサポートされていませんか?それとも、SimpleNLGを使ってやる方法がありますか?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

SimpleNLGの問題は、スマートではありません。必要なものがあれば宣言しなければなりません。複数の名詞が必要な場合は、引数として "猿"を渡す代わりに宣言する必要があります。

subject.setPlural(true); 

デフォルトでは、SimpleNLGは単語を基本形式(名詞 - >単数形)に変換します。名詞がレキシコンになく、不規則であれば動作しません。

シンプルNLGは、POSタグ付けを行います。しかし、コードをハックしない限り、アクセスすることはできません。私が以前にしたことは、SimpleNLGと外部の前処理パイプラインを組み合わせたことです(私は、スタンドフォードCoreNLPを使用した依存関係解析のような他のタスクも必要でしたが、SimpleNLGでは提供していません)。コードは次のようになります。

if (subjectHeadNode.getPos().equals("NNS") || subjectHeadNode.getPos().equals("NNPS")){ 
    if(!subjectHeadNode.getLemma().equalsIgnoreCase(subjectHeadNode.getWord())){ 
     tempSpec.setPlural(true); 
    } 
} 
+0

SimpleNLGから品詞タグを取得するコードをハッキングすることはお勧めしません。たとえ単純化したほうが痩せていますが、元のユースケースに合わないライブラリを使用しようとすると混乱します。 – macmania314

関連する問題