【发布时间】:2016-06-09 10:51:08
【问题描述】:
我正在做一些关于去重字符串的事情。 我的主要工作流程是:
df = pd.read_csv(some_path)
vect = TfidfVectorizer(min_df=1)
tfidf = vect.fit_transform(df.title.astype(unicode))
sml_matrix = (tfidf * tfidf.T)
sml_matrix = sml_matrix> similar_ratio
sml_matrix 就像:
│CHEESE CHORES GEESE GLOVES
───────┼───────────────────────────
CHEESE │ 1 0.222 0.177 0.444
CHORES │0.222 1 0.422 0.333
GEESE │0.177 0.422 1 0.300
GLOVES │0.444 0.333 0.300 1
显然,计算sml_matrix的上三角就足够了。
但我不知道如何只用 scipy.sparse 矩阵计算上三角。(我只能想象 forloop,但似乎效率不高)
for 循环示例(只是伪代码):
A = tfidf
T = tfidf.T
side_length = len(A)
for i in range(side_length):
for j in range(side_length):
if j < i:
# avoid calculate lower triangle and diagonal
continue
maxtrix[i,j] = A(i)* T(j)
从here,我看到numpy 有np.apply_along_axis(d, 0, _) 只计算上三角形,但scipy.sparse 没有。
更新:
无论数据集多大,只计算上三角会消耗更少的cpu资源。我对矩阵计算不熟悉,好奇让我问这个问题(如何只计算稀疏矩阵中的上三角),不是用于解决内存错误。
【问题讨论】:
-
您可能会遇到填写问题。
tfidf * tfidf.T可能会非常密集 - 例如,如果您在tfidf中只有一个密集列(即所有文档中都存在一个特征),那么您的sml_matrix将是 100% 密集的,即使其余的您的特征的出现非常稀少。如果您假设tfidf * tfidf.T是完全密集的,您甚至可以将它的上三角形放在内存中吗?
标签: python numpy matrix scipy scikit-learn