目前我正在处理文本。我的主要目标是计算3万个文本之间的相似度。我正在关注this tutorial:
创建文档字词矩阵:
In [1]: import numpy as np # a conventional alias
In [2]: from sklearn.feature_extraction.text import CountVectorizer
In [3]: filenames = ['data/austen-brontë/Austen_Emma.txt',
...: 'data/austen-brontë/Austen_Pride.txt',
...: 'data/austen-brontë/Austen_Sense.txt',
...: 'data/austen-brontë/CBronte_Jane.txt',
...: 'data/austen-brontë/CBronte_Professor.txt',
...: 'data/austen-brontë/CBronte_Villette.txt']
...:
In [4]: vectorizer = CountVectorizer(input='filename')
In [5]: dtm = vectorizer.fit_transform(filenames) # a sparse matrix
In [6]: vocab = vectorizer.get_feature_names() # a list
In [7]: type(dtm)
Out[7]: scipy.sparse.csr.csr_matrix
In [8]: dtm = dtm.toarray() # convert to a regular array
In [9]: vocab = np.array(vocab)
比较文字 我们想要使用考虑到小说长度的距离度量,我们可以计算余弦相似度。
In [24]: from sklearn.metrics.pairwise import cosine_similarity
In [25]: dist = 1 - cosine_similarity(dtm)
In [26]: np.round(dist, 2)
Out[26]:
array([[-0. , 0.02, 0.03, 0.05, 0.06, 0.05],
[ 0.02, 0. , 0.02, 0.05, 0.04, 0.04],
[ 0.03, 0.02, 0. , 0.06, 0.05, 0.05],
[ 0.05, 0.05, 0.06, 0. , 0.02, 0.01],
[ 0.06, 0.04, 0.05, 0.02, -0. , 0.01],
[ 0.05, 0.04, 0.05, 0.01, 0.01, -0. ]])
最终结果:
如上所述,我的目标是计算3万个文本之间的相似度。在实现上述代码时,它花费了太多时间,最终给了我一个内存错误。 我的问题是---有没有更好的解决方案来计算大量文本之间的余弦相似度?你如何应对时间和内存错误问题?