我有两个文本文件,都包含大约 700,000 行。
第二个文件包含对第一个文件中相应行的语句的响应。
我需要计算匹配行上出现的每个单词对的 Fisher 精确分数。
例如,如果文件中的第 n 行是
how are you
和
fine thanx
然后我需要计算 (how,fine), (how,thanx), (are,fine), (are,thanx), (you,fine), (you,thanx) 的 Fisher 分数。
为了计算 Fisher 的精确分数,我使用集合模块的计数器来计算每个单词的出现次数,以及它们在两个文件中的共同出现次数,如
with open("finalsrc.txt") as f1, open("finaltgt.txt") as f2:
for line1, line2 in itertools.izip(f1, f2):
words1 = list(set(list(find_words(line1))))
words2 = list(set(list(find_words(line2))))
counts1.update(words1)
counts2.update(words2)
counts_pair.update(list(set(list(itertools.product(words1, words2)))))
然后我使用 scipy 模块计算每对的Fisher精确分数
from scipy import stats
def calculateFisher(s, t):
sa = counts1[s]
ta = counts2[t]
st = counts_pair[s, t]
snt = sa - st
nst = ta - st
nsnt = n - sa - ta + st
oddsratio, pvalue = stats.fisher_exact([[st, snt], [nst, nsnt]])
return pvalue
这对于小文本文件来说既快又好,但由于我的文件每个包含 700,000 行,我认为计数器变得太大而无法快速检索值,这变得非常非常慢。
(假设每个句子 10 个单词,counts_pair 将有 (10^2)*700,000=70,000,000 个条目。)
完成文件中所有单词对的计算需要数十天的时间。
什么是聪明的解决方法?
非常感谢您的帮助。