我有一个语料库,包含 m 个文档和 n 个独特的单词。
基于这个语料库,我想计算一个词的共现矩阵,并计算它们的相似度。
为此,我创建了一个NumPy数组occurrences
(m x n),它指示每个文档中存在哪些单词。
基于occurrences
,我创建了cooccurrences
如下:
cooccurrences = np.transpose(occurrences) @ occurrences
此外,word_occurrences
给出了语料库中每个单词的总和:
word_occurrences = occurrences.sum(axis=0)
现在,我想根据关联强度计算cooccurrences
中单词的相似性得分。
我想将cooccurrences
中的每个单元格 i,j 除以word_occurrences[i] * word_occurrences[j]
。
目前,我通过cooccurrences
循环来实现这一点。
def calculate_association_strength(cooc, i, j, word_occurrences):
return cooc/(word_occurrences[i]*word_occurrences[j])
for i in range(len(cooccurrences)):
for j in range(len(cooccurrences)):
if i != j:
if cooccurrences[i,j] > 0 :
cooccurrences[i,j] = 1 - self.calculate_association_strength(cooccurrences[i,j], i,j,word_occurrences)
else:
cooccurrences[i,j] = 0
但是对于 m〉30000,这是非常耗时的。是否有更快的方法来完成此操作?
Here,他们讨论了在np.array上Map函数。然而,他们没有使用从数组派生的多个变量。
1条答案
按热度按时间omjgkv6w1#
如果我正确理解了这里的问题,你可以将整个操作向量化,所以结果将是:
cooccurrences / word_occurrences.reshape(-1,1) * word_occurrences
这几乎可以保证比遍历数组更快地工作。