Ontoengineer:コンセプトに取り組む

こんにちは、Habr! 私の名前はDanyaです。知識マイニンググループGuess What Companyで働いています。 私は2つの投稿で伝えます



Habréには、非構造化テキストから情報を抽出することに専念した出版物が既にいくつかあります(その多くは、 テキストマイニング情報抽出タグを使用して検索されます)。 ここでは、たとえば、テキストから何かを抽出するのが便利になる前に、テキストで行うことが望ましいことについての簡潔な紳士のセットがあります(ネタバレ:これもすべて行います)。 そして、 ここでは、 Yandexの同僚がCS文法を使用したアプローチについて説明しています(ところで、トルストイもそこに関与しています)。 一般的に、このトピックはHabrにとって新しいものではありませんが、十分に公開されているとは言えません。 したがって、私たちは経験を共有することにしました。



ABBYYでは、根本的に問題に取り組み、普遍的で長期的なスケーラブルなソリューションを考え出します。 そして、ここで、テキストから情報を抽出する問題が発生したとき、私たちはスクリプトと正規表現から膝の上に何も彫刻しませんでしたが、重い言語の大砲-ABBYY Comprenoテクノロジーを使用しました



森の奥へ:悪いプログラマーと良い伝統



ABBYY Comprenoパーサーは、テキストを依存関係の文法 (多くの人によく知られているスタンフォードパーサーが使用する依存関係の文法 )とConstituencyの文法のプロパティを組み合わせたツリーのフォレストに変換します。 詳細には触れず、構文理論の世界に入りません。ツリーのノードが文の単語にほぼ対応しており、アークがそれらの間の依存関係を反映していることを理解するのに十分です。 同時に、ノードには膨大な量の関連言語情報が装備されています。 これは、フレーズのツリーがどのようなものかを示しています







フレーズのツリーと比較すると、 プログラマーが間違ったコードを入力しました。







カプセルの緑色のテキストは、私たちの普遍的な意味階層の各単語に対して選択された意味クラスです。 セマンティック階層は、言語情報の継承の原則によって編成されたすべての品詞を網羅する概念の巨大なツリーです。 さらに、構文モデルが組み込まれています。 階層のセマンティッククラスは伝統的に英語で呼ばれ、特定の言語に結び付けられていない概念に対応する単語の特定の意味に対応しています。 したがって、セマンティッククラスを選択するときに、語彙のあいまいさが解決されます。 このような選択の例は、最初の文でIC 「CODE_OF_PROGRAM」(コンピュータープログラムの一部としてのコード)が選択され、2番目の文で「CODE」 IC (暗号としてのコード、パスワード)が選択されるワードコードに表示されます。 このような場合、システムの決定は、統計とセマンティック階層内で定義された言語構造の制限の両方の影響を受けます。







これは、言及されたクラスが配置されている階層のフラグメントです。



そして、ここにあいまいさ解決の別の例があります- プログラマーはバグのないコーディングの伝統を導入しました 。 ここで、ご覧のように、 導入された単語形式に対して完全に異なる意味クラスが選択されました。これは、単語がまったく異なる意味で使用されるためです。







木の青は、 表面構文のノードの位置を示します。これは、その意味と直接関係のない正式な文構造です。 主題、述語、追加などを含む学校モデルに非常に近いです。 濃い色は赤で示されています-既に説明した状況で要素がどのような役割を果たしているかを示しています。 したがって、プログラマーに関する最初の例をパッシブに変換すると- プログラマーは悪いコードを書いた -表面のサブジェクトはツリー内で変化します( プログラマーはそこでサブジェクトになりますが、 コード )が、深いエージェントではありません(実際には、フレーズ、アクションはまだプログラマーによって実行されます):







意味構文ツリーに加えて、ABBYY Comprenoパーサーは、ノード間の非木材関係に関する情報を返します。 たとえば、フレーズの場合、 Vasyaはコンピューターの前に座って動詞「encode」にコード化され、ゼロのサブジェクトが復元され、「Vasya」ノードと非木材接続で接続されます。







同じことが起こり、 Vasyaがコードを書くために残した文で-文法構造の観点から、Vasyaは動詞「left」によって示されるアクションのみを積極的に実行しますが、コードを書いた人は知っています。







Vasyaは、代名詞の後ろに隠れて、彼の暗い出来事を隠すことができなくなります。 「 Vasyaがなくなった 」、「 彼はコードに行った 」、「 Vasyaは自分のコードが好き 」などの例では、 Comprenoは照応関係を復元し、代名詞(「 He 」、「 」)をVasyaに置き換えます。















世界の創造



ABBYY Comprenoパーサーの動作の詳細については、 こちらをご覧ください 。 投稿のトピックに直接移動し、この言語プラットフォームに基づいて事実とエンティティの抽出がどのように編成されるかを説明し始めます。 ここで、オントロジーエンジニアが登場します。世界の正式なモデル( オントロジー )を作成し、これらのモデルに対応する情報を抽出する専門家です。 Ontengineerのタスクは、最初に抽出する必要のある情報オブジェクトの形式表現を考え出し、次にComprenoツリーのフォレストからそれらを抽出するルールのシステムを開発することです。



作業の最初の段階-オントロジーモデルの開発-は、OOPでのクラスの作成と比較できます。 たとえば、オントロジーエンジニアがテキストから人物を抽出するタスクを担当している場合、適切な概念を作成し(この単語はオントロジーモデリングのクラスに相当するものとして使用されます)、オントロジーに埋め込む必要があります。 他の概念との継承を確立し、名前、姓などの必要な属性を作成します。 これを行うには、W3Cコンソーシアムでサポートされているオントロジー記述標準であるOWL言語を使用ます。 オントロジーの人は次のようになります。



<owl:Class rdf:about="http://www.abbyy.com/ns/BasicEntity#Person"> <rdfs:subClassOf rdf:resource="http://www.abbyy.com/ns/Basic#HumanLikeSubject"/> <rdfs:subClassOf rdf:resource="http://www.abbyy.com/ns/Basic#BasicEntity"/> <rdfs:subClassOf rdf:resource="http://www.abbyy.com/ns/Basic#IdentifiableThing"/> <rdfs:subClassOf rdf:resource="http://www.abbyy.com/ns/Basic#EntityLikeSubject"/> <Aux:LeadingParent rdf:resource="http://www.abbyy.com/ns/Basic#BasicEntity"/> <rdfs:label xml:lang="En">Person</rdfs:label> <rdfs:label xml:lang="Ru"></rdfs:label> <rdfs:comment xml:lang="En">For example: Mikhail Yuryevich Lermontov was born on October 15, 1814 in Moscow.</rdfs:comment> <rdfs:comment xml:lang="Ru">:     15  1814   .</rdfs:comment> </owl:Class>
      
      





そして-彼女の属性「姓」:



 <owl:DataProperty rdf:about="http://www.abbyy.com/ns/BasicEntity#surname"> <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> <rdfs:domain rdf:resource="http://www.abbyy.com/ns/BasicEntity#Person"/> <rdfs:label xml:lang="En">Surname</rdfs:label> <rdfs:label xml:lang="Ru"></rdfs:label> <rdfs:comment xml:lang="En">Mikhail Yuryevich Lermontov: Surname - Lermontov</rdfs:comment> <rdfs:comment xml:lang="Ru">  :  - </rdfs:comment> </owl:DataProperty>
      
      





属性が設定される概念は、この属性のドメインと呼ばれます。 この場合、スコープはPersonコンセプトに属するオブジェクトです。 属性が入力できるデータのタイプは、範囲で指定されます。 この場合、それは文字列です。

オントロジーエンジニアの利便性のために、オントロジーを開発するための特別なグラフィカル環境が作成されました。







円は概念を表します。 線で結ばれた円-属性/概念の関係、

概念に応じて、その属性のプレースホルダーは単純なデータ型(文字列、数値、ブール値)、または他の概念に関連するオブジェクトのいずれかです。 これは、参加者が他のルールによって抽出されたエンティティであるという事実に特に当てはまります。 エンティティ内に記述された関係としてではなく、エンティティに類似した個別の情報オブジェクトとして、いくつかの可能な参加者のほとんどすべての事実をモデル化します(ちなみに、これはW3Cによる推奨事項でもあります)。 これは、私たちの購入と販売の事実(Purchase And Sale)がOWLレコードでどのように見えるかです:



 <owl:Class rdf:about="http://www.abbyy.com/ns/BasicFact#PurchaseAndSale"> <rdfs:subClassOf rdf:resource="http://www.abbyy.com/ns/BasicFact#OperationWithProperty"/> <rdfs:label xml:lang="En">Purchase And Sale</rdfs:label> <rdfs:label xml:lang="Ru">-</rdfs:label> </owl:Class>
      
      





そして彼の関係もそうです。



 <owl:ObjectProperty rdf:about="http://www.abbyy.com/ns/BasicFact#seller"> <rdfs:range rdf:resource="http://www.abbyy.com/ns/Basic#Subject"/> <rdfs:domain rdf:resource="http://www.abbyy.com/ns/BasicFact#PurchaseAndSale"/> <rdfs:label xml:lang="En">Seller</rdfs:label> <rdfs:label xml:lang="Ru"></rdfs:label> </owl:ObjectProperty> <owl:ObjectProperty rdf:about="http://www.abbyy.com/ns/BasicFact#customer"> <rdfs:range rdf:resource="http://www.abbyy.com/ns/Basic#Subject"/> <rdfs:domain rdf:resource="http://www.abbyy.com/ns/BasicFact#PurchaseAndSale"/> <rdfs:label xml:lang="En">Customer</rdfs:label> <rdfs:label xml:lang="Ru"></rdfs:label> </owl:ObjectProperty> <owl:ObjectProperty rdf:about="http://www.abbyy.com/ns/BasicFact#price"> <rdfs:range rdf:resource="http://www.abbyy.com/ns/BasicEntity#Money"/> <rdfs:domain rdf:resource="http://www.abbyy.com/ns/BasicFact#PurchaseAndSale"/> <rdfs:label xml:lang="En">Price</rdfs:label> <rdfs:label xml:lang="Ru"></rdfs:label> </owl:ObjectProperty> <owl:ObjectProperty rdf:about="http://www.abbyy.com/ns/BasicFact#property"> <rdfs:range rdf:resource="http://www.abbyy.com/ns/Basic#ExtendedProfit"/> <rdfs:domain rdf:resource="http://www.abbyy.com/ns/BasicFact#OperationWithProperty"/> <rdfs:label xml:lang="En">Property</rdfs:label> <rdfs:label xml:lang="Ru"></rdfs:label> </owl:ObjectProperty>
      
      





範囲からわかるように、これらの関係はすべて単純なデータ型ではなく、他の概念のオブジェクトへの参照で満たされています。 たとえば、価格関係には、「金銭」エンティティのみを入力できます。 概念BasicEntity#Moneyまたはその子孫のオブジェクト。



次の記事で、これがどのように機能し、一部のオブジェクトが他のオブジェクトとどのように関連するかについて読んでください。



All Articles