1

データベースを検索して、メールアドレス間の類似点を見つける方法を探しています。私ができる唯一の解決策はO(N ^ 2)であり、ネストされたループが含まれます。基本的にメールアドレスを取得し、それを残りのアドレスと何度も確認します。データベースで100,000の電子メールアドレスを処理しているため、これは非常に時間がかかります。違いが生じる場合、これはRubyonRailsアプリのバックグラウンドジョブとして実装されます。

これを行う方法はありますか?

私は本当に基本的な類似点だけを探しています。例は

docjohnson@gmail.com
docjohnson1@gmail.com
docjohnson333@gmail.com
docjohnson@hotmail.com

私はそれらすべてが互いに類似しているとマークされていることを望みます。

助けてくれてありがとう!

編集:ゲームがまったく変わる場合は、Mongoidを介してRORに接続されたMongoデータベースを使用しています。

4

2 に答える 2

1

各電子メールアドレスの「署名」を計算します。たとえば、署名は、アドレスのユーザー名部分の最初の5文字である可能性があります。すべての電子メールアドレスを並べ替えて、同じ署名を持つものをまとめます。署名アルゴリズムが適切に機能する場合、署名の各セットは同じ人物を参照する必要があります。データと類似性の定義に基づいて署名アルゴリズムを調整する必要があります。

于 2013-01-16T21:20:15.503 に答える
1

電子メールを「正規化」することから始めることをお勧めします。

  1. ユーザー名の部分から末尾の数字を削除します(例:john123->)john

  2. ユーザー名から句読点を削除する可能性があります(例:john.smith->)johnsmith

  3. ドメイン部分からいくつかのホストを削除します。例:mail.foo.com-> foo.com; しかし、そうではありませんmath.mit.edu-> mit.edu

1と2を実行した後、元の電子メールをハッシュテーブルに収集して、正規のユーザー名を元のユーザー名にマッピングする必要があります。これにより、完了したら、正規のユーザー名を繰り返すだけで済みます。

于 2013-01-16T21:24:01.877 に答える