python中计算大型数据集相似矩阵的有效方法

python中计算大型数据集相似矩阵的有效方法,python,matrix,nltk,similarity,Python,Matrix,Nltk,Similarity,我正在使用亲和传播聚类对句子进行聚类。作为中间步骤,我计算相似性矩阵。它适用于小数据集,但对大数据集抛出内存错误。我有一个包含句子的数据集 样本数据集: 'open contacts', 'open music player', 'play song', 'call john', 'open camera', 'video download', ... 我的代码: import nltk, string from sklearn.feature_extraction.text import T

我正在使用亲和传播聚类对句子进行聚类。作为中间步骤,我计算相似性矩阵。它适用于小数据集,但对大数据集抛出内存错误。我有一个包含句子的数据集

样本数据集:

'open contacts',
'open music player',
'play song',
'call john',
'open camera',
'video download',
...
我的代码:

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

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)

#     global labels
    labels = affinity_propagation.labels_

#     global cluster_centers
    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)
        #print(len(sentence))

    return clusters

#csv 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)

有谁能给我推荐一种寻找相似矩阵的有效方法吗?我的数据集包含100万个句子。

一种可能的方法是将数据存储在Spark中,Spark还提供可伸缩的矩阵乘法

如果您有一个非常大的数据集/性能非常重要,请看一看。@umutto:我只想使用关联传播群集,因为我们不需要指定群集的数量。我使用了faiss的聚类方法。它需要大量的集群。你知道AP集群是最耗时的集群之一,对吗@阿尔瓦斯:好的。那么我应该选择哪种算法?好问题!但是没有一个可以从stackoverflow得到回答。嗯,我会在HDBScan的卡上从最快到最慢进行尝试。然后比较所有可能算法的结果,这些算法可以在我愿意花在每个算法上的时间内为我提供输出。我总是从K-means first=)开始,我甚至想过它,但Spark中没有亲和传播集群功能。我坚定地使用亲和传播集群。