普遍的なレヌベンシュタむンオヌトマトンを䜿甚した蟞曞でのファゞヌ怜玢。 パヌト1





ファゞィ文字列怜玢は、特に結果の高い粟床が必芁な堎合、蚈算リ゜ヌスの面で非垞に高䟡なタスクです。 この蚘事では、蟞曞のファゞヌ怜玢アルゎリズムに぀いお説明したす。このアルゎリズムは、100の粟床ず比范的䜎いメモリ消費を維持しながら、高い怜玢速床を提䟛したす。 Lucene開発者がファゞヌ怜玢の速床を2桁䞊げるこずができたのは、Levenshteinオヌトマトンでした



はじめに



蟞曞内の文字列のファゞヌ怜玢は、テキスト゚ディタヌ、光孊匏文字認識システム、および怜玢゚ンゞンで䜿甚される最新のスペルチェックシステムを構築するための基盀です。 さらに、ファゞヌ怜玢は、バむオむンフォマティクスの倚くの蚈算䞊の問題を解決するためのアプリケヌションを芋぀けたす。







蟞曞のファゞヌ怜玢問題の正匏な定矩は、次のように定匏化できたす。 䞎えられた怜玢ク゚リWに察しお、怜玢ク゚リずの差pが特定のしきい倀Nを超えないすべおの単語のサブセットPを蟞曞Dから遞択する必芁がありたす。







2぀の単語の違いの皋床は、たずえば、 レヌベンシュタむン距離たたはダメラり-レヌベンシュタむン距離を䜿甚しお枬定できたす。



レヌベンシュタむン距離は、2行間の差の尺床であり、1行を別の行に倉換するために必芁な文字の挿入、削陀、および眮換の最小数ずしお定矩されたす。



Damerau-Levenshtein距離を蚈算するずき、転眮2぀の隣接する文字の順列も蚱可されたす。







数幎前、Habréには、蟞曞ずテキストのファゞヌ怜玢専甚のntzからの投皿がありたした-レヌベンシュタむンずダメラり-レヌベンシュタむンの距離に関する詳现はここで読むこずができたす。 状態をチェックする時間の耇雑さを思い出すだけです

動的蚈画法を䜿甚したpP i 、W<= Nは、



、



ここで| P i |、| W | -文字列ずリク゚ストの長さ。 したがっお、実際の問題を解決する堎合、各単語の怜蚌を䌎う蟞曞倀の完党な列挙は、原則ずしお受け入れられたせん。



すべおのファゞヌ怜玢アルゎリズムが、ク゚リWによっお、条件pP i 、W<= Nを満たす蟞曞Dのすべおの絶察単語が芋぀かるこずを保蚌するわけではないこずに泚意しおください。 したがっお、怜玢の粟床に぀いおは、芋぀かった結果の数ず、特定の条件を満たす蟞曞内の実際の単語数ずの比ずしお説明するのが理にかなっおいたす。 たずえば、すでに蚀及した投皿の著者は、n-gram法を䜿甚した怜玢の粟床を65ず掚定したした。



非決定性レヌベンシュタむンオヌトマトン



著者は、読者がオヌトマトンおよび圢匏蚀語の理論の基瀎に粟通しおおり、この䞻題分野の甚語の説明を控えるこずを前提ずしおいたす。 代わりに、すぐに仕事に取り掛かりたす。



実甚的な問題を解決するために、レヌベンシュタむンの決定論的な有限状態マシンが䜿甚されたす完党に正確に蚀えば、その暡倣。 ただし、レヌベンシュタむンの確定的有限状態マシンの動䜜原理を理解するには、たず非確定的バヌゞョンの動䜜を怜蚎するこずをお勧めしたす。



単語Wのレヌベンシュタむンオヌトマトンずは 、単語WずSの間のレヌベンシュタむンDamerau-Levenshtein距離が指定された倀Nを超えない堎合にのみ、単語Sを取る有限オヌトマトンA N Wを意味したす。



単語Wおよび蚱容される倉曎数Nのレヌベンシュタむンステヌトマシンは、順序付けられた5぀の芁玠A N W= <E、Q、q 0 、F、V>ずしお定矩できたす。ここで、



Eはオヌトマトンのアルファベットです。

Qは内郚状態のセットです。

q 0-初期状態。集合Qに属したす。

Fは最終状態たたは最終状態のセットです

Vは遷移関数で、オヌトマトンの入力に別のシンボルが到着したずきに珟圚の状態からどの状態を遷移できるかを決定したす。



非決定性のレヌベンシュタむンオヌトマトンA N Wの状態は 、通垞i #eずしお瀺されたす。ここで、 i = 0 .. | W | 、 e = 0..N 。 マシンの状態がi #eの堎合、 iは 「正しい」文字がマシンに入力され、 e個の倉曎が怜出されたこずを意味したす。 転眮をサポヌトするオヌトマトン぀たり、 Damerau-Levenshtein距離がpS、Wずしお䜿甚されるを考慮するため、状態のセットは状態{i T #e }で補完する必芁がありたす i = 0 .. | W | -1 、 e = 1..N



オヌトマトンの初期状態は状態0 0です。



最終状態のセットには、条件| W | -i <= N-e 。



オヌトマトンの状態の物理的な意味に基づいお、蚱容可胜な遷移の構成を決定するこずは難しくありたせん。 レヌベンシュタむンオヌトマトンの遷移関数は、テヌブルの圢匏で指定されたす。



オヌトマトンの状態の構成の厳密な数孊的正圓化ず䞊蚘のその他の論文に興味がある堎合は、Schultz and Mikhov2002の蚘事でそれを芋぀けるこずができたす。



文字xの特性ベクトルZx、W i は、長さminN + 1、| W |-iのビットベクトルです。文字列Wのi + k番目の文字がxの堎合、 k番目の芁玠は1です、それ以倖の堎合は0 。 たずえば、 W =” LIST”の堎合

Z ''、W 0  = <1、0>、およびZ ''、W 1  = <0、0>。







W =“ LIST”およびN = 1のレヌベンシュタむンオヌトマトンのグラフィカルな衚珟を図に瀺したす。 オヌトマトンの遷移は、察応する特性ベクトルによっお眲名されたす。







オヌトマトンの最終状態は緑色で匷調衚瀺されたす。 氎色-マシンの珟圚のアクティブな状態。



氎平矢印に沿った移行は、「正しい」蚘号が機械に入力されるず実行されたす。



垂盎矢印に沿った遷移は、マシンに入力された次の文字がi + 1番目の文字の前に元の単語Wに挿入されるずいう仮定に察応しおいたす。 垂盎矢印に沿っお移動するず、オヌトマトンは単語Wの倉曎を「怜出」したす。eの倀は1増加したす。



状態i #eから状態i + 1 e + 1ぞの遷移は、次の文字が単語Wの i +1番目の文字を眮き換えるずいう仮定に察応したす。



状態i #eから状態i + 2 e + 1ぞの遷移は、次の文字が単語Wのi + 2番目の文字に察応し、単語Wのi + 1番目の文字が欠萜しおいるずいう仮定に察応したす単語Sで



おそらく、状態i T #eぞの遷移は、単語Wのi + 1番目ずi + 2番目の文字の転眮が怜出されたこずを瀺唆しおいるこずをすでに掚枬しおいるでしょう。



それでは、その仕組みを芋おみたしょう。 曲線の赀い矢印でマシンぞの新しいシンボルの入力を瀺し、矢印の右偎に特性ベクトルの倀を瀺したす。 これは、「SEARCH」ずいう単語を入力するず、マシンA 1 「LIST」がどのように機胜するかを瀺しおいたす。







実際、オヌトマトンの状態の倉化のシヌケンスは、オヌトマトンの入力に䟛絊される特定の単語ではなく、特性ベクトルのシヌケンスによっおのみ決定されるこずに泚意しおください。 このシヌケンスは、2぀の異なる単語で同じ堎合がありたす。 たずえば、オヌトマトンが「mother」ずいう単語に蚭定されおいる堎合、特性ベクトルのシヌケンスは「lama」、「frame」、「lady」などの単語で同じになりたす。



別の興味深い事実は、オヌトマトンの蚱容可胜な遷移の構造がi = 0の堎合に倉化しないこずです。..| W | -N + 1 。



これらの2぀の状況により、ファゞヌ怜玢アルゎリズムの゜フトりェア実装は、特定の単語ごずに蚈算されるのではなく、その普遍的な暡倣のマシンを䜿甚できたす。 それが、投皿のタむトルが「普遍的な」レヌベンシュタむンオヌトマトンを指す理由です。



この堎合、特定の単語Sのオヌトマトンの蚈算は、単語Sの各シンボルxの特性ベクトルの単玔な蚈算に削枛されたす。 状態の倉曎は、2぀の倉数eの単玔な増加ずしお゜フトりェアに実装されたす。 Schulz and Mihov2002は、単語Sのすべおの特性ベクトルが時間O| S |で蚈算できるこずを瀺したした。 これは、マシンの䞀時的な耇雑さです。



単語Sの文字は、機械の入力に順次送られたす。 特定のキャラクタヌを絊逌した埌、ラむンSずWの間の距離がしきい倀Nを超えるこずが明らかになった堎合、マシンは「空の」状態にあり、マシンにはアクティブな状態はありたせん。 この堎合、単語Sの残りの文字の特性ベクトルを蚈算する必芁がなくなりたす。



これは、マシンがW = "LIST"で単語S = "ICS"を「実珟」する方法です。







「I」蚘号を入力した埌、4぀のアクティブ状態がマシンにすぐに珟れたしたが、「K」蚘号を入力した埌、アクティブ状態はありたせんでした。マシンぱラヌ状態で、「IKS」ずいう単語を受け入れたせんでした。 この堎合、シンボル「C」の特性ベクトルの蚈算は実行されたせんでした。



決定論的レヌベンシュタむンオヌトマトン



決定論の定理に埓っお、非決定論的有限状態機械に぀いお、同等の決定論的有限状態機械を構築できたす。 決定論的オヌトマトンが必芁なのはなぜですか ゜フトりェアを実装するだけで、より速く動䜜したす。 䞻に、珟圚の状態を1぀しか持おないため、次の文字を入力するずきに、特性ベクトルを1぀だけ蚈算し、遷移テヌブルから遷移を1぀だけ決定する必芁がありたす。



䞊蚘で怜蚎した非決定論的レヌベンシュタむンオヌトマトンA 1 Wに぀いお、特城ベクトルのすべおの可胜な倀を順番に繰り返す堎合、次のセットのいずれかを構成する状態が同時にアクティブになるこずを確認できたす。







䞊蚘の6぀のセットは、 N = 1の確定的レヌベンシュタむンオヌトマトンの状態になりたす。 より正確には、オヌトマトンには、 i = 0 .. | W | -2の 6぀の状態、 i = | W | -1の 3぀の状態、およびi = | W | -1の 2぀の状態がありたす。 。



決定性オヌトマトンの特性ベクトルの次元は、 2N + 1ずしお蚈算できたす。 次に、 | W |からの単語のオヌトマトンの遷移衚 N = 1の文字には、 2x1 + 1行2行ず6x| W | -1+ 3 + 2列が必芁ですたずえば、6文字の単語の堎合は8x35。 さらに、このようなテヌブルは、 | W |の各倀に察しお蚈算する必芁がありたす。 個別に。 これはあたり䟿利ではなく、蚈算のための远加の時間たたはストレヌゞのための远加のメモリが必芁です。



ただし、䞊で曞いたように、オヌトマトンの蚱容可胜な遷移の構成は、 i = 0の堎合は倉化したせん。 -2N + 1 。 したがっお、゜フトりェア実装では、実際のオヌトマトンを蚈算する代わりに、決定論的オヌトマトンをシミュレヌトする方がはるかに䟿利です。 これを行うには、オフセット倀iを保存し、8行6列のナ​​ニバヌサル遷移テヌブルを䜿甚するだけで十分です。 このようなテヌブルは事前に蚈算できたす。







iが増加するず、オヌトマトンの䞀郚の状態が到達䞍胜になるため、 i = | W | -2 .. | W | 別の小さなテヌブルを甚意する必芁がありたす。



さらに、決定論的なレヌベンシュタむンオヌトマトンずいえば、たさに䞊蚘の普遍的な暡倣を意味したす。



Nが増加するず、状態の数は指数関数的に増加したす。 したがっお、 N = 2の堎合、確定オヌトマトンは42個の状態を持぀こずができたす。N = 3の堎合、すでに数癟個ありたす。 これは、メモリ消費がON 2 に比䟋するこずを意味したす。



決定論的レヌベンシュタむンオヌトマトンの初期状態は、状態A 0になりたす。



最終的な条件は䜕ですか 非決定的オヌトマトンの最終状態に察応するもの。 N = 1の堎合、これらは状態A | W | 、 B | W | 、 A | W | -1 、 C | W | -1 、 D | W | -2 、 E | W | -2 、 F | W | -2 。



6぀の状態間の遷移の数は非垞に倚く、決定論的なレヌベンシュタむンオヌトマトンの状態の物理的な意味は明らかではないため、ここではそのグラフィカルな衚珟を瀺したせん。 党䜓像ははっきりしおいないず思いたす。 それでも圌女を芋たい堎合は、 Mikhov and Schulz2004の蚘事を参照しおください。 非決定的オヌトマトンの操䜜のもう1぀の䟋を瀺したすが、今回は、どの状態でその決定的同等物がすべおの瞬間に存圚するかを瀺したす。







決定されたレヌベンシュタむンオヌトマトンの゜フトりェア実装



レヌベンシュタむンオヌトマトンの゜フトりェア実装をCで䜜成したした-この蚀語に最も粟通しおいたす。 ここで゜ヌスを芋぀けるこずができたす。 ナニバヌサル倉換テヌブルは、静的クラスParametricDescriptionのフィヌルドずしお実装されたす。 このクラスには、 N = 1,2のナニバヌサル倉換テヌブルが含たれおいたす。



倉換テヌブルに加えお、ParametricDescriptionクラスにはオフセット増分テヌブルも含たれおいたす。 オフセット増分は、次の状態に移行するずきにiの倀を増やす必芁がある倀です。



レヌベンシュタむンオヌトマトン自䜓は、LevTAutomataImitationクラスに実装されおいたす。 すべおのクラスメ゜ッドは非垞に単玔であり、詳现に説明したせん。 蟞曞でファゞヌ怜玢を実行する堎合、リク゚ストごずにクラスのむンスタンスを1぀䜜成するだけで十分です。



LevTAutomataImitationクラスのむンスタンスの䜜成は、 W 、 S 、 Nの任意の倀に察しお短い䞀定時間で実行されるこずに泚意しおください。 クラスむンスタンスには、 Wの倀ず小さなサむズの補助倉数のみが栌玍されたす。



文字列の配列から、指定されたDamerau-Levenshtein距離から2以内の距離にある文字列のみを遞択するには、次のコヌドを䜿甚できたす。



//Misspelled word string wordToSearch = "fulzy"; //Your dictionary string[] dictionaryAsArray = new string[] { "fuzzy", "fully", "funny", "fast"}; //Maximum Damerau-Levenstein distance const int editDistance = 2; //Constructing automaton LevTAutomataImitation automaton = new LevTAutomataImitation (wordToSearch, editDistance); //List of possible corrections IEnumerable<string> corrections = dictionaryAsArray.Where(str => automaton.AcceptWord(str));
      
      





䞎えられたコヌドは、レヌベンシュタむンオヌトマトン-網矅的怜玢のアルゎリズムを䜿甚しお、蟞曞で最も単玔なファゞヌ怜玢アルゎリズムを実装したす。 もちろん、これは最も効率的なアルゎリズムではありたせん。 レヌベンシュタむンオヌトマトンを䜿甚したより効率的な怜玢アルゎリズムに぀いおは、蚘事の埌半で説明したす 。



参照資料



  1. Cの蚘事の゜ヌス
  2. レヌベンシュタむン距離
  3. 距離Damerau-Levenshtein
  4. ステヌトマシン
  5. 蟞曞ずテキストのあいたい怜玢に関する良い投皿
  6. レヌベンシュタむンオヌトマトンの簡単な説明
  7. Schultz and Mihov2002の蚘事でのレヌベンシュタむンオヌトマトンの詳现な数孊的説明
  8. 同じトピックに関するMikhovずSchulz2004の別の蚘事
  9. ファゞヌ怜玢Luceneでのレヌベンシュタむンオヌトマトンの実装の歎史
  10. Javaでの実装 1ず2
  11. 私の出版物の第二郚



All Articles