ファジートークンのシーケンス内の文法を認識する


13

主にアイテムのリストを含むテキストドキュメントがあります。

各アイテムは、異なるタイプの複数のトークンのグループです:FirstName、LastName、BirthDate、PhoneNumber、City、Occupationなど。トークンは単語のグループです。

アイテムは複数の行に配置できます。

ドキュメントのアイテムはほぼ同じトークン構文を持っていますが、必ずしも完全に同じである必要はありません。

それらは、アイテム間だけでなくアイテム間でも、より多く/より少ないトークンである場合があります。

FirstName LastName BirthDate PhoneNumber
Occupation City
FirstName LastName BirthDate PhoneNumber PhoneNumber
Occupation City
FirstName LastName BirthDate PhoneNumber
Occupation UnrecognizedToken
FirstName LastName PhoneNumber
Occupation City
FirstName LastName BirthDate PhoneNumber
City Occupation

目標は、使用されている文法を識別することです。例えば

Occupation City

最後に、すべてのアイテムを特定します。完全に一致するとは限りません。

短く読みやすくするために、代わりにいくつかのエイリアスA、B、C、D、...を使用して、これらのトークンタイプを指定しましょう。

例えば

A B C
D F
A B C
D E F
F
A B C
D E E F
A C B
D E F
A B D C
D E F
A B C
D E F G

ここで、アイテムの構文が

A B C
D E F

なぜなら、それが最良のシーケンスに一致するからです。

構文(トークンのタイプと順序)は、ドキュメントごとに大きく異なる場合があります。たとえば、別のドキュメントにそのリストがある場合があります

D A
D A
D
D A
B
D A

目標は、事前の知識なしにその構文を把握することです。

これ以降、新しい行もトークンと見なされます。ドキュメントは、トークンの1次元シーケンスとして表すことができます。


ここで繰り返されるシーケンスA B C Bは、競合が最も少ないトークンであるためです。

少し複雑にしましょう。これ以降、各トークンには特定のタイプがありません。現実の世界では、トークンのタイプが常に100%確実であるとは限りません。代わりに、特定のタイプを持つ確率を与えます。

  A 0.2    A 0.0    A 0.1
  B 0.5    B 0.5    B 0.9     etc.
  C 0.0    C 0.0    C 0.0
  D 0.3    D 0.5    D 0.0

これは私が達成したいことの抽象的なグラフィックです。

考慮されるソリューションA:トークンのパッチの畳み込み

この解決策は、トークンの複数のパッチを使用して畳み込みを適用し、競合が最も少ないものを使用することです。

ここで難しいのは、観察シーケンスに沿ってロールする潜在的なパッチを見つけることです。このアイデアはほとんどありませんが、満足できるものはありません。

トークン間の遷移のマルコフモデルを作成する

欠点:マルコフモデルにはメモリがないため、遷移の順序が失われます。たとえば、繰り返しシーケンスがの場合、A B C B DC-> Bの前にA-> Bが発生するという事実を失います。

サフィックスツリーを構築する

これは、DNA / RNAの核酸塩基(GTAC)を分析するために、生物学で広く使用されているようです。欠点:サフィックスツリーは、正確なトークン(文字など)の完全一致に適しています。正確なシーケンスも正確なトークンもありません。

強引な

あらゆるサイズのあらゆる組み合わせを試してください。実際に動作する可能性がありますが、ある程度(長い(長い))時間がかかります。

Bとみなされる解決策:接尾辞のレーベンシュタイン距離の表を作成する

直観は、すべての接尾辞からすべての接尾辞までの距離を計算するときに、距離の局所的な最小値が存在する可能性があるということです。

距離関数はレーベンシュタイン距離ですが、トークンごとに固定タイプを持つのではなく、特定のタイプである確率を考慮するために、将来的にカスタマイズすることができます。

そのデモンストレーションをシンプルにするために、固定タイプのトークンを使用し、古典的なレーベンシュタインを使用してトークン間の距離を計算します。

例えば、入力シーケンスを見てみましょうABCGDEFGH ABCDEFGH ABCDNEFGH

すべてのサフィックスを使用して、すべてのサフィックスの距離を計算します(サイズが等しくなるようにトリミングされます)。

for i = 0 to sequence.lengh
  for j = i to sequence.lengh
    # Create the suffixes
    suffixA = sequence.substr(i)
    suffixB = sequence.substr(j)
    # Make the suffixes the same size
    chunkLen = Math.min(suffixA.length, suffixB.length)
    suffixA = suffixA.substr(0, chunkLen)
    suffixB = suffixB.substr(0, chunkLen)
    # Compute the distance
    distance[i][j] = LevenshteinDistance(suffixA, suffixB)

たとえば、次の結果が得られます(白は距離が小さく、黒は距離が大きい)。

これで、サフィックス自体と比較したサフィックスの距離がゼロになることは明らかです。ただし、接尾辞(完全にまたは部分的に)自体に関心があるわけではないため、その部分を切り取ります。

接尾辞は同じサイズに切り取られるため、長い文字列を比較すると、小さい文字列を比較するよりも常に大きな距離が得られます。

右から始まる滑らかなペナルティ(+ P)で左に線形にフェードアウトすることで、それを補償する必要があります。

すべての場合に適合するペナルティ関数を選択する方法はまだわかりません。

ここでは、右端に(+ P = 6)ペナルティを適用し、左に0にフェードアウトします。

これで、2本の明確な対角線がはっきりと見えます。そのシーケンスには3つのアイテム(Item1、Item2、Item3)があります。最も長い線は、Item1対Item2とItem2対Item3の間の一致を表します。2番目に長いものは、Item1とItem3の間の一致を表します。

今、私はそのデータを悪用する最良の方法について確信が持てません。最高の対角線を取るのと同じくらい簡単ですか?

それがあると仮定しましょう。

各トークンから始まる対角線の平均値を計算してみましょう。結果は次の図(マトリックスの下のベクトル)で確認できます。

各アイテムの先頭に一致する3つのローカルミニマムがあります。素晴らしく見える!

次に、シーケンスにいくつかの不完全性を追加します。 ABCGDEFGH ABCDEFGH TROLL ABCDEFGH

明らかに、対角線平均のベクトルが台無しになり、それを悪用できなくなりました...

私の推測では、これはカスタマイズされた距離関数(Levenshteinの代わり)で解決でき、ブロック全体の挿入はそれほどペナルティを受けないかもしれません。それは私が確信していないことです。

結論

探索された畳み込みベースのソリューションはどれも、私たちの問題に当てはまらないようです。

レーベンシュタイン距離ベースのソリューションは、特に確率ベースのタイプのトークンと互換性があるため、有望なようです。しかし、その結果をどのように活用するかについてはまだわかりません。

関連分野での経験があり、いくつかの良いヒントがあれば教えてください。事前にどうもありがとうございました。


何らかの自己回帰モデルを使用することを検討しましたか? en.wikipedia.org/wiki/Autoregressive_model
jcrudy 16

あなたが何を望んでいるのか、なぜそうなのか、私にはよくわかりません。しかし、圧縮アルゴリズムが何らかの形で役立つ可能性があります。
ジェレヌク16

1
レベンシュタイン距離に基づいて、今日行った実験を追加しました。有望に見えます。また、導入部を少し編集したので、より明確になります。ご提案ありがとうございます、私は見ていきます。
OoDeLally

@Gerenukこんな素晴らしいコメント!
uhbif19

回答:


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.