我正在尝试抓取文本并在每次将两个单词出现在同一个句子中时将边缘权重添加到单词网络中。我正在使用networkx
。这是我的代码:
for word in words:
for otherWord in words:
for sent in sents:
if re.search(r'\b'+word+r'\b', str1) and re.search(r'\b'+otherWord+r'\b', str1) and word != otherWord:
#add edge weight
这非常慢,并且随着文本大小的增加呈指数级变慢。有更快的算法吗?
答案 0 :(得分:2)
您可以实施的一项改进:
for i in range(len(words)):
for j in range(i+1, len(words)):
word, other_word = words[i], words[j]
...
因此,不是进行n ^ 2次迭代,而是进行n^2/2
(一半)。
这种改进将无法检查word == other_word
是否也非常好,因为它在问题中的实现方式 - 即使在word == other_word
时每次运行正则表达式搜索 - 并且正则表达式很昂贵!
答案 1 :(得分:2)
你可以循环句子一次,将每个句子分成单词(删除重复),然后循环遍历该句子中的所有单词对;那么你就不会在没有出现在任何地方的对上浪费时间。
请注意,这可以与alfasin的建议一起完成。