配列をフィルタリングするためのあいまい検索JavaScriptライブラリを探しています。fuzzyset.jsとfuse.jsを使用してみましたが、結果はひどいです(リンクされたページで試すことができるデモがあります)。
レーベンシュタイン距離について少し読んだ後、それはユーザーがタイプしたときに探しているものの不十分な近似として私に印象づけます。知らない人のために、システムは、2つの文字列を一致させるために必要な挿入、削除、および置換の数を計算します。
Levenshtein-Demerauモデルで修正された明らかな欠陥の1つは、blubとboobの両方が球根に等しく類似していると見なされることです(それぞれ2つの置換が必要です)。ただし、bulbはboobよりもblubに似ていることは明らかです。先ほど述べたモデルでは、転置を許可することでそれを認識しています。
これをテキスト補完のコンテキストで使用したいので、配列['international', 'splint', 'tinder']
があり、クエリがintの場合、前者のスコア(higher = worse)が10であっても、splintよりもInternationalのランクが高くなるはずです。後者の対3。
だから私が探しているのは(そしてそれが存在しない場合は作成します)、次のことを行うライブラリです:
- さまざまなテキスト操作に重みを付ける
- 各操作の重み付けは、単語のどこに出現するかによって異なります(初期の操作は後の操作よりもコストがかかります)。
- 関連性でソートされた結果のリストを返します
誰かがこのようなものに出くわしましたか?StackOverflowがソフトウェアの推奨事項を求める場所ではないことに気づきましたが、上記の暗黙の(もうない!)は次のとおりです。これを正しい方法で考えていますか?
編集する
この件に関して良い論文(pdf)を見つけました。いくつかのメモと抜粋:
アフィン編集距離関数は、挿入または削除のシーケンスに比較的低いコストを割り当てます
Monger-Elkan距離関数(Monge&Elkan 1996)。これは、特定のコストパラメータを持つSmith-Waterman距離関数(Durban et al。1998)のアフィンバリアントです。
ためのスミス-ウォーターマン距離(ウィキペディア)、「その代わりに全配列を見てから、スミス-ウォーターマンアルゴリズムは、すべての可能な長さのセグメントを比較し、類似性測度を最適化します。」それはn-gramアプローチです。
編集距離モデルに基づいていない、広く類似したメトリックは、Jaroメトリックです(Jaro 1995; 1989; Winkler 1999)。レコードリンケージの文献では、2つの文字列間の共通文字の数と順序に基づく、このメソッドのバリアントを使用して良好な結果が得られています。
Winkler(1999)によるこのバリアントも、最長の共通プレフィックスの長さPを使用します
(主に短い文字列を対象としているようです)
テキスト補完の目的で、Monger-ElkanおよびJaro-Winklerのアプローチが最も理にかなっているようです。WinklerのJaroメトリックへの追加は、単語の始まりをより重く効果的に重み付けします。また、Monger-Elkanのアフィン的側面は、単語を補完する必要性(これは単なる追加のシーケンスです)がそれほど嫌われないことを意味します。
結論:
TFIDFランキングは、いくつかのトークンベースの距離メトリックの間で最もよく機能し、MongeとElkanによって提案された調整されたアフィンギャップ編集距離メトリックは、いくつかの文字列編集距離メトリックの間で最もよく機能しました。驚くほど良い距離メトリックは、Jaroによって提案され、後でWinklerによって拡張された高速ヒューリスティックスキームです。これは、Monge-Elkanスキームとほぼ同じように機能しますが、桁違いに高速です。TFIDFメソッドとJaro-Winklerを組み合わせる簡単な方法の1つは、TFIDFで使用されている正確なトークンの一致を、Jaro-Winklerスキームに基づくおおよそのトークンの一致に置き換えることです。この組み合わせは、平均でJaro-WinklerやTFIDFよりもわずかに優れており、場合によってははるかに優れています。また、このペーパーで検討されているいくつかの最良のメトリックの学習された組み合わせに近いパフォーマンスを発揮します。
krole
は戻りませんがFinal Fantasy V: Krile
、希望します。クエリ内のすべての文字が結果で同じ順序で存在する必要がありますが、これはかなり近視眼的です。あいまい検索を適切に行う唯一の方法は、一般的なタイプミスのデータベースを用意することです。