2つの文を取り、それらが類似しているかどうかを確認するプログラムを作成しようとしています. 私は本格的なパーサーを使いたくなかったので、最も頻繁に遭遇すると思われる単純な文法を使用してパーサーを作成しました。今、私が興味を持っているのは文中の名詞句です。名詞句としてタグ付けされたサブツリーが等しいかどうかをチェックするのは簡単です。これにさらに追加して、欠落/不一致の決定子を受け入れるかどうかをユーザーに決定させたい(部分一致)。
出力ツリーの形式は (S (NP The/DT bag/NN) is/VBZ (JP blue/JJ)) で、文法名詞句 (NP) と形容詞句 (JP) を定義しています。
マッチングを行うために、いくつかのルートを検討しました。
- 関連するツリーの決定子ノードを削除してから比較する
- すべての決定子ノードの値を共通の値、たとえば X に変更する
- 「DT」とタグ付けされたものを除くすべての葉ノードのリストを作成する
私はpythonが初めてで、ここでいくつかの問題に直面しています:
再帰関数を記述して、決定子を持つ葉に到達するまで名詞句ツリーをトラバースすると、値を渡すだけなので、元のツリーの値を変更できません。
nltk ツリーに関して私が見つけた唯一の削除関数は、ツリーのルートに対してノードの正確なインデックスを削除する必要があるものです。ルート ノードの一番左の子。ノードごとに、ツリーの高さとともに成長する整数のリストが含まれる可能性が高いため、これを取得するのは難しいです。
リストのリストを作成しました。各リストには、1 つの名詞句から限定詞を除いたすべての葉が含まれています。これらを比較しました。
だから、私の質問は、
最初に [0,0,1,0,...] の形式でインデックスを取得せずに、NLTK ツリーからノードを削除するにはどうすればよいですか?
インデックスを使用せずにリーフ値を変更するにはどうすればよいですか?(再帰関数を使用したいのですが、関数が変更したいリーフにヒットするたびに、それを変更したいと思います)
これらが不可能な場合、葉のインデックスを取得するにはどうすればよいですか? 私はこれに困惑しています。Nltk ツリーには treeposition 関数がありますが、これはサブツリーに対してのみ機能します。Python は、他のノードと比較した場合、リーフを異なるタイプと見なしますか? 私の葉ではツリーポジションが機能していないためです。これは、リーフが文字列だけでなくタプルであるためかもしれませんが、それを変更する方法がわかりません。これは pos タガーの出力だからです。[the/DT] 形式のタプルであるリーフを (DT the) 形式のサブツリーに置き換える方法はありますか? 再帰プロシージャを再度定義しても、元のツリーは変更されません。
提案/観察はありますか?