4

私はGENSIM、約 4000 の機能の辞書と共に 50000 のドキュメントのコーパスを使用しています。またLSI、同じモデルをすでに準備しています。

ここで、追加された各ドキュメントについて、最も一致する特徴を見つけたいと考えています。特定のドキュメントで最適な機能を見つけるために、すべてのドキュメントの各機能に対して gensim の類似性モジュールを実行しています。これにより、後で使用する各機能のスコアが得られます。しかし、ご想像のとおり、50000 以上のインデックスを反復処理し、それぞれに対して 4000 回の類似性の反復を実行する必要があるため、これはコストのかかるプロセスです。

約 1000 回の反復でシステムの 8 GB メモリが不足するため、これを行うためのより良い方法が必要です。反復中にメモリを再割り当てしているだけなので、メモリが増加し続ける理由は実際にはありません。驚くべきことに、メモリは約 200 回の反復後にのみ増加し始めます。

  1. なぜメモリの問題?どうすれば解決できますか?
  2. 特定のドキュメント (トピックではない) で最高スコアの機能を見つけるより良い方法はありますか?

メモリ不足になるコードのスニペットを次に示します。

dictionary = corpora.Dictionary.load('features-dict.dict')
corpus = corpora.MmCorpus('corpus.mm')
lsi = models.LsiModel.load('model.lsi')
corpus_lsi = lsi[corpus]
index = similarities.MatrixSimilarity(list(corpus_lsi))
newDict = dict()

for feature in dictionary.token2id.keys():
  vec_bow = dictionary.doc2bow([feature])
  vec_lsi = lsi[vec_bow]
  sims = index[vec_lsi]
  li = sorted(enumerate(sims * 100), key=lambda item: -item[1])

  for data in li:
    dict[data[0]] = (feature,data[1]) # Store feature and score for each document


# Do something with the dict created above

編集:

メモリの問題は、メモリ プロファイラを使用して解決されました。そのループには、それを劇的に上昇させる別の何かがありました.

趣旨を詳しく説明します。さまざまなレシピ (各レシピはドキュメント) を扱っており、辞書の各項目は材料であると想像してください。以下の6つのそのようなレシピを見つけてください.

corpus = [[Olive Oil, Tomato, Brocolli, Oregano], [Garlic, Olive Oil, Bread, Cheese, Oregano], [Avocado, Beans, Cheese, Lime], [Jalepeneo, Lime, Tomato, Tortilla, Sour Cream], [Chili Sauce, Vinegar, Mushrooms, Rice], [Soy Sauce, Noodles, Brocolli, Ginger, Vinegar]]

そのようなレシピは何千もあります。私が達成しようとしているのは、各成分に 0 から 100 の間の重みを割り当てることです (重みの大きい成分が最も重要または最もユニークです)。これを達成するための最良の方法は何でしょうか。

4

1 に答える 1

2

これを分解してみましょう:

  1. 私があなたの目的を誤解していない限り、左特異ベクトルを単純に使用しlsi.projection.uて重みを取得できます。

    # create #features x #corpus 2D matrix of weights
    doc_feature_matrix = numpy.dot(lsi.projection.u, index.index.T)
    

    このマトリックスの行は、探している「ドキュメントの重み」である必要があります。1 つの機能に対して 1 つの行です。

  2. を呼び出すとlist()list(lsi[corpus])コードが非常に非効率になります。基本的に、doc-topic マトリックス全体を RAM にシリアライズします。をドロップしlist()てストリーミング バージョンを直接使用すると、メモリ効率が大幅に向上しますindex = MatrixSimilarity(lsi[corpus], num_features=lsi.num_topics)

  3. 通常、LSI は正規化された入力よりも適切に機能します。LSI に渡す前に、たとえばTF-IDFまたは対数エントロピー変換を介して単純な bag-of-words ベクトル (=整数) を変換することを検討してください。

于 2014-04-24T17:50:01.827 に答える