パーサーの作成方法

私のプロジェクトの1つでは、興味深い機能が必要でした。たとえば、「牧草地で放牧された牛」というフレーズを「緑の牧草地でジューシーな草を噛む斑点のあるブレンカ」に変換できるように、テキストを言い換えます。 もちろん、この種の変換には、言葉と表現の間の非常に大きなつながりの基盤が必要であり、言葉と表現の不在はすべての仕事を無駄にします。 しかし、それは別の話です。 次に、構文解析の問題をどのように解決したかを説明します。構文解析の問題は、新しいものに変換する必要がありましたが、人間が読めるものと同じです。



ウィキペディアでは、構文解析を次のように定義しています。「 構文解析は、言語のトークン(単語、トークン)の線形シーケンスをその正式な文法と比較するプロセスです。 結果は通常、解析ツリー(構文ツリー)です。 通常、字句解析と組み合わせて使用​​されます。 パーサーは、解析を実行するプログラムまたはプログラムの一部です。



テキストを正常に変換するには、テキストを段落に分割し、それらを順番に行に分割する必要があります。 これは、2008年にシノニマイザー用に購入したSolarixモルフォロジーエンジンの内部ツールを使用して行われました。 セパレータの出力は、それぞれが行の配列を含む段落の配列になりました。



念のため、この記事では、プログラミング言語を意図的に示していません。これは、PLのトピックに関するホリバーを避けたいためです。次に、特定のメソッドではなく、文字列の解析方法について説明します。この解析の実装。 さらに、何らかの理由でSolarixに組み込まれたパーサーを使用できなかったため、自分の庭をフェンスで囲みました。



ハンドラープログラムは、個々の単語だけでなく文全体を処理するマルチパスアナライザーであり、文や段落のコンテキストを使用して、同音異義語が困難な場合や不完全または理解できない文の場合に使用できます。



ページネーションを使用すると、この段落の主なアイデアを強調することができ(もちろん、そうであれば)、コンテキストを作成できます。 正式には、段落の文脈は、この段落のすべての文に現れる主語と述語のすべてのペアと見なすことができます。 単一コンポーネントのオファーの場合、使用される文構造は1つだけです。 もちろん、見つけることができれば。



すべての主要な作業は提案レベルで行われます。 文分析アルゴリズムは非常に単純であり、有限状態マシンの状態として説明できます。 残念ながら、有限状態マシンの作成に関する知識はありますが、そのような自動マシンを作成した経験はありません。 したがって、手続き型のアプローチを使用して、古い祖父の方法ですべてを行うことが決定されました。 さらに、私の手は非常に傷が付いており、何をどのように行うのかをおおまかに知っていました。 数時間後、ロシア語の文法の荒野に巻き込まれ、それを研究するのに多くの時間を費やしたため、これが間違っていることがわかりました。 有限状態マシンの作成にさらに1週間を費やしたということは事実ではありませんが、私はより良い結果を達成したでしょう。



それで、私はロシア語の文法を勉強しながら、アナライザーを作成しました。 アナライザーは、ロシア語でフレーズを構築する基本原則に基づくいくつかの公理に基づいていました。



-文の期限がゼロ以上の場合があります。

-連続して同じケースに立つ複数の被験者が複合被験者を形成します。

-単純な主語は単数形の述語に関連付けられ、複合語の主語は複数形を持つ述語に関連付けられます。

-述語は単純でも複雑でもかまいません。

-複雑な述語は、同じ数と時間を持つ2つ以上の述語で構成されます。

-提案のマイナーメンバー(状況、定義、追加、および付属書)は、提案の主要メンバーとの相対的な位置、および性別、数、時間などの対応する形態的特性に基づいて決定されます。



最初は、「 ママがフレームを洗った 」、「 猫と犬が床に座っている 」、「 猫が牛乳を飲んだ 」という最も単純な文が処理されました 。 これらの文は、形態学的文字のかなりの組み合わせを含むため、難しくありません。 たとえば、「 石鹸フレームの母 」は非常に理解しやすいです。この場合、主格の名詞( )のみが対象になります。 予測可能なのは、性別と数で主題に関連付けられた動詞「 soap 」です。 3番目の単語は、間接的なケース( what? )の質問に答えるため、追加です



注意深い読者は尋ねることができます:牛乳を飲む猫についての3番目の文はどうですか? この場合、私たちは同音異義語を扱っており、それは非常に簡単に解決されます:名詞と動詞の両方の特徴を持つ単語については、性別と数、または複合主題または単純な主題の場合は番号のみで動詞に関連付けられた名詞を見つける必要があります複数。 さらに、間接代名詞または疑問代名詞(これは??)によって表明される明確化がある場合、同音異義語はさらに簡単に削除されます。このような同音異義語は自動的に従属文の対象と見なされます:「牛乳を飲んだ猫は眠りたかった」=>「猫(飲みたい(寝る)、飲んだ(牛乳))」 したがって、「subject-predicate」の2つのセット、「 cat drank 」と「 cat wanted 」が取得され、文自体は複雑であると見なされます。

アナライザーをさらに改良することは特に難しくありません。すでに見つかった文のメンバーに対する形態的特徴の位置と関係に基づいて、文のすべてのマイナーメンバーを探します。



ちなみに、分析自体の前に文の分析を容易にするために、副詞( 良い、迅速、簡単 )を、それらが立っている動詞、分詞、または形容詞にリンクすることによって文を簡素化する必要があります。 orユニオン( and、or、not not )。



特定の文の分析が困難になる場合、問題があるとマークされ、その分析は、パラグラフのコンテキストがすでに多かれ少なかれ定義されている場合、アナライザーの2番目のパスに延期されます。 同時に、このコンテキストを使用すると、問題のある文の問題のある品詞を識別し、そのコンテキストを段落のコンテキストに追加することがかなり高い確実性で可能になります。



残念ながら、パーサーは完成していませんでしたが、単純で複雑な非常にエキゾチックな文を解析できました。 また、単語と語句の関係のデータベースを作成しませんでした。 これは、プロジェクトへの関心が失われたため(いつか再開したいと思います)、また、趣味に費やす自由時間のために、いくつかの商用プロジェクトでの並行作業に関連する時間が足りなかったために起こりましたほとんどなくなった。



All Articles