私はちょうどスタンフォード パーサーをいじり始めたばかりなので、これを一粒の塩と考えてください。
名詞とそれに対応する形容詞、またはその特定の名詞に関連する必要な情報を抽出するには、次のようにします。
文の構文木を生成します。(これを行う方法については、ParserDemo.java を参照してください)。
https://wiki.csc.calpoly.edu/CSC-581-S11-06/browser/trunk/Stanford/stanford-parser-2011-04-20/src/edu/stanford/nlp/parser/lexparser/demo/ ParserDemo.java?rev=2
解析ツリーは次のようになります。
(ROOT
(S
(NP (JJ handsome) (NNP Joe) (NNP Blow))
(VP (VBD sent)
(NP (DT an) (NN email))
(PP (TO to)
(NP (PRP$ his) (JJ congressional) (NN representative))))))
このような文の場合: ハンサムな Joe Blow は彼の議会の代表者に電子メールを送信しました
次に、解析ツリーを再帰的にたどり、「NP」フラグメントを選択するコードを記述します。
たとえば、そのようなフラグメントの 1 つは (NP (JJ ハンサム) (NNP ジョー) (NNP ブロー)) です。
そのフラグメントを取得したら、関心のあるすべての形容詞とその他の修飾子を収集できます。コードの意味を知っておくと役に立ちます [ http://bulba.sdsu.edu/jeanette/thesis/PennTags.html ]
解析ツリーをクロールして戻って何かを抽出するコードをいくつか書きました...これはあなたが始めるのに役立つかもしれません>
すべてのコードを提供することはできませんが、ここにその一部を示します....
static {
nounNodeNames = new ArrayList<String>();
nounNodeNames.add( "NP");
nounNodeNames.add( "NPS");
nounNodeNames.add( "FW");
nounNodeNames.add( "NN");
nounNodeNames.add( "NNS");
nounNodeNames.add( "NNP");
nounNodeNames.add( "NNPS");
}
public List<NounPhrase> extractPhrasesFromString(Tree tree, String originalString) {
List<NounPhrase> foundPhraseNodes = new ArrayList<NounPhrase>();
collect(tree, foundPhraseNodes);
logger.debug("parsing " + originalString + " yields " + foundPhraseNodes.size() + " noun node(s).");
if (foundPhraseNodes.size() == 0) {
foundPhraseNodes.add(new NounPhrase(tree, originalString));
}
return foundPhraseNodes;
}
private void collect(Tree tree, List<NounPhrase> foundPhraseNodes) {
if (tree == null || tree.isLeaf()) {
return;
}
Label label = tree.label();
if (label instanceof CoreLabel) {
CoreLabel coreLabel = ((CoreLabel) label);
String text = ((CoreLabel) label).getString(CoreAnnotations.OriginalTextAnnotation.class);
logger.debug(" got text: " + text);
if (text.equals("THE")) {
logger.debug(" got THE text: " + text);
}
String category = coreLabel.getString(CoreAnnotations.CategoryAnnotation.class);
if (nounNodeNames.contains(category)) {
NounPhrase phrase = null;
String phraseString = flatten(tree);
if ((phrase = stringToNounPhrase.get(phraseString)) == null) {
phrase = new NounPhrase(tree, phraseString);
stringToNounPhrase.put(phraseString, phrase);
}
if (! foundPhraseNodes.contains(phrase)) {
logger.debug("adding found noun phrase to list: {}", phrase.debug());
foundPhraseNodes.add(phrase);
} else {
logger.debug("on list already, so skipping found noun phrase: {}", phrase.debug());
}
}
}
List<Tree> kids = tree.getChildrenAsList();
for (Tree kid : kids) {
collect(kid, foundPhraseNodes);
}
}