オートコンプリート用の最近の/頻繁に連絡するためのアルゴリズム?

StackOverflow https://stackoverflow.com/questions/209725

質問

誰かにメールを送信すると自動的に入力されるオートコンプリート リストがあります。これはリストが非常に大きくなるまでは問題ありませんが、目的のアドレスに到達するには、さらに多くのアドレスを入力する必要があります。オートコンプリートの目的に反して

オートコンプリートの結果を、単にアルファベット順ではなく、最近連絡した機能または最も頻繁に連絡した機能によってソートするように、いくつかのロジックを追加する必要があると考えていました。

私が知りたいのは、この種の検索に適した既知のアルゴリズムがあるかどうか、または誰かが何か提案を持っているかどうかです。

同じ日が 5 ポイント、過去 3 日間が 4 ポイント、先週が 3 ポイント、先月が 2 ポイント、過去 6 か月が 1 ポイントのようなポイント システムのことを考えていました。そして、ほとんどの場合、25+ は 5 ポイント、15+ は 4、10+ は 3、5+ は 2、2+ は 1 となります。これらの数字が正しいと「感じる」こと以外に、実際のロジックはありません。

恣意的に選んだ数字以外に何か意見がある人はいますか?私の数字よりも優れていると思う理由を教えていただければ、他の数字も歓迎します

編集:これは主に、最新性 (単語を作るのはやあ) が頻度と同じくらい重要であるビジネス環境で発生します。また、ある時点を過ぎると、たとえば 80 回話した人とたとえば 30 回話した人との間には、実際には大きな違いはなくなります。

役に立ちましたか?

解決

この種のことは、あなたが入力しているサイトが何であるかをほのめかすときにfirefoxが行うことと似ているようです。

残念ながら、Firefoxがどのように機能するか正確にはわかりません。ポイントシステムも同様に良いようです。ポイントのバランスを取る必要があるかもしれません:)

次のようなものを探します:

NoM =メールの数

(本日Xに送信されたNoM)+ 1/2 *(先週Xに送信されたNoM)/ 7 + 1/3 *(先月Xに送信されたNoM)/ 30

あなたが先月書いていない連絡先(変更される可能性があります)には0ポイントがあります。合計で送信されたNoMの並べ替えを開始できます(連絡先リストにあるため:)。これらは、ポイントとの連絡先 後に表示されます> 0

これは単なるアイデアです。とにかく、ほとんどの連絡先とメールで送信された連絡先に異なる重要性を与えることです。

他のヒント

自己組織化リストを見てください。

簡単で汚い外観:

フロントヒューリスティックに移動:リンクされたリスト。ノードが選択されると必ずリストの先頭に移動します。

周波数ヒューリスティック:リンクされたリスト。ノードが選択されるたびに、その頻度カウントが増加し、最も頻繁にアクセスされるノードがリストの先頭になるように、そのノードがリストの先頭に向かってバブルされます。

フロントへの移行の実装がニーズに最も適しているようです。

編集:アドレスが選択されると、その周波数に 1 を追加し、同じ重み (またはコーサー グループの場合は (重み div x)) を持つノードのグループの先頭に移動します。あらゆる項目の重みを計算する必要があるという点で、経年劣化があなたの提案された実装の本当の問題であると思います。自己組織化されたリストは良い方法ですが、目的を達成するにはアルゴリズムに少し調整が必要です。

さらに編集:エージングとは、時間の経過とともに重みが減少するという事実を指します。つまり、アドレスが使用されるたびにそれを把握する必要があります。つまり、リストを作成するときに、電子メール履歴全体を利用できるようにする必要があります。

問題は、ノードが実際にアクセスされた場合にのみ、ノード上で (検索以外の) 計算を実行したいことです。これにより、統計的に良好なパフォーマンスが得られます。

夢中になりたい場合は、次のいずれかの方法で最も「アクティブな」メールにマークを付けます。

  • 最終アクセス
  • 使用頻度
  • 保留中の販売の連絡先
  • 直接ボス

次に、アクティブなメールをリストの上部に表示します。どの「グループ」に注意してください;ユーザーが最も使用します。十分なデータが収集された後、排他的にそのソート戦略に切り替えます。

大変な作業ですが、ちょっと楽しい...

各アドレスに送信された電子メールの数をカウントする場合があります。次に:

ORDER BY EmailCount DESC、LastName、FirstName

そうすることで、たとえ数日間使用されていなくても、最も頻繁に使用されるアドレスが最初に来ます。

最近使用したポイント、使用頻度、および潜在的に他の要因(ローカルドメインの連絡先を優先しますか?)を含むポイントベースのシステムのアイデアが好きです。

このようないくつかのシステムで作業したことがありますが、「最近使用した」システムもまた、「最も一般的に使用される」こともありません。とてもうまくいきます。 「最新」誤って何かを誤って入力した場合、非常に苦痛になります。または、「最も使用頻度の高い」去年誰かと多くの連絡を取り合っていたとしても、時間の経過とともにあまり進化しませんが、今ではあなたの仕事は変わっています。

使用する一連の測定値を取得したら、インタラクティブなアプリを作成してさまざまな重みをテストし、どの重みがいくつかのサンプルデータに対して最良の結果をもたらすかを確認できます。

このペーパーは単一パラメーターファミリーについて説明しています使用頻度が最も低いポリシーと使用頻度が最も低いポリシーを特別なケースとして含むキャッシュ削除ポリシーの例。

パラメーターlambdaの範囲は0〜1です。lambdaが0の場合、LFUキャッシュとまったく同じように動作し、lambdaが1の場合、LRUキャッシュとまったく同じように動作します。 0と1の間では、最新の情報と頻度情報の両方を自然な方法で結合します。

回答が選択されたにもかかわらず、検討とフィードバックのためにアプローチを提出したい。

使用するたびにカウンターをインクリメントすることで頻度を計算しますが、10(2番目のポイントに精度を追加する)などの1より大きい値でカウントします。

定期的な間隔(たとえば24時間)で all カウンターに逓減者(たとえば0.9)を掛けて、最新性を考慮します。

各用途:

UPDATE `addresslist` SET `favor` = `favor` + 10 WHERE `address` = 'foo@bar.com'

各間隔:

UPDATE `addresslist` SET `favor` = FLOOR(`favor` * 0.9)

この方法で、頻度と最新の両方を1つのフィールドに集約し、{前日、先週、先月}を導き出し、数学(ほとんど)整数を保持するために詳細な履歴を保持する必要を避けます。

もちろん、増分と減分は好みに合わせて調整する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top