私はGENSIM
、約 4000 の機能の辞書と共に 50000 のドキュメントのコーパスを使用しています。またLSI
、同じモデルをすでに準備しています。
ここで、追加された各ドキュメントについて、最も一致する特徴を見つけたいと考えています。特定のドキュメントで最適な機能を見つけるために、すべてのドキュメントの各機能に対して gensim の類似性モジュールを実行しています。これにより、後で使用する各機能のスコアが得られます。しかし、ご想像のとおり、50000 以上のインデックスを反復処理し、それぞれに対して 4000 回の類似性の反復を実行する必要があるため、これはコストのかかるプロセスです。
約 1000 回の反復でシステムの 8 GB メモリが不足するため、これを行うためのより良い方法が必要です。反復中にメモリを再割り当てしているだけなので、メモリが増加し続ける理由は実際にはありません。驚くべきことに、メモリは約 200 回の反復後にのみ増加し始めます。
- なぜメモリの問題?どうすれば解決できますか?
- 特定のドキュメント (トピックではない) で最高スコアの機能を見つけるより良い方法はありますか?
メモリ不足になるコードのスニペットを次に示します。
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 の間の重みを割り当てることです (重みの大きい成分が最も重要または最もユニークです)。これを達成するための最良の方法は何でしょうか。