規約
記事に基づいて記事を作成するために使用する用語を示すことにしました。
- トークン -問題または行の終わり/始まりで区切られたテキストの一部(文字の配列)。
- 技術的な文字 -テキスト内のトークンを論理的にグループ化するために使用される文字(:、。!??;);
- 最初のグループの技術記号 -テキストを文章に分割するためにテキストで最もよく使用される記号。
- 第2グループの技術記号 -文で部分に分割するためにテキストで最もよく使用される記号。
それでは、もっとわかりにくい定義、つまり文に移りましょう。 ウィキペディアから定義を取得します。
(言語の)文は、意味的およびイントネーション的な完全性を持つ、単語(または単語)の文法的に編成された組み合わせである言語の単位です[1]。 句読点の観点からは、最後にピリオド、感嘆符、疑問符、または省略記号が付いた完全な音声単位としての文が形成されます。
この定義は、2番目の部分(句読点)をわずかに変更して、ほぼそのまま使用できます。
オファー -テキストを文章に分割するために使用される技術的なシンボルで区切られたトークンの一部。
そのため、どの文字を使用してテキストを文章に分割するかを、舞台裏でそのまま残します。
言語的に独立した方法でテキストを文章に分割するプロセス
まず、問題の状態を判断しましょう。
- トキナイズされたテキスト(トークンの配列)が入力されます。
- テキストの言語に関するデータはありません。
- 文字を使用したり、テキストを文に分割するために使用できるデータはありません。
このような条件でテキストを文に分割するタスクは、4つのサブタスクに分割されます。
- テキスト内の技術的な文字を見つけます。
- 見つかった技術的特徴をグループに分けます。
- 技術記号のグループのうち、最初のグループと2番目のグループを決定します。
- 選択した文字グループを使用してテキストを文章に分割します。
これらのタスクはそれぞれ非常に独立しており、他のタスクから分離して検討することができます。 少し理解しましょう。 各ステップについて、英語版のアルゴリズムの説明が記載されたウィキへのリンクが提供されます。
1テキスト内の技術的な文字を検索する
ウィキ
テキストで技術的な文字を見つけるにはどうすればよいですか?
ほとんどの言語のテキストをざっと見てみると、これらの文字(技術文字)が常にトークンの最後に表示されていることがわかります。 この仮説は、すぐに着信メッセージの言語に制限を課します(言語にはスペースを使用する必要があります)。 仮説が正しい場合、技術記号をどのように定義できるかを考えてみましょう。
頭に浮かぶかもしれない最初のことは、各シンボルについて、与えられたテキスト内のこのシンボルがトークンの最後にある確率を計算することです。 そして、最も確率の高いキャラクターを選択します。
この仮定は、さまざまな言語での最初の実験について解かれており、多くの言語では、トークンの最初または最後にうらやましい規則性を持った文字が存在することを示しています。 このアプローチを使用することは非常に単純です不可能です。
その結果、シンボルが技術的な確率式は次のようになります。
(1)P1(ch)*(P2(ch)^ 2)
ここで:
P1(ch)は、このテキストの文字chがトークンの最後にある確率です。
P2(ch)-これは、このテキストのch文字の前の文字がトークンの最後にも現れる確率です。
P2の確率を計算する例を見てみましょう。 これらのキャラクターがあるとしましょう:
。 ヤブ
そして、それらがトークンの最後にある確率:
P1(。)= 0.8
P1(y)= 0.9
P1(a)= 0.01
P1(b)= 0.02
トークンの最後にあるドット記号は4回出会っており、次の記号がドットの前に立っていました。
y-3回
a-1回
この場合、P2( '。')は次のように計算されます。
3/4 * P1(y)+ 1/4 * P1(a)= 0.75 * 0.9 + 0.25 * 0.01 = 0.6775
これはすでに興味深いものです。 そして、それはうまくいくようです。 ただし、AIFコードを詳しく調べると、この式を使用して確率を計算するよりも分析が少し複雑であることがわかります。
実際のところ、この式でも100%の結果は得られません。 単語がしばしば同じ2文字で終わる言語があります。 さて、たとえば、末尾の「ec」が実質的に普及しているテキスト。 同時に、e記号自体がトークンの最後に表示されることがよくあります。 その結果、シンボル「c」は技術的なものとして強調表示されます。これは、多くの場合トークンの末尾に表示され、その前にはトークンの末尾にも表示されるシンボルがあるためです。
ただし、処理も非常に簡単です。最初の式で取得した技術記号を除外する必要があります。 2つの単純な基準でフィルタリングできます。 まず、シンボルが常にトークンの最後にあるという可能性。 はい、はい、これは悪い基準であると言いましたが、ヒューリスティックによって発見された文字の優れたフィルターでもあります。 第二に、テキストに非常に少ない文字を削除する必要があります。 出力でシンボルを取得したくありません。これはテキストで既に会ったことがありますが、今回はトークンの最後にありました。 この記号はおそらくセパレータですが、どのような方法でも見つけることはできません。
その結果、AIFは次のことを行います。
式1で計算された確率が最も高いN文字を選択し、その中から確率P1が最大のN2文字を選択します。 適切なN / N2番号を選択する方法は別のタスクですが、AIFはこれらの番号を何らかの方法で天井から取っているため、ここでは詳しく説明しません。 この点に関して、いくつかの仮説を実際にテストしていません。
Habréの最初の記事では、テキスト内の式による最初のパスのスケジュールが示されました。 その瞬間から式が変更され、より正確に(はるかに正確に)動作するようになりました。
次に、定性分析について少し話しましょう。
アプローチの定性分析では、次の結果が示されます(186冊)。
186冊の本でポイントを見つけることができない12冊の本。
コンマを見つけることができない2冊の本。
技術的なシンボルとして文字が強調表示された3冊の本。
2技術記号のグループへの分割
ウィキ
前の段階で、技術記号のリストを定義することができました。 リストは、たとえば次のようになります。
。、!?:;()”-
次に、このリストをグループに分割する必要があります。 この例では、キャラクターを次のようにグループに分けることができます。
。!?()」
-:;;
グループに分割するタスクは、単純な仮説によって解決されました。各言語には、文の先頭でよく使用される記号があります。 したがって、技術記号ごとに、技術記号に続く記号との関係のグラフを作成できます。
その結果、各セパレータ文字について次の関係グラフが得られます。
コミュニケーションポイント:
。
P = 32、S = 16、T = 63、F = 15、W = 44、{= 67、N = 14
コンマ通信:
、
p = 47、a = 59、b = 84、c = 52、s = 102、d = 76、t = 295、e = 49、w = 318、m = 59
ラテン文字の関係「y」:
y
s = 3、t = 2、w = 6
リンクデータは実際のテキストから取得され、フィルタリングされます。 実際、分析用のAIFは最も重要なリンクのみを残しています。 フィルタリングを行わないと、グラフは少し異なります。
もちろん、絶対スケールには関心がなく、通信データは確率論に変換されます。
各シンボルにこのような接続グラフがあるので、シンボルを2つのクラスターに分割できます;このためには、2つのグラフを比較するためのアルゴリズムを定義するだけです。
AIFでのグラフ比較の実装は、例で最もよくわかります。 2つのリンクグラフがあるとします。
。
0.2
P 0.6
0.05
n 0.15
、
0.4
n 0.6
そして今、比較アルゴリズム:
P(ch1、ch2)= ch1.connections.keys.mapToDouble(connectionKey->(ch1.connections.get(connectionKey)+ ch2.connections.get(connectionKey))/ 2).sum()/ ch1.connections.keys .size()
そのようなもの。 はい、ここにはいくつかのニュアンスがあります。たとえば、P(ch1、ch1)はP(ch2、ch1)と等しくない場合があります。 しかし、Alpha2が最終バージョンであると言う人はいません;)
このアプローチは、大文字と小文字を使用する言語で特にうまく機能します(大文字または小文字)。 少し悪いですが、それでも効果的です。アラビア語などの言語で動作します。
このモジュールの品質:
ドットとコンマが同じグループに分類される場合、100冊あたり0.5冊。
もちろん、この時点では、非常に多くが舞台裏に残っています。 たとえば、どの確率しきい値P(ch1、ch2)の後、2つのグラフが等しくなり、1つのクラスターからこれらのグラフを形成する2つの文字になると仮定しますか?
さまざまな本のグループのランダムな例:
ブック1:[“; 、] [。]
ブック2:[! 。] [:; 、]
3テキストを文章に分解する責任がある技術記号のグループを決定する
ウィキ
そして、ここではすべてが非常に簡単です。 トークンの配列を新しい配列に表示します。各配列には、トークンが終了する技術記号のグループ番号が割り当てられます。 トークンに技術的なシンボルがない場合は、ゼログループに入れます。 たとえば、次のトークンがあります。
こんにちは お元気ですか 私はすべてが秩序だと思います。 いや?
そして最後の段階で、このようなセパレータのグループを特定しました:
1-[!?、]
2-[、]
したがって、表示後、次の配列を取得します。
1 0 0 1 2 2 0 0 0 1 1
このような配列を使用すると、グループ(たとえば、最初のグループ)と次のトークンが始まるシンボルとの間に接続を構築できます。
さて、そして例:ここに、最初のグループとシンボルの接続があります-実際の本から取ったものです(接続は最大に正規化されています):
{A = 0.36、B = 0.26、 "= 0.39、C = 0.10、D = 0.08、E = 0.1、H = 0.37、I = 0.72、L = 0.08、M = 0.14、N = 0.1、O = 0.15、S = 0.26、T = 1.0、W = 0.26、Y = 0.08}
次に、2番目のグループのリンクを示します。
{A = 0.05、a = 1.0、 "= 0.11、b = 0.24、c = 0.08、d = 0.06、e = 0.05、f = 0.11、h = 0.17、I = 0.09、i = 0.22、m = 0.07、n = 0.06、o = 0.16、p = 0.05、s = 0.21、t = 0.40、w = 0.35}
前回と同様に、AIFは接続をフィルタリングし、最も重要なもののみを残します。 したがって、フィルタリングする前に、通信はわずかに異なります。
そして、ここにゼログループの結合があります:
{a = 0.61、b = 0.25、c = 0.26、d = 0.18、e = 0.15、f = 0.26、g = 0.12、h = 0.41、I = 0.05、i = 0.35、l = 0.17、m = 0.26、n = 0.13、o = 0.48、p = 0.22、r = 0.14、s = 0.42、t = 1.0、u = 0.07、v = 0.06、w = 0.43、y = 0.06}
このデータがあれば、どのグループがゼログループのグラフに近いかを計算するだけです。 このグループ(ゼログループに最も近い)を構成する技術記号は、文内のトークンを区切るために使用される記号です。 同時に、ゼログループのグラフから可能な限り離れたグラフは、テキストを文に分割する役割を担う技術記号のグループによって形成されます。
この例では、最初のグループはトークンを文に分割する技術記号のグループであり、2番目のグループには文内のトークンを分割する記号が含まれています。
結果の定性分析は以下を示します。
ポイントが間違ったグループに割り当てられた180冊のうち4冊。
180冊中2冊。コンマは間違ったグループに割り当てられていた。
4選択した文字グループを使用してテキストを文章に分割する
ウィキ
まあ。 キャラクターのグループがあり、どのグループが何に責任があるのかを知っています。 しかし、どの場合に最初のグループの文字がテキストを文に分割するために使用され、どの場合には使用されないのかをどのように理解できますか?
たとえば、「SSSSR」の末尾のポイントが文の終わりではなく、単に略語の終わりであることを理解する方法。 まあ、または「千」のような略語、など。
また、すべてがシンプルです。
最初のグループに属するシンボルを知っていれば、すべてのトークンを調べて、文の平均長を計算できます。 その後、最初のグループの文字を使用する場合ごとに、次のことができます。
次のトークンの最初のシンボルを見て、この関係が特徴的な技術シンボルのグループを言います。
最初のグループの前のキャラクターと次のグループまでの距離を見てください。
次のトークンの記号が記号の2番目のグループの特性であり、前後の文のサイズがテキスト内の文の平均サイズ以下である場合、この特定のケースでは、最初のグループの記号はテキストを文に分割するために使用されません。
AIFによって検出された場所を含む本の例で、最初のグループのセパレーターが2番目のグループのセパレーターとしてマークされています。
ソウル国際ビエンナーレでの「最後の反乱」
「このキラー...彼はとても柔らかくて
エルダーリャザノフ。 「運命のアイロニー」、「オフィスロマンス」
5〜7分 シンプルになることもあります
1分 お湯(+ 37–38°)、1
5-10秒 -冷水(
五千年前に行われた
この結果を見ると、テキスト自体以外の入力情報がなくても、言語に依存せずに完全に機能することを理解するのは非常に面白いです。 以下は英語の別の本の例です。
米国連邦法および
著作権がない限り、米国
残念ながら、現在のステップでは、品質の結果はありません=(
あとがき
表示されているものはすべてAlpha2であり、作業の品質と速度を気にし始めていません。
Alpha3の計画によると、次のリリースでは、品質と速度、およびリファクタリングに注意を払います。 ライブラリの唯一の新しい機能は、入力言語の辞書を作成することです。
アルゴリズム自体とライブラリAPIは、プロジェクトwikiで詳しく説明されています: github.com/b0noI/AIF2/wiki
ライブラリのある場所で、 AIF-CLIというシンプルなコンソールクライアントも更新しました。AIF-CLIは、見つかった技術的な文字とこれらの文字のグループを表示できるようになりました。
私たちのチーム
Kovalevskyi Viacheslav-アルゴリズム開発者、アーキテクチャ設計、チームリーダー(viacheslav@b0noi.com / b0noi )
Ifthikhan Nazeem-アルゴリズム設計者、アーキテクチャ設計、開発者
Sviatoslav Glushchenko-RESTの設計と実装、開発者
Oleg Kozlovskyi QA(統合および品質テスト)、開発者。
Balenko Aleksey(podorozhnick@gmail.com)-ジュニア開発者CLIにtoのサポートを追加
Evgeniy Dolgikh-QAアシスタンス、ジュニア開発者
PS:興味深いNLPプロジェクトがある場合は、お問い合わせください;)
プロジェクトのリンクと詳細
プロジェクト言語:Java 8
ライセンス:MITライセンス
課題トラッカー:github.com/b0noI/AIF2/issues
wiki:github.com/b0noI/AIF2/wiki
ソースコード:github.com/b0noI/AIF2
開発者のメールリスト:aif2-dev@yahoogroups.com(購読:aif2-dev-subscribe@yahoogroups.com)
試験条件
すべてのテストは、次の言語の186冊の書籍で実施されました。
- ポーランド語
- イタリア人
- フランス語
- ドイツ人
- 英語
- ロシア語