5

Python を使用して Web アプリケーションにtf-idfアルゴリズムを実装していますが、動作が非常に遅くなります。私が基本的にしていることは次のとおりです。

1) 2 つの辞書を作成します。

  • 最初の辞書: キー (ドキュメント ID)、値 (ドキュメント内で見つかったすべての単語 (繰り返しを含む) のリスト)
  • 2 番目の辞書。キー (ドキュメント ID)、値 (ドキュメントの一意の単語を含むセット)

ここで、ドキュメント d の tfidf 結果を取得するようユーザーから請願があります。私がすることは:

2) ドキュメント d の 2 番目の辞書の一意の単語をループし、一意の単語 w ごとに次を取得します。

2.1) tf スコア (d に w が出現する回数: ドキュメントの最初の辞書の単語のリストをループ)

2.2) df スコア (w を含むドキュメントの数: すべてのドキュメント (2 番目の辞書) の単語のセットをループし、w が含まれているかどうかを確認します)。リストと比較して、セットに単語が含まれているかどうかを確認する方が速いように見えるため、セットを使用しています。

ステップ 2.2 は非常に遅いです。たとえば、1000 個のドキュメントがあり、2313 個の一意の単語を含むドキュメントの場合、結果を出力するのに約 5 分かかります。

ステップ 2.2 を高速化する他の方法はありますか? 反復処理が遅い辞書はありますか?

4

2 に答える 2

5

さて、あなたはあなたのデータを保持する方法をどうにかして再考し、再設計する必要があります、言い換えれば、あなたの「転置インデックス」の「正統な」バージョンを実装する必要があります。

ボトルネックは、用語のドキュメント頻度(DF)の「オンザフライ」計算です。これを動的にするのは賢明なアイデアです。コーパス(ドキュメントのコレクション)を更新するたびに、処理を実行し、ドキュメント内のすべての用語のDFを更新します(もちろん、結果を永続的に保存します)。 、別名データベースなど。)。

必要な構造は、そのようなネストされた辞書だけです。

{ "term1" : { "DF" : x, "some_doc_id" : tf , "some_other_doc_id" : tf, etc  } ,
  "term2" : ...
  etc..
}

コーパスを「フィード」するたびに適切に更新されます。

そしてもちろん、コーパスのカーディナリティをどこかに保ちます...

趣味として、そして私の仕事の一部として、私はpythonを実装しています-redisが支援する小さな検索エンジン。他のアイデアも得られるかもしれません。こちらをご覧ください。

于 2011-08-27T17:03:08.417 に答える
3

これは学術的な取り組みですか、それとも生産のために行っていますか? 本番用に実装している場合は、既に利用可能なもの (つまりhttp://code.google.com/p/tfidf/ ) を使用しないのはなぜですか? 一方、学術的な演習として行っている場合は、既存の実装をざっと見て、彼らが何をしているのかを確認するかもしれません (もしあれば)。

cProfileコードのプロファイリングを使用して、費用がどこにあるかを確認することもお勧めします。

于 2011-08-27T16:42:37.673 に答える