3

スタンフォード パーサーを使用して、特定のテキストからすべての名詞と形容詞を抽出しようとしています。

私の現在の試みは、次のようなものを見つけるために Tree-Object の getChildrenAsList() でパターン マッチングを使用しています。

(NN paper), (NN algorithm), (NN information), ...      

それらを配列に保存します。

入力文:

この論文では、任意のテキストから意味情報を抽出するアルゴリズムを提示します。

結果 - 文字列:

[(S (PP (IN In) (NP (DT this) (NN paper))) (NP (PRP we)) (VP (VBP present) (NP (NP (DT an) (NN algorithm)) (SBAR (WHNP (WDT that)) (S (VP (VBD extracts) (NP (JJ semantic) (NN information)) (PP (IN from) (NP (DT an) (ADJP (JJ arbitrary)) (NN text)))))))) (. .))]

たとえば、名詞などのすべての単語クラスを返すスタンフォード パーサーのメソッドが見つからなかったため、パターン マッチングを使用してみました。

これらの単語クラスを抽出するためのより良い方法はありますか、またはパーサーは特定のメソッドを提供しますか?

public static void main(String[] args) {
    String str = "In this paper we present an algorithm that extracts semantic information from an arbitrary text.";
    LexicalizedParser lp = new LexicalizedParser("englishPCFG.ser.gz"); 
    Tree parseS = (Tree) lp.apply(str);
    System.out.println("tr.getChildrenAsList().toString()"+ parseS.getChildrenAsList().toString());
    }
}
4

2 に答える 2

6

ところで、名詞や動詞などの品詞だけが必要な場合は、Stanford POS tagger などの品詞タガーを使用する必要があります。数桁速く実行され、少なくとも同じくらい正確になります。

しかし、パーサーでそれを行うことができます。必要なメソッドはtaggedYield()、を返すものList<TaggedWord>です。だからあなたは持っています

List<TaggedWord> taggedWords = (Tree) lp.apply(str);
for (TaggedWord tw : taggedWords) {
  if (tw.tag().startsWith("N") || tw.tag().startsWith("J")) {
    System.out.printf("%s/%s%n", tw.word(), tw.tag());
  }
}

(この方法は、Penn treebank タグ セットのすべての形容詞タグと名詞タグのみが J または N で始まることを知っているので、手抜きをします。より一般的には、一連のタグのメンバーシップを確認できます。)

ps タグ stanford-nlp の使用は、stackoverflow のスタンフォード NLP ツールに最適です。

于 2011-05-21T18:52:24.037 に答える
1

nltk (自然言語ツールキット) は、この python ライブラリと maxent pos tagger を一緒にインストールするだけで、次のコードでうまくいくはずです。タガーは Penn でトレーニングされているため、タグに違いはありません。上記のコードはそうではありませんが、私は nltk が大好きです。

    import nltk
    nouns=[]
    adj=[]
     #read the text into the variable "text"
    text = nltk.word_tokenize(text)
    tagged=nltk.pos_tag(text)
    for i in tagged:
      if i[1][0]=="N":
        nouns+=[i[0]]
      elif i[1][0]=="J":
        adj+=[i[0]]
于 2012-07-05T06:42:43.847 に答える