5

自然言語文構造ツリーのデータベースを保存および検索する最良の方法は何ですか?自然言語文構造の検索

使用方法英語Treebank Parserを使用すると、任意の文章に対してかなり信頼できる文章構造解析を行うことができます。私がしたいのは、ソースコードからすべてのドキュメント文字列を抽出し、ドキュメント文字列内のすべての文に対してこれらのツリーを生成し、これらのツリーと関連する関数名をデータベースに格納してから、ユーザーは自然言語のクエリを使用してデータベースを検索します。

ので、機能upload_files()のための文章"This uploads files to a remote machine."与え、私は木を持っているだろう:「?どうやってファイルをアップロードすることができます」

(TOP 
    (S 
    (NP (DT This)) 
    (VP 
     (VBZ uploads) 
     (NP (NNS files)) 
     (PP (TO to) (NP (DT a) (JJ remote) (NN machine)))) 
    (. .))) 

誰かがクエリを入力した場合は、ツリーに等化:

(TOP 
    (SBARQ 
    (WHADVP (WRB How)) 
    (SQ (MD can) (NP (PRP I)) (VP (VB upload) (NP (NNS files)))) 
    (. ?))) 

これらのツリーをSQLデータベースに保存して照会するにはどうすればよいですか?

私は、正規表現とネットワークグラフの解析を組み合わせてこの検索を実行できる簡単な概念実証スクリプトを作成しましたが、これをスケーラブルな方法で実装する方法がわかりません。

はい、私の例が簡単なキーワード検索を使用して取得するのは簡単ではないことがわかります。私がテストしようとしている考え方は、文法構造をどのように活用できるかということです。類似したキーワードを持つエントリを取り除くことはできますが、文構造は異なります。たとえば、上記のクエリでは、類似のキーワードを持つ文"Checks a remote machine to find a user that uploads files."に関連付けられているエントリを取得するのは望ましくありませんが、明らかに全く異なる動作を記述しています。

答えて

2

リレーショナルデータベースは自然な方法で知識を格納することはできません、あなたが実際に必要なのは(それは、リレーショナルデータベースの上に構築されてもよいが)知識ベースまたはオントロジーです。これは、データを保持するためにトリプル<subject, predicate, object>、あなたのフレーズは<upload_file(), upload, file>として格納されます。そのようなKBの中で検索するには、多くのツールや方法があります(たとえば、Prologはそれを行うために設計された言語です)。だから、あなたがしなければならないすべては、KBトリプレット/オントロジーグラフに自然言語からの文章を翻訳不完全トリプレット(あなたの質問は、<?, upload, file>のようになります)、または連言クエリにユーザーのクエリを変換して、あなたのKBを検索することです。 OpenNLPは翻訳の手助けをします。残りは、あなたが使用することを決めた具体的な技術と技術に依存します。

+0

これは興味深いアイデアですが、私はセマンティックWebオントロジーを使用することは、あなたが述べているより少し複雑に思えるでしょう。それは単一の平らな三つ組ほど単純ではありません。サブジェクト、述語、およびオブジェクトはそれぞれ、品詞でタグ付けする必要があるネストされたトリプルであってもよい。 – Cerin

+0

@Cerin:オントロジーでは、すでに「きれいになった」データ、つまり事実ではなく、言葉自体で作業しています。また、オントロジのトリプルはネストすることはできませんが、かなり大きなサブグラフを作成することができます。最も難しいことは、文章を事実に翻訳することですが、とにかく効率的な検索を実行するためには翻訳する必要があります。なぜなら、それを構造に翻訳しないでください。それはよく知られており、何千もの論文に記述されています。ドメイン領域からの非常に基本的なトリプルを使っていくつかの初期オントロジーを手動で作成し、それを使って新しいファクトをマップし、それを拡大することができます。 – ffriend

+0

私はあなたの意見を見ますが、これは実用的ではないかもしれません。データは決して完全に「クリーン」ではありません。 OpenNLPは確信度でタグ付けされたいくつかのパースを出力するので、オントロジの各サブグラフはこの不確実性を保存して推論する必要があります。事実と言葉/文を明確に区別することもありません。私は検索を改善するために文法的構造を利用したいだけです。セマンティクスも解釈しようとすると、範囲外です。 – Cerin

2

私はffriendに同意します。これは、ナレッジベースと自然言語検索に関する既存の作業に基づいて異なるアプローチをとる必要があることに同意します。リレーショナルデータベースにコンテキストフリーの解析木を格納することは問題ではありませんが、検索の一部としてパースツリーを意味のある比較を行うことは非常に困難になります。あなたが文法的な関係についての少しの知識を利用することにちょうど興味があるとき、解析木は本当に複雑すぎます。構文解析を依存関係のトリプルに単純化すると、検索の問題をもっと簡単にして、最初に興味のあった文法関係を得ることができます。たとえば、Stanford dependency parserを使用すると、コンテキストのない解析が生成され、そこから依存関係のトリプルが抽出されます。それは、「リモートマシンにこの機能をアップロードしたファイル」のため、このような出力を生成:データベースで

det(function-2, This-1) 
nsubj(uploads-3, function-2) 
dobj(uploads-3, files-4) 
det(machine-8, a-6) 
amod(machine-8, remote-7) 
prep_to(uploads-3, machine-8) 

を、あなたは、機能に関連付けられているこれらのトリプルの簡略化されたサブセットを格納することができ、例えば:

upload_file(): subj(uploads, function) 
upload_file(): obj(uploads, file) 
upload_file(): prep(uploads, machine) 

人が検索すると、最も重複しているトリプルを持つ関数やその行に沿ったものを見つけることができます。おそらく異なる依存関係を重み付けしたり、部分一致を許可したりすることもできます。トリプルから補題へ、多分あなたが必要とするものに応じてPOS。

自然言語検索(Powersetなど)に取り組んでいる人は多いので、既存のアプローチを必ず検索してください。私の提案したアプローチは実際にはごくわずかなもので、問題が発生する例がたくさんあると思いますが、これらの行には制限されたドメインではうまくいくと思います。

1

これは完全な答えはありませんが、あなたは木の上に言語的に洗練されたクエリを実行したい場合は、最善の策は、あなたのパーサー出力を事前処理とtgrep2でそれを検索することです:

http://www.stanford.edu/dept/linguistics/corpora/cas-tut-tgrep.html

Trgrep/tgrep2は、私が知る限り、解析木を検索するための最も柔軟でフル機能のパッケージです。これはMySQLベースのソリューションではありませんが、このオプションについて知りたいと思っています。

Tgrep2では、親、子孫および兄弟に関する質問をすることができますが、他のソリューションでは解析のツリー構造全体が保持されない場合や、高度なクエリが許可されます。