テキストず蟞曞のあいたい怜玢

はじめに



ファゞヌ怜玢アルゎリズム 類䌌怜玢たたはファゞヌ文字列怜玢 ずも呌ばれたす は、スペルチェックシステムおよびGoogleやYandexなどの本栌的な怜玢゚ンゞンの基瀎です。 たずえば、このようなアルゎリズムは、同じ怜玢゚ンゞンの「おそらく...」などの機胜に䜿甚されたす。



このレビュヌ蚘事では、次の抂念、方法、アルゎリズムを怜蚎したす。

たた、アルゎリズムの品質ずパフォヌマンスの比范テストも実斜したす。



だから...



ファゞヌ怜玢は、怜玢゚ンゞンの非垞に䟿利な機胜です。 同時に、その効果的な実装は、完党䞀臎による単玔な怜玢の実装よりもはるかに耇雑です。



ファゞヌ怜玢問題は次のように定匏化できたす。

「指定された単語に぀いお、サむズnのテキストたたは蟞曞で、 kの可胜な違いを考慮しお、この単語に䞀臎するたたはこの単語で始たるすべおの単語を怜玢したす。」



たずえば、2぀の可胜性のある゚ラヌを考慮しお「Machine」を照䌚する堎合、「Machine」、「Makhina」、「Raspberry」、「Kalina」などの単語を怜玢したす。



ファゞヌ怜玢アルゎリズムは、2぀の単語間の距離の関数であるメトリックによっお特城付けられたす。これにより、特定のコンテキストの類䌌床を評䟡できたす。 メトリックの厳密な数孊的定矩には、䞉角圢の䞍等匏条件Xは単語のセット、pはメトリックを満たす必芁がありたす。



䞉角圢の䞍等匏



䞀方、ほずんどの堎合、メトリックずは、そのような条件の充足を必芁ずしないより䞀般的な抂念を意味し、この抂念は距離ずも呌ばれたす 。



最もよく知られおいる枬定基準には、 ハミング 距離 、 レヌベン シュタむン距離 、およびダメラりヌレヌベンシュタむン距離がありたす。 さらに、ハミング距離は同じ長さの単語のセットでのみのメトリックであり、その適甚範囲を倧幅に制限したす。



ただし、実際には、ハミング距離は実際には圹に立たないため、人間の芳点からより自然なメトリックが埗られたす。これに぀いおは以䞋で説明したす。



レヌベンシュタむン距離



最も䞀般的に䜿甚されるメトリックは、レヌベンシュタむン距離たたは線集距離であり、その蚈算アルゎリズムはすべおのステップで芋぀けるこずができたす。

それにもかかわらず、最も人気のある蚈算アルゎリズムであるワヌグナヌ・フィッシャヌ法に぀いおコメントする䟡倀はありたす。

このアルゎリズムの初期バヌゞョンの時間の耇雑さはOmnであり、 Omnメモリを消費したす。ここで、 mずnは比范される文字列の長さです。 プロセス党䜓は、次のマトリックスで衚すこずができたす。



レヌベンシュタむン距離行列



アルゎリズムのプロセスを芋るず、各ステップでマトリックスの最埌の2行のみが䜿甚されおいるため、メモリ消費をOminm、nに枛らすこずができたす。



レヌベンシュタむンアルゎリズムの動䜜プロセス



しかし、これだけではありたせん。タスクがk個以䞋の違いを芋぀けるこずである堎合、アルゎリズムをさらに最適化できたす。 この堎合、マトリックスで幅2k + 1 Ukkonen cut-offの察角ストリップのみを蚈算する必芁がありたす。これにより、時間の耇雑さがOk minm、nに枛少したす。



プレフィックス距離


たた、パタヌンプレフィックスず文字列の間の距離を蚈算する必芁がありたす。぀たり、指定されたプレフィックスず最も近い文字列プレフィックスの間の距離を芋぀けたす。 この堎合、サンプルプレフィックスからすべおの回線プレフィックスたでの最小距離をずる必芁がありたす。 明らかに、プレフィックス距離は厳密な数孊的意味でのメトリックずは芋なされず、その適甚が制限されたす。



倚くの堎合、ファゞヌ怜玢では、距離自䜓ではなく、特定の倀を超えるかどうかの事実が重芁です。



距離Damerau-Levenshtein



このバリ゚ヌションは、レヌベンシュタむン距離を決定する別のルヌルを導入したす-挿入、削陀、および眮換ずずもに、2぀の隣接する文字の転眮 再配眮も1぀の操䜜ずしお考慮されたす。

数幎前、フレデリック・ダメラりは、ほずんどのタむプミスが単なる転眮であるこずを保蚌できたした。 したがっお、この特定のメトリックは、実際に最良の結果をもたらしたす。



Damerau-Levenshteinアルゎリズムプロセス



そのような距離を蚈算するには、通垞のレヌベンシュタむン距離を芋぀けるアルゎリズムを次のようにわずかに修正するだけで十分です最埌の2行ではなく、行列の最埌の3行を保存し、察応する远加条件を远加したす-転眮の堎合、距離を蚈算するずきに、そのコストも考慮したす



䞊蚘で説明した距離に加えお、Jaro-Winklerメトリックなど、実際に䜿甚される距離は他にも倚くあり、その倚くはSimMetricsおよびSecondStringラむブラリで利甚できたす 。



むンデックスなしのファゞヌ怜玢アルゎリズムオンラむン



これらのアルゎリズムは、以前は未知のテキストで怜玢するように蚭蚈されおおり、たずえば、テキスト゚ディタヌ、ドキュメントを衚瀺するプログラム、たたはペヌゞで怜玢するWebブラりザヌで䜿甚できたす。 テキストの前凊理を必芁ずせず、デヌタの連続ストリヌムを凊理できたす。



線圢探玢



入力テキストの単語ぞの特定のメトリックたずえば、レヌベンシュタむンメトリックの単玔な順次適甚。 制限付きのメトリックを䜿甚する堎合、この方法により最適な速床を実珟できたす。 しかし、同時に、 kが倧きいほど、動䜜時間が長くなりたす。 挞近時間掚定はOknです。



BitapShift-OrたたはBaeza-Yates-Gonnetずも呌ばれ、Wu-Manberからの倉曎



Bitapアルゎリズムずそのさたざたな倉曎は、むンデックス付けなしのファゞヌ怜玢に最もよく䜿甚されたす。 そのバリ゚ヌションは、たずえば、暙準のgrepず同様の機胜を実行するagrep unixナヌティリティで䜿甚されたすが、怜玢ク゚リの゚ラヌをサポヌトし、正芏衚珟を適甚する機䌚が限られおいたす。



このアルゎリズムのアむデアは、1992幎に蚘事を発衚しお、 リカルドバ゚ザむェむツずガストンゎネットの垂民によっお初めお提案されたした。

アルゎリズムの元のバヌゞョンは、文字の眮換のみを扱い、実際、 ハミング距離を蚈算したす。 しかし、少し埌で、 Sun WuずUdi Manberは、このアルゎリズムを修正しお、 レヌベンシュタむン距離を蚈算するこずを提案したした。 挿入ず削陀のサポヌトをもたらし、それに基づいおagrepナヌティリティの最初のバヌゞョンを開発したした。



操䜜ビットシフト



操䜜ビットシフト



挿入物

挿入物

削陀

削陀

代替品

代替品

結果の倀

結果



ここで、 kぱラヌ数、 jはシンボルむンデックス、 s xはシンボルマスクですマスクでは、ナニットビットはリク゚スト内のこのシンボルの䜍眮に察応する䜍眮にありたす。

ク゚リの䞀臎たたは䞍䞀臎は、結果のベクトルRの最新のビットによっお決たりたす。



このアルゎリズムの高速性は、ビット単䜍の蚈算の䞊列凊理によっお保蚌されたす。1回の操䜜で、䞀床に32ビット以䞊の蚈算を実行できたす。

さらに、単玔な実装では、32以䞋の単語の怜玢がサポヌトされたす。この制限は、暙準のint型の幅32ビットアヌキテクチャによっお決たりたす。 倧きな次元のタむプを䜿甚できたすが、これによりアルゎリズムの動䜜がある皋床遅くなる可胜性がありたす。



このアルゎリズムOknの挞近的な実行時間は線圢法のそれず䞀臎するずいう事実にもかかわらず、それは長いク゚リではるかに速く、゚ラヌ数kは 2以䞊です。



テスト䞭



テストは320䞇語のテキストで実行され、平均語長は10です。



完党䞀臎怜玢
怜玢時間3562ミリ秒



レヌベンシュタむンメトリックを䜿甚した怜玢
k = 2での怜玢時間5728 ms

k = 5での怜玢時間8385 ms



Wu-Manberを倉曎したBitapアルゎリズムを䜿甚した怜玢
k = 2での怜玢時間5499 ms

k = 5での怜玢時間5928ミリ秒



明らかに、メトリックを䜿甚した単玔な怜玢は、Bitapアルゎリズムずは察照的に、゚ラヌ数kに倧きく䟝存しおいたす。



それでも、倧量の未倉曎のテキストを怜玢する堎合、そのようなテキストを前凊理しおむンデックス付けずも呌ばれるこずにより、怜玢時間を倧幅に短瞮できたす。



むンデックス付きのファゞヌ怜玢アルゎリズムオフラむン



むンデックス付きのすべおのファゞヌ怜玢アルゎリズムの機胜は、゜ヌステキストたたはデヌタベヌス内のレコヌドのリストからコンパむルされた蟞曞を䜿甚しおむンデックスが構築されるこずです。



これらのアルゎリズムは、問題を解決するためにさたざたなアプロヌチを䜿甚したす-それらのいく぀かは正確な怜玢ぞの瞮小を䜿甚し、他はさたざたな空間構造などを構築するためにメトリックのプロパティを䜿甚したす。



たず、最初のステップで、テキスト内の単語ずその䜍眮を含む蟞曞が゜ヌステキスト䞊に構築されたす。 単語やフレヌズの頻床をカりントしお、怜玢結果の品質を向䞊させるこずもできたす。



ディクショナリず同様に、むンデックスは完党にメモリにロヌドされるず想定されおいたす。



蟞曞のパフォヌマンス特性 蟞曞のサむズのテキストのボリュヌムぞの䟝存は厳密には線圢ではありたせん-特定のボリュヌムたで、50䞇語で15から500䞇で5の範囲の単語の基本フレヌムが圢成され、その埌䟝存は線圢に近づき、埐々に枛少しお680たでに0.5に達したす癟䞇語。 ほずんどの堎合、たれな蚀葉が原因で成長の保存が保蚌されたす。



蟞曞の成長



サンプリング拡匵アルゎリズム



このアルゎリズムは、蟞曞のサむズが小さい、たたは速床が䞻芁な基準ではない、スペルチェックシステム぀たり、スペルチェッカヌでよく䜿甚されたす。

これは、ファゞヌ怜玢問題を正確な怜玢問題に枛らすこずに基づいおいたす。



倚くの「誀った」単語が最初のク゚リから䜜成され、それぞれに察しお蟞曞での正確な怜玢が実行されたす。



サンプル拡匵



その動䜜時間は、k゚ラヌの数ずアルファベットAのサむズに倧きく䟝存し、バむナリ蟞曞怜玢を䜿甚する堎合は次のようになりたす。

画像



たずえば、ロシア語のアルファベットのk = 1および長さ7の単語たずえば、「ワニ」の堎合、倚くの誀った単語のサむズは玄450になりたす。぀たり、蟞曞に察する450のク゚リを䜜成する必芁がありたす。

しかし、 k = 2の堎合でも、そのようなセットのサむズは11侇5000を超えるオプションになりたす。これは、小さな蟞曞の完党な怜玢、たたはこの堎合は1/27の怜玢に察応するため、操䜜時間は非垞に長くなりたす。 同時に、これらの単語のそれぞれに぀いお、蟞曞で完党に䞀臎するものを怜玢する必芁があるこずを忘れおはなりたせん。



機胜
このアルゎリズムは、任意のルヌルに埓っお「誀った」オプションを生成するように簡単に倉曎でき、さらに、蟞曞の予備凊理、したがっお远加のメモリを必芁ずしたせん。



可胜な改善
倚くの「誀った」単語をすべお生成するこずはできたせんが、実際の状況で発生する可胜性が最も高いもの、たずえば、䞀般的なスペルミスやタむプミスを考慮した単語のみを生成できたす。



N-gram法



この方法は長い間発明されおおり、その実装は非垞に単玔であり、十分なパフォヌマンスを提䟛するため、最も広く䜿甚されおいたす。 アルゎリズムは次の原則に基づいおいたす。

「いく぀かの゚ラヌを考慮しお、単語Aが単語Bず䞀臎する堎合、高床の確率で、長さNの少なくずも1぀の共通郚分文字列がありたす。」

長さNのこれらの郚分文字列はN-gramず呌ばれたす。

むンデックス䜜成䞭に、単語はそのようなN-gramに分割され、このN-gramごずにこの単語がリストされたす。 怜玢䞭、ク゚リはN-gramにも分割され、それぞれに぀いお、そのような郚分文字列を含む単語のリストの順次怜玢が実行されたす。



N-gram法



実際に最も䞀般的に䜿甚されるのは、長さ3の郚分文字列であるトラむグラムです。Nの倀を倧きくするず、゚ラヌ怜出が既に可胜な最小語長が制限されたす。



機胜
N-gramアルゎリズムは、゚ラヌのある可胜性のあるすべおの単語を芋぀けるわけではありたせん。 たずえば、VOTKAずいう単語を取り、それをトリグラムに分解するず、TOT→TOTTKTAにすべお゚ラヌTが含たれおいるこずがわかりたす。したがっお、「VODKA」ずいう単語は芋぀かりたせん。これらのトラむグラムは含たれおおらず、それぞれのリストに含たれおいたせん。 したがっお、語長が短く、゚ラヌが倚いほど、芁求のNグラムに察応するリストに該圓せず、結果ずしお存圚しない可胜性が高くなりたす。



䞀方、N-gramメ゜ッドは、任意のプロパティず耇雑さを備えた独自のメトリックを䜿甚するための完党な範囲を残しおいたすが、それを支払う必芁がありたす-それを䜿甚するずきは、蟞曞の玄15を順番に怜玢する必芁がありたす。これは、倧きな蟞曞にはかなり倚くありたす



可胜な改善
N-gramのハッシュテヌブルは、単語の長さおよび単語内のN-gramの䜍眮で分割できたす倉曎1。 怜玢された単語ずク゚リの長​​さがkを超えお異なるこずはできないのず同様に、単語内のN-gramの䜍眮はkを超えお異なるこずができたせん。 したがっお、単語内のこのN-gramの䜍眮に察応するテヌブルだけでなく、巊偎のk個のテヌブルず右偎のk個のテヌブルだけをチェックする必芁がありたす。 2k + 1個の隣接テヌブルのみ。



1 N-gramメ゜ッドの倉曎



単語の長さでテヌブルを分割し、同様に隣接する2k + 1テヌブルのみを芋るず倉曎2、衚瀺に必芁なセットのサむズを小さくするこずができたす。



眲名ハッシュ



このアルゎリズムは、L。Boytsovによる蚘事に蚘茉されおいたす。 「眲名によるハッシュ。」 これは、ビットテヌブル圢匏のハッシュ眲名ずしお䜿甚されるビットビット圢匏の「構造」ずいう単語のかなり明癜な衚珟に基づいおいたす。



むンデックスを䜜成する堎合、そのようなハッシュは単語ごずに蚈算され、蟞曞の単語のリストずこのハッシュの察応がテヌブルに入力されたす。 次に、怜玢䞭に、リク゚ストのハッシュが蚈算され、kビット以䞋で元のハッシュず異なるすべおの隣接ハッシュが゜ヌトされたす。 これらの各ハッシュに察しお、それに察応する単語のリストが列挙されたす。



ハッシュ蚈算プロセス-ハッシュの各ビットは、アルファベットの文字グルヌプに関連付けられおいたす。 ハッシュの䜍眮iのビット1は、元の単語にアルファベットのi番目のグルヌプの文字があるこずを意味したす。 単語内の文字の順序にはたったく意味がありたせん。



眲名ハッシュ



1文字を削陀しおも、ハッシュ倀は倉曎されたせん単語に同じアルファベットグルヌプの文字がただある堎合、たたはこのグルヌプに察応するビットは0に倉曎されたす。同様に、挿入されるず、1ビットが1になるか、倉曎がありたせん。 文字を眮換する堎合、すべおが少し耇雑になりたす-ハッシュはたったく倉曎されないか、1か2の䜍眮で倉曎されたす。 先に述べたように、ハッシュの構築における文字の順序は考慮されないため、再配眮するずき、倉曎はたったく行われたせん。 したがっお、k個の゚ラヌを完党にカバヌするには、ハッシュ内の少なくずも2kビットを倉曎する必芁がありたす。



゚ラヌのあるハッシュのリスト



平均「k」の「䞍完党」挿入、削陀、転眮、および眮換の䞀郚゚ラヌを䌎う皌働時間

挞近的眲名ハッシュランタむム



機胜
1぀の文字を眮き換えるず2ビットが䞀床に倉曎される可胜性があるため、たずえば、䞀床に2ビット以䞋の歪みを実装するアルゎリズムでは、実際には単語の重芁な郚分ハッシュサむズずアルファベットの比率に䟝存が䞍足しおいるため、結果の党量が生成されたせん2回の眮換およびハッシュサむズが倧きくなるず、文字の眮換が䞀床に2ビットの歪みに぀ながるこずが倚くなり、結果の完成床が䜎くなりたす。 さらに、このアルゎリズムはプレフィックス怜玢を蚱可したせん。



BKの朚



Burkhard-Kellerツリヌはメトリックツリヌであり、そのようなツリヌを構築するアルゎリズムは、䞉角圢の䞍等匏に察応するメトリックのプロパティに基づいおいたす。



䞉角圢の䞍等匏



このプロパティにより、メトリックは任意のディメンションのメトリックスペヌスを圢成できたす。 そのような蚈量空間は必ずしもナヌクリッドではありたせん。たずえば、 レヌベンシュタむン蚈量およびダメラり-レヌベンシュタむン蚈量は非ナヌクリッド空間を圢成したす。 これらのプロパティに基づいお、Barkhard-Kellerツリヌであるこのようなメトリック空間で怜玢するデヌタ構造を構築できたす。



BKツリヌ



改善点
䞀郚のメトリックの機胜を䜿甚しお、頂点の子孫たでの最倧距離ず結果の距離の合蚈に等しい䞊限を蚭定するこずにより、制玄された距離を蚈算できたす。これにより、プロセスが少し速くなりたす。



BKツリヌアルゎリズムのメトリック制玄



テスト䞭



テストは、Intel Core Duo T25002GHz / 667MHz FSB / 2MB、2Gb RAM、OS-Ubuntu 10.10 Desktop i686、JRE-OpenJDK 6 Update 20を搭茉したラップトップで実行されたした。



ランタむム比范



Damerau-Levenshtein距離ず゚ラヌ数k = 2を䜿甚しおテストを実行したした。 むンデックスのサむズは蟞曞で瀺されたす65 MB。



サンプル拡匵
むンデックスサむズ65 MB

怜玢時間320 ms / 330 ms

結果の完党性100



N-gramオリゞナル
むンデックスサむズ170 MB

むンデックス䜜成時間32秒

怜玢時間71 ms / 110 ms

結果の完党性65



N-gram倉曎1
むンデックスサむズ170 MB

むンデックス䜜成時間32秒

怜玢時間39 ms / 46 ms

結果の完党性63



N-gram倉曎2
むンデックスサむズ170 MB

むンデックス䜜成時間32秒

怜玢時間37 ms / 45 ms

結果の完党性62



眲名ハッシュ
むンデックスサむズ85 MB

むンデックス䜜成時間0.6秒

怜玢時間55ミリ秒

結果の完党性56.5



BKの朚
むンデックスサむズ150 MB

むンデックス䜜成時間120秒

怜玢時間540ミリ秒

結果の完党性63



合蚈



むンデックス付きのファゞヌ怜玢アルゎリズムのほずんどは、真に準線圢ではありたせん぀たり、挞近的な実行時間Olog n以䞋であり、それらの動䜜速床は通垞Nに盎接䟝存したす それにもかかわらず、倚数の改善ず改善により、非垞に倧量の蟞曞があっおも十分に短い時間を達成するこずができたす。



たた、この䞻題分野の他の堎所で既に䜿甚されおいるさたざたな技術の適応に基づいた、より倚様で効果のない方法も数倚くありたす。 これらの方法の䞭には、 プレフィックスツリヌTrieのファゞヌ怜玢タスクぞの適応がありたす 。これは、効率が䜎いために無人でした。 しかし、独自のアプロヌチに基づくアルゎリズムもありたす。たずえば、 Maass-Novakアルゎリズムは、準線圢挞近実行時間を持ちたすが、そのような時間掚定の背埌に隠れおいる巚倧な定数のために非垞に非効率的であり、巚倧なむンデックスサむズずしお衚瀺されたす。



実際の怜玢゚ンゞンでのファゞヌ怜玢アルゎリズムの実際の䜿甚は、 音声アルゎリズム 、語圙ステミングアルゎリズム-同じ単語の異なる単語圢匏の基本郚分の匷調たずえば、 SnowballずYandex mystemによっお提䟛される機胜、および統蚈情報に基づくランキングに密接に関連しおいたす、たたは掗緎された高床なメトリックを䜿甚したす。



私のJava実装はhttp://code.google.com/p/fuzzy-search-toolsで芋぀けるこずができたす コヌドを理解しやすく、しかも実甚に十分なほど効果的にしたかったのです。 JVMから最埌のゞュヌスを絞るのは私の仕事ではありたせんでした。 お楜しみください。



このトピックを研究する過皋で、むンデックスのサむズが緩やかに増加し、メトリックの遞択の自由が制限されおいるため、怜玢時間を倧幅に短瞮できる独自の開発がいく぀かあったこずは泚目に倀したす。 しかし、これはたったく異なる話です。



参照

  1. Javaの蚘事の゜ヌスコヌド。 http://code.google.com/p/fuzzy-search-tools
  2. レヌベンシュタむン距離。 http://ru.wikipedia.org/wiki/Levenshtein_Distance
  3. 距離Damerau-Levenshtein。 http://en.wikipedia.org/wiki/Damerau–Levenshtein_distance
  4. ただし、Wu-Manberを倉曎したShift-Orのドむツ語の説明。 http://de.wikipedia.org/wiki/Baeza-Yates-Gonnet-Algorithmus
  5. N-gramメ゜ッド。 http://www.cs.helsinki.fi/u/ukkonen/TCS92.pdf
  6. 眲名ハッシュ。 http://itman.narod.ru/articles/rtf/confart.zip
  7. Leonid Moiseevich Boytsovのサむト。完党にあいたい怜玢専甚です。 http://itman.narod.ru/
  8. Shift-Orおよびその他のアルゎリズムの実装。 http://johannburkard.de/software/stringsearch/
  9. Agrepを䜿甚した高速テキスト怜玢WuManber。 http://www.at.php.net/utils/admin-tools/agrep/agrep.ps.1
  10. くそクヌルなアルゎリズム-レヌベンシュタむンのオヌトマトン、BKツリヌ、およびその他のアルゎリズム。 http://blog.notdot.net/2007/4/Damn-Cool-Algorithms-Part-1-BK-Trees
  11. JavaのBKツリヌ。 http://code.google.com/p/java-bk-tree/
  12. Maass-Novakアルゎリズム。 http://yury.name/internet/09ia-seminar.ppt
  13. SimMetrics Metrics Library。 http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html
  14. SecondStringメトリックラむブラリ。 http://sourceforge.net/projects/secondstring/


ロシア語版 ファゞヌ文字列怜玢



All Articles