ふりがな検索

数年前、タスクはタイプミスを認識し、修正されたクエリを提供するサイトの1つを検索することでした。 いくつかのオプションが試されましたが、そのうちの1つをここで説明します。 異なる言語の固有名詞は子音であるため、単語の音に基づいて検索すると言語の境界が消去される場合があります。 たとえば、ロシア語で「Arnold Schwarzenegger」を探す場合-英語で「Arnold Schwarzenegger」を探す場合、または「Michael Jordan」を探す場合-「Michael Jordan」を探す場合、または「Chuck Norris」を探す場合-突然彼を見つけます。 子音の単語を検索することに加えて、この方法は多くのタイプミスを排除します。 そして、何かザドルバラがポップ、インサイダーについての詳細が必要です...







この検索の原理を明確に理解するには、soundexについてのアイデアが必要です。 以下で提案するソリューションは、soundexに基づいて構築されているのではなく、私がRussifiedに変更したDaitch-Mokotoffテーブルを使用して、より興味深いものにしているとすぐに言います。 Soundexは古代の有名なものです。 既にこのアルゴリズムに精通している場合、読者は次の段落をスキップできます。 さらに、それらが何を意味するかを理解するために、慣れていない人のための小さな紹介...



イントロ/ Soundex



Soundexは、国民に関する家系情報を保存する米国の国立アーカイブを使用しています。 chuvachkaは要件の1つとして提示されました。多くの固有名詞があいまいに書かれているため(たとえば、Smith / Smyth)、アルゴリズムはさまざまなスペルで必要なものを見つける必要があります。 シチズンラッセルはアメリカ人の首に傷をつけて展開しました。

  1. 各単語は4文字のコードで表されます。
  2. 4桁のコードの最初の文字は、エンコードされた単語の最初の文字です。
  3. 単語の後続の各文字は、エンコードテーブルに従って番号に置き換えられます。
  4. 表に表示されていない文字は、nafigで破棄され、エンコードされません。
表は次のとおりです。







明らかに、子音のみがエンコードされます。 それらは英語の単語の音声的にサポートする部分を構成します。 二重子音は1つとしてエンコードされます。 結果のコードは切り捨てられるか、最大4文字のゼロが埋め込まれます。 たとえば、WashingtonはW252としてエンコードされます(「W」が最初、「a」がスロー、「s」= 2、「h」がスロー、「n」= 5、「g」= 2、残りの文字がスロー)、LeeはL000(「L」が最初、「e」が2回スローされ、000が4文字に追加されます)。 単語の最初の文字は、母音であっても、テーブルにない場合でも常に元のままです。 したがって、soundexコードを知っているアメリカのグラニーは、ファイルキャビネット内のすべてのスミス、スミス、スムースをすばやく掘り下げることができます。 soundexの詳細をご覧ください 。 とにかく、soundex shnyaga、そしてロールバックしません。Jones、James、およびJeansは同じものをエンコードするからです。



ダイッチ・モコトフ



西洋わさびは、おそらく英語の音声学にはsoundexで十分ですが、soundexのルールは他の言語や単語、たとえば私たちの偉大で強力な言語には適していません-ロシア語の子音だけをエンコードするだけでは不十分です。 デュード・オランダ人と納税者のモコトフは、ヨーロッパの言語に特有の発音の特性を考慮して、夕方に自分のテーブルを見積もった。 そのようながらくたは次のとおりです。







コーディングの原理はsoundexの場合と同じですが、以下が追加されています。



  1. 単語は6桁でエンコードされ、各桁は表の左列の音の1つを表します。
  2. 単語の文字数が少ない場合、コードには6個のゼロが追加されます。 文字が多すぎる場合、6文字に切り捨てられます。 GOLDENという単語では、4つの音[GLDN]のみがエンコードされ、583600が取得されます。
  3. A、E、I、O、U、J、およびYの文字は、たとえば、Alpert 087930という名前のように、常に単語の最初の数字に置き換えられます。他の場合、これらの文字はスキップされ、何も置き換えられません。ペアを形成し、ペアの直後に別の母音が来る。 たとえば、Breuer 'eu'という名前は791900をエンコードしますが、Freudという名前はエンコードしません。
  4. Haber 579000のように文字Hが最初の場合は数字に置き換えられ、Manheim 665600のように母音が来ると、それ以外の場合はスキップされます。
  5. 隣接する文字が表に表示される長いシーケンスを形成する場合、最も適切なバリアントをエンコードする必要があります。 MintzはMIN-TZ 664000としてエンコードされますが、MIN-TZではエンコードされません。
  6. 隣接する文字が連続して2つの同一のコードを形成する場合、それらは1つとして書き込まれます。たとえば、TOPFはTO-PF 370000になりますが、TO-PF 377000にはなりません。 Kleinman 586660ではなく、586600ではマージできません。
  7. CH、CK、C、J、およびRSのシーケンスは、言語によって異なる場合があります。2つのオプションが用意されています(表では、ロシア語版が赤で強調表示されています)。


この表はラテンアルファベットに基づいた言語向けに設計されているため、ロシア語のマットをエンコードするには、魔法の音訳を使用する必要があります。



アウトロ



合計で、2つの関数が判明しました-dmwordとdmstring、1つは単語をdaitch-mokotoffコードにエンコードし、もう1つは文字列を単語に分割して各単語をエンコードし、スペースで区切られたdaitch-mokotoffコードの文字列にすべてを接着します。 この場合の実装用のフィードはphpで記述されていますが、任意に書き換えることができます。 生成されたコードは、通常どおりデータベースに表示され、単収縮します。 UTF8で動作します。

ソースの両方の機能を参照してください

dmstring(' ') == dmstring('Michael Jordan') == 658000 493600

dmstring(' ') == dmstring('Arnold Schwarzenegger') == 096830 479465

dmstring(' ') == dmstring('Arnold Schwarzenegger') == 096830 479465



// ... - .







いくつかの特に高度なケースでは、このような検索は誤っている可能性がありますが、ほとんどの言語および特定の用途に合わせて調整するのに役立ちます。 フォールバックのように、完全に一致するものがない場合は、それに頼る必要があります。 提示されたバージョンは、ロシア語と英語のトランスコーディングを最適にサポートするように設計されています。 これを使用できます:

PR: ピカマティックが大好き



All Articles