2016-02-26 97 views
0

我正在做一些关于重复数据删除的字符串。 我的主要工作流程是:稀疏矩阵乘法只计算上三角形

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矩阵上三角(仅for循环我可以想像,但似乎不太有效)

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 resource.I我不熟悉矩阵运算,好奇心让我问这个问题(如何只计算稀疏矩阵中的上三角),而不是用于解决内存错误。

+1

您可能会遇到填充问题。 'tfidf * tfidf.T'可能会非常密集 - 例如,如果'tfidf'中只有一个密集列(即所有文档中存在单一特征),那么'sml_matrix'将是100%密集的,即使其他功能都非常稀疏。如果你认为'tfidf * tfidf.T'是完全密集的,你甚至可以把它的上三角形放在内存中吗? –

回答

1

也许你可以赢得一个2内存的因素有一些技巧,但数据大小始终增长...

所以还是住与和块拆分数据帧。 你可以做类似的东西:

df=pd.DataFrame(np.random.rand(12)) # as a mini exemple 
maxsize=4 
df['group']=df.index//maxsize 
df.set_index('group',append=True,inplace=True) 
df2=df.reorder_levels([1,0]) 

from itertools import combinations 

print(df) 
for i,j in (combinations(df2.index.levels[0],2)): 
    print (df2.loc[[i,j]]) 
    #or do something else. 

然后df是:

    0 
    group   
0 0  0.388695 
1 0  0.982780 
2 0  0.632253 
3 0  0.445638 
4 1  0.346920 
5 1  0.789327 
6 1  0.311657 
7 1  0.548581 
8 2  0.688201 
9 2  0.824547 
10 2  0.980281 
11 2  0.314968 

和厚块:

    0 
group   
0  0 0.388695 
     1 0.982780 
     2 0.632253 
     3 0.445638 
1  4 0.346920 
     5 0.789327 
     6 0.311657 
     7 0.548581 
        0 
group   
0  0 0.388695 
     1 0.982780 
     2 0.632253 
     3 0.445638 
2  8 0.688201 
     9 0.824547 
     10 0.980281 
     11 0.314968 
        0 
group   
1  4 0.346920 
     5 0.789327 
     6 0.311657 
     7 0.548581 
2  8 0.688201 
     9 0.824547 
     10 0.980281 
     11 0.314968 

然后计算和收集的好东西上的每个块。 你会做两次一些计算,但没有更多的内存错误。

+0

谢谢你的回答。我知道缩小数据集可以避免内存错误,但这个问题的目的是解决“如何只计算上三角”。 – Mithril

+0

与Numpy,我不认为这是可能的一种有效的方式。你可以用Numba或者Cython来做,但是由于dot是numpy更加优化的功能之一,你需要做很多工作才能达到同样的速度。 –