我再次努力提高这段代码的执行时间。由于计算确实非常耗时,我认为最好的解决方案是并行化代码。
我首先使用地图,如中所述this https://stackoverflow.com/questions/29217088/parallelize-a-nested-for-loop-in-python-for-finding-the-max-value问题,但后来我尝试了一种更简单的方法,认为我可以找到更好的解决方案。然而我还想不出任何办法,所以由于这是一个不同的问题,我决定将其作为一个新问题发布。
我正在 Windows 平台上工作,使用 Python 3.4。
这是代码:
similarity_matrix = [[0 for x in range(word_count)] for x in range(word_count)]
for i in range(0, word_count):
for j in range(0, word_count):
if i > j:
similarity = calculate_similarity(t_matrix[i], t_matrix[j])
similarity_matrix[i][j] = similarity
similarity_matrix[j][i] = similarity
这是calculate_similarity
功能:
def calculate_similarity(array_word1, array_word2):
denominator = sum([array_word1[i] + array_word2[i] for i in range(word_count)])
if denominator == 0:
return 0
numerator = sum([2 * min(array_word1[i], array_word2[i]) for i in range(word_count)])
return numerator / denominator
以及代码的解释:
-
word_count
是列表中存储的唯一单词的总数
-
t_matrix
是一个包含每对单词的值的矩阵
- 输出应该是
similarity_matrix
其维度为word_count x word_count
还包含每对单词的相似度值
- 将两个矩阵都保存在内存中就可以了
- 经过这些计算后,我可以轻松找到每个单词最相似的单词(或前三个相似的单词,根据任务可能需要)
-
calculate_similarity
采用两个浮点列表,每个列表代表一个单独的单词(每个列表都是 t_matrix 中的一行)
我使用 13k 个单词的列表,如果计算正确,系统上的执行时间将是几天。所以,任何能在一天内完成工作的事情都会很棒!
也许只是并行化计算numerator
and denominator
in calculate_similarity
将会取得显着的改进。