【问题标题】:MemoryError in sentence clustering in PythonPython中句子聚类中的MemoryError
【发布时间】:2018-02-02 12:17:23
【问题描述】:

我有一百万个句子。我正在使用 Affinity Propagation 算法将相似的句子聚集在一起。我在处理如此大的数据并出现内存错误时遇到问题。

错误:

----------------------------------- ---------------------------------------- MemoryError Traceback(最近调用 最后)在() 72#] 73 ---> 74 个簇 = get_clusters(sentences) 75 #打印(集群) 76

在 get_clusters(sentences) 18 def get_clusters(句子): 19 tf_idf_matrix = vectorizer.fit_transform(句子) ---> 20 相似度矩阵 = (tf_idf_matrix * tf_idf_matrix.T).A 21 亲和传播=亲和传播(亲和=“预计算”,阻尼=0.5) 22 affinity_propagation.fit(similarity_matrix)

~/.local/lib/python3.5/site-packages/scipy/sparse/base.py 在 getattr(自我,attr) 562 def getattr(自我,attr): 第563章 --> 564 返回 self.toarray() 第565章 第566章

~/.local/lib/python3.5/site-packages/scipy/sparse/compressed.py 在 toarray(自我,订单,出) 第962章 963 """查看spmatrix.toarray的文档字符串。""" --> 964 返回 self.tocoo(copy=False).toarray(order=order, out=out) 965 第966章##############

~/.local/lib/python3.5/site-packages/scipy/sparse/coo.py 在 toarray(自我,订单,出) 250 def toarray(自我,订单=无,出=无): 251 """查看spmatrix.toarray的文档字符串。""" --> 252 B = self._process_toarray_args(order, out) 253 fortran = int(B.flags.f_contiguous) 254 如果不是 fortran 也不是 B.flags.c_contiguous:

~/.local/lib/python3.5/site-packages/scipy/sparse/base.py 在 _process_toarray_args(self, order, out) 1037 return out 1038 else: -> 1039 return np.zeros(self.shape, dtype=self.dtype, order=order) 1040 1041 def numpy_ufunc(self, func, 方法,位置,输入,**kwargs):

内存错误:

代码:

import nltk, string
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import AffinityPropagation
import pandas as pd
from collections import Counter

punctuation_map = dict((ord(char), None) for char in string.punctuation)
stemmer = nltk.stem.snowball.SpanishStemmer()

def stem_tokens(tokens):
    return [stemmer.stem(item) for item in tokens]

def normalize(text):
    return stem_tokens(nltk.word_tokenize(text.lower().translate(punctuation_map)))

vectorizer = TfidfVectorizer(tokenizer=normalize)

def get_clusters(sentences):
    tf_idf_matrix = vectorizer.fit_transform(sentences)
    similarity_matrix = (tf_idf_matrix * tf_idf_matrix.T).A
    affinity_propagation = AffinityPropagation(affinity="precomputed", damping=0.5)
    affinity_propagation.fit(similarity_matrix)

    labels = affinity_propagation.labels_

    cluster_centers = affinity_propagation.cluster_centers_indices_

    tagged_sentences = zip(sentences, labels)
    clusters = {}

    for sentence, cluster_id in tagged_sentences:
        clusters.setdefault(sentences[cluster_centers[cluster_id]], []).append(sentence)

    return clusters


#loading data file
filename = "/home/ubuntu/VA_data/first_50K.csv"
df = pd.read_csv(filename, header = None)

sentences = df.iloc[:, 0].values.tolist()

clusters = get_clusters(sentences)

#print cluster labels in descending order of number sentences present in it 
for k in sorted(clusters, key=lambda k: len(clusters[k]), reverse=True):
        print(k,"\n")

#Print cluster with sentences in it
for cluster in clusters:
    print(cluster, ':')
    count = 0
    for element in clusters[cluster]:
        print('  - ', element)
        count+= 1
    print('Cluster size: ', count)
    print('% of queries within the cluster', (count/len(sentences))*100)

print('Number of clusters: ',len(cluster_centers))

我应该如何解决这个问题?请帮忙

【问题讨论】:

  • 买更多的内存?
  • @Mad:我有 16GB RAM 和 64 位系统和 Ubuntu
  • 您可能应该将其编辑到您的问题中。

标签: python memory memory-management cluster-analysis


【解决方案1】:

亲和传播需要两个不对称的 n × n 矩阵。您的输入矩阵是另一个副本。

算一算:对于 n=100 万和双精度乘以三个矩阵(甚至可能还有另一个副本),您需要多少内存?您是否有足够的内存来存储 TB 的距离数据?

否则,您可能应该使用一种使用距离矩阵的算法。

【讨论】:

  • 我没有完全理解你。能详细解释一下吗?
  • 当您编写这样的代码时:(tf_idf_matrix * tf_idf_matrix.T),它将永远扩展到大数据。计算存储结果需要多少内存,你就会明白为什么这些算法不能扩展。所以错误是正确的:你的程序要求的内存比你有的多。
  • 感谢 Anony 的帮助。由于我是 python 新手,你能建议我需要做的代码更改吗?
  • 没有。因为如果您更改代码,这不会将您的系统内存增加到几 TB。如果您想做一些不可能的事情,请不要将其归咎于 python。
  • 我不是在责怪 Python。我刚接触这个,所以想探索新的方法。
【解决方案2】:

@Sonal,我最近也遇到了这个问题(这就是我在这里的原因)。如果您想测试应用Anony-Mousse 的建议,请考虑使用sentences = sentences.head(n=20) 之类的方法缩小数据。如果其他所有内容都正确编写,这将为您成功运行。但是当你增加n 的值时,你最终会碰到同样的MemoryError。在 Anony-Mousse 看来,这是一个合法的系统限制,Python 预先告诉您,您的系统无法运行这么多计算。最有可能的是,这只能通过更改硬件或更改您对集群的选择来解决。

我也是初学者,所以不要把这个当成福音 :) 希望这能帮助你不断迭代!

【讨论】:

    猜你喜欢
    • 2011-04-28
    • 2018-03-14
    • 2015-03-20
    • 2014-07-31
    • 2020-04-09
    • 2017-08-28
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多