テキストから関係と事実を抽出する簡単な方法

前に、さまざまな側面(食品、装飾など)への参照を抽出するために、レストランに関するレビューの分析について書きました。 最近、 コメントでは、テキストから事実情報を抽出することに関して質問が生じました。 たとえば、車のレビューから事実を抽出できます。たとえば、「ギアボックスがすぐに壊れる」=>壊れる(ギアボックスはすぐに)ので、後でこれらの事実を操作できます。 この記事では、このような問題を解決するための1つのアプローチについて説明します。







ここで説明する方法は、いくつかの単純化に基づいています。最も正確ではありませんが、実装が簡単で、使用するプロトタイプアプリケーションをすばやく作成できます。 場合によってはそれで十分ですが、他の場合は、基本原則から逸脱することなく改善を導入することが可能です。



たとえば、TVブラケットに関するレビューでこのような提案を検討してください。



テレビとのすべての開口部は、ワッシャーが落ちることはありません



たとえば、次の形式で比率を抽出します。



述語=>一致

件名=>穴

オブジェクト=>テレビ付き



述語=>脱落しない

件名=>ワッシャー



このタスクは、多くの場合セマンティックロールラベリングと呼ばれます。 いくつかの動詞(一致、脱落など)があり、その引数があります。 動詞の議論とその内容は、言語学者の間で議論の対象となっています。 実際には、特定のタスクに必要なものです。 したがって、哲学的な問題に深く突入しないために、行動が行われた主題、目的、状況/条件が必要であると判断します。 説明は、オブジェクトまたは主題に添付することもできます。たとえば、good TVというフレーズでは、goodという単語がこの役割を果たします。 説明がオブジェクトの品質の特性ではなく、そのコンポーネント(プラズマTV)の特性である場合、これを別のクラスに割り当てます。 そもそもこれで十分ですが、もう少し低くしてこの問題に戻ります。



ここで、 説明した解決策であるシーケンスに注釈を付ける問題との関係を抽出する問題を軽減しようとします。

全部
件名
TV オブジェクト
合わせる 述語
ワッシャー オブジェクト
じゃない 述語
落ちる 述語


各単語の前に対応するカテゴリを配置し、十分なサイズのトレーニングサンプルをマークします。 次に、CRFなどのシーケンスを処理できる分類器をトレーニングし、その後、新しい文を送信することにより、各単語のカテゴリ予測を取得できます。 もちろん、私たちはAPIを実験に使用しました。私たちのサイトに登録することで誰でも無料でアクセスできます。 使用方法については、ここで詳しく説明しているので、主な考えを失わないようにここでは繰り返しません。



約100の文を手動でマークしましたが、実際にはこのようなタスクの非常に小さなサンプルです。 次に、モデルの入力にいくつかの新しいオファーを提出しました。これが何が起こったかです。

最初の文:

変更された 述語
千枚通し オブジェクト
せっけん オブジェクト
のために
そのような
お金 オブジェクト
買った 述語
名前 オブジェクト


2番目の文:

完成する オブジェクト
ほかに
いつもの
ナイフ オブジェクト
そこにある 述語
のために
点線 説明
ノッチ オブジェクト


この段階で、動詞とそれに対応するオブジェクトの間の接続が失われたことに気付きました(実際、これはすぐにわかりましたが、表示を簡単にするために言っていませんでした)。



この問題を解決するにはさまざまな方法があります。 高度に特殊化されたシステムでは、引数自体の形式は、どの動詞と関連する必要があるかについて説明できます。



列車は16-00に駅に到着し、 15-20に 出発します



ここでは、すぐに16-00をArrival_timeとして、15-20をDeparture_timeとしてマークできますが、動詞もタイプを持ちます。たとえば、タイプは「 到着 」で、タイプは「 出発 」です。 したがって、正しい比較の問題はシーケンス注釈システムに転送され、それに対処するかどうかは、使用されるアルゴリズムに依存します。



このアプローチは、チームの分析に適しています(「明日午前10時に起床=>午前10時に起床、「10人でピザを注文」=>注文(ピザ、10人)など)



この場合、引数の型をより正確に定義できます。 「TVマッチを使用したすべてのオープニング」というフレーズでは、リレーションシップタイプは「 マッチ 」、2つの引数は「 what_coincides 」と「 what_what_coincides 」になります。 そして、これは、比率の数が制限され、厳密に定義されている場合に効果的です。



最初に、引数のタイプが非常に曖昧な場合、それらが任意の動詞に適合することを期待して、より一般的なスキームを選択しました。 この結果として、分析の第2フェーズ-どの引数がどの動詞に対応するかを決定する必要があります。



ファクトを抽出する簡単な方法を作成しているため、すべてのオブジェクトは、それらに最も近い動詞に属していると想定しています。 これは常に当てはまるわけではありませんが、しばしば真実です。 同じ方法を使用して、説明のオブジェクトを相互に関連付けることができます。



この単純化を受け入れて、最初に特定のすべての動詞を検索し、次に対応するオブジェクトをそれらに運び、言葉で動詞までの距離を数えるプログラムを作成しました。 上記の文からこのプログラムを使用して、次の関係を特定することができました。



最初の文:



述語=>変更

object1 =>千枚通し

object2 =>石鹸



述語=>購入

オブジェクト=>名前



2番目の文:



述語=>は

object1 =>ノッチ

説明=>点線

object2 =>ナイフ

説明=>普通

object3 =>セット



それはかなり興味深いものであることが判明しましたが、トレーニングサンプルの手動注釈を含むすべての作業には4時間かかりました。 品質を向上させるために、分析の第2段階で選択したすべてのファクトを収集し、結果の分析に基づいて誤って定義された関係を破棄しようとすることができます。



一般に、私たちが見るように、テキストから関係を抽出するタスクは、さまざまな方法で解決できます。 利用可能なメソッドに焦点を当てようとして、ごく少数を検討しましたが、ご覧のとおり、このようなアナライザーを構築することはそれほど難しくありません。



All Articles