私はデータベースにある構造化されたレコードのかなり小さなコーパスを持っています。Webフォーム(テーブルスキーマと同じように構造化されている)を介して送信された単一のレコードに含まれる情報のごく一部を考えると(これをテストレコードと呼びます)、リストをすばやく作成する必要があります。テストレコードと一致する可能性が最も高いレコード、および検索用語がレコードとどの程度一致しているかの信頼性の見積もりを提供します。この検索の主な目的は、コーパス内のレコードと重複するレコードを誰かが入力しようとしているかどうかを検出することです。テストレコードが重複する可能性は十分にあり、テストレコードが重複しない可能性は十分にあります。
レコードの幅は約12000バイトで、レコードの総数は約150,000です。テーブルスキーマには110の列があり、検索の95%が最も一般的に検索される上位5%の列になります。
データは、名前、住所、電話番号、その他の業界固有の番号などです。コーパスとテストレコードの両方で、手作業で入力され、個々のフィールド内で半構造化されています。最初は「列に手作業で重みを付け、その中の単語トークンを一致させる」と赤面するかもしれませんが、それはそれほど簡単ではありません。私もそう思いました。電話番号を取得した場合、それは完全に一致することを示していると思いました。問題は、トークンの頻度が桁違いに変化しないフォームに単一のフィールドがないことです。電話番号は、コーパスに100回、またはコーパスに1回表示される場合があります。他の分野についても同じことが言えます。これにより、フィールドレベルでの重み付けは実用的ではなくなります。きちんとしたマッチングを得るには、よりきめ細かいアプローチが必要です。
私の最初の計画は、ハッシュのハッシュを作成することでした。最上位はフィールド名です。次に、特定のフィールドのコーパスからすべての情報を選択し、そこに含まれるデータをクリーンアップして、サニタイズされたデータをトークン化し、トークンをキーとして、頻度を値として、第2レベルでトークンをハッシュします。
頻度カウントを重みとして使用します。参照コーパス内のトークンの頻度が高いほど、テストレコードで見つかった場合に、そのトークンに付加する重みは少なくなります。
私の最初の質問は、部屋の統計家に向けたものです。頻度を重みとしてどのように使用しますか?n、レコード数f(t)、トークンtがコーパスに出現する頻度、レコードがオリジナルで重複ではない確率o、および確率pの間に正確な数学的関係がありますか?テストレコードは、実際にはテストが与えられたレコードxであり、xには同じフィールドに同じtが含まれていますか?複数のフィールドにわたる複数のトークンの一致の関係はどうですか?
あることを心から疑っていますが、魔法の要素でいっぱいの完全に恣意的なハックよりも、私を近づけるものはありますか?
それを除けば、誰かがこれを行う方法を持っていますか?
トークン頻度ルックアップテーブルなど、データベース内の別のテーブルを維持する必要のない他の提案に特に熱心です。