この質問は文法の質問に近いことは知っていますが、次のPenn Treebank
ようなトークンの配列がある場合、文の「主語」をどのように決定しますか。
[WP][VBZ][DT][NN]
そのようなトークンを取り込んで、どれがサブジェクトであるかを判別できるJavaライブラリはありますか?またはどれですか?
無料のJavaベースのStanfordDependencyParser(Stanford Parserの一部)は、これを簡単に実行します。などの依存関係を持つ依存関係解析ツリーを生成し、それがのサブジェクトであるnsubj(makes-8, Bell-1)
ことを通知します。あなたがしなければならないのは、パーサーがあなたに探している依存関係のリストまたはエントリをスキャンすることだけであり、それらは動詞の主題です。Bell
makes
nsubj
nsubjpass
主語を含む文の構文単位にラベルを付ける標準的な方法は、構成パーサーを使用することです。構成ツリーは、入力の部分文字列に構文ラベルを付けます。例については、 http://en.wikipedia.org/wiki/Parse_treeを参照してください。
そのような構造がニーズに合うように見える場合は、既製のパーサーを入手して、出力から関連するフレーズを抽出することをお勧めします。
私が知っているほとんどのパーサーには、解析中に品詞 (POS) タグ付けが含まれていますが、所有している POS ラベルに自信がある場合は、パーサーに自分のラベルを使用するように制限することができます。
一貫性のある解析は、計算コストが非常に高くなる可能性があることに注意してください。私の知る限り、最先端のすべての構成要素パーサーは 1 秒あたり 4 ~ 80 文で実行されますが、ある程度の精度を犠牲にすることを厭わない場合は、より高速に実行できる可能性があります。
いくつかの推奨事項 (詳細はSimple Natural Language Processing Startup for Java を参照)。
バークレー パーサー ( http://code.google.com/p/berkeleyparser/ )。最先端の精度と適度な速さ (1 秒あたり 3 ~ 5 センテンス)。
BUBS パーサー ( http://code.google.com/p/bubs-parser/ ) は、高精度のバークレー文法でも実行できますが、精度は少し落ちます (気にする人にとっては F1 スコアで約 1.5 ポイント)。 ) しかし、効率は 1 秒あたり約 50 ~ 80 文に向上します。完全な開示 - 私はこのパーサーに取り組んでいる主要な研究者の 1 人です。
警告: これらのパーサーは両方とも研究用コードです。でも、現実世界でBUBSを使っている人がいて嬉しいです。試してみたら、問題、質問、コメントなどを私に連絡してください。
OpenNLP を使用してポルトガル語の科目を分類することに成功しました。OpenNLP Chunker コンポーネントを少し調整して、浅いパーサーを作成しました。
pos のタグ付けとチャンクには既存の OpenNLP モデルを使用できますが、PoS タグとチャンク タグを使用してサブジェクトを分類する新しいチャンク モデルをトレーニングします。
Chunker をトレーニングするためのデータ形式は、 Conll 2000に基づいています。
He PRP B-NP
reckons VBZ B-VP
the DT B-NP
current JJ I-NP
account NN I-NP
deficit NN I-NP
will MD B-VP
narrow VB I-VP
...
次に、次のような新しいコーパスを作成しました
He PRP+B-NP B-SUBJ
reckons VBZ+B-VP B-V
the DT+B-NP O
current JJ+I-NP O
account NN+I-NP O
deficit NN+I-NP O
will MD+B-VP O
narrow VB+I-VP O
Penn Treebank にアクセスできる場合は、コーパス内のサブジェクト ノードを検索して、そのようなデータを作成できます。おそらく、CoNLL-2000 共有タスクのデータを生成するために使用されるこの Perl スクリプトから始めることができます。
ポルトガル語の評価結果は、精度が 87.07%、再現率が 75.48%、F1 が 80.86% です。