在 Python 中计算共现矩阵的任何替代方法?
Any alternate approaches to calculate co-occurrence matrix in Python?
我正在尝试计算大型语料库的共现矩阵,但这需要很长时间(+6 小时)。有没有更快的方法?
我的做法:
将此数组视为 corpus
并将语料库的每个元素视为 context
:
corpus = [
'where python is used',
'what is python used in',
'why python is best',
'what companies use python'
]
算法:
words = list(set(' '.join(corpus).split(' ')))
c_matrix = np.zeros((len(words), len(words)), dtype='int')
for context in corpus:
context = context.split(' ')
for i in range(len(context)):
for j in range(i + 1, len(context)):
row = words.index(context[i])
column = words.index(context[j])
c_matrix[row][column] += 1
提供的算法效率不高,因为它需要重新计算 words.index(...)
很多时间。您可以先预先计算索引,然后构建矩阵。这是一个明显更好的解决方案:
words = list(set(' '.join(corpus).split(' ')))
c_matrix = np.zeros((len(words), len(words)), dtype='int')
for context in corpus:
context = context.split(' ')
index = [words.index(item) for item in context]
for i in range(len(context)):
for j in range(i + 1, len(context)):
c_matrix[index[i]][index[j]] += 1
此外,您可以将 index
转换为 Numpy 数组并使用 Numba(或 Cython)从 [=12] 快速构建 c_matrix
=].
最后可以将words
转成字典(以当前列表中的字符串作为字典键,当前列表中的索引作为字典值),以便索引会更快(恒定时间获取)。
生成的算法应该快几个数量级。如果这还不够,那么您可能需要根据您的需要用更高级(但也更复杂)稀疏数据结构替换矩阵c_matrix
。
我正在尝试计算大型语料库的共现矩阵,但这需要很长时间(+6 小时)。有没有更快的方法?
我的做法:
将此数组视为 corpus
并将语料库的每个元素视为 context
:
corpus = [
'where python is used',
'what is python used in',
'why python is best',
'what companies use python'
]
算法:
words = list(set(' '.join(corpus).split(' ')))
c_matrix = np.zeros((len(words), len(words)), dtype='int')
for context in corpus:
context = context.split(' ')
for i in range(len(context)):
for j in range(i + 1, len(context)):
row = words.index(context[i])
column = words.index(context[j])
c_matrix[row][column] += 1
提供的算法效率不高,因为它需要重新计算 words.index(...)
很多时间。您可以先预先计算索引,然后构建矩阵。这是一个明显更好的解决方案:
words = list(set(' '.join(corpus).split(' ')))
c_matrix = np.zeros((len(words), len(words)), dtype='int')
for context in corpus:
context = context.split(' ')
index = [words.index(item) for item in context]
for i in range(len(context)):
for j in range(i + 1, len(context)):
c_matrix[index[i]][index[j]] += 1
此外,您可以将 index
转换为 Numpy 数组并使用 Numba(或 Cython)从 [=12] 快速构建 c_matrix
=].
最后可以将words
转成字典(以当前列表中的字符串作为字典键,当前列表中的索引作为字典值),以便索引会更快(恒定时间获取)。
生成的算法应该快几个数量级。如果这还不够,那么您可能需要根据您的需要用更高级(但也更复杂)稀疏数据结构替换矩阵c_matrix
。