約 700,000 行からなる 2 つのテキスト ファイルがあります。
2 番目のファイルは、対応する行の最初のファイルのステートメントに対する応答で構成されます。
一致する行に表示される単語のペアごとに、Fisher's Exact Score を計算する必要があります。
たとえば、ファイルの n 行目が
how are you
と
fine thanx
次に、(how,fine)、(how,thanx)、(are,fine)、(are,thanx)、(you,fine)、(you,thanx) のフィッシャーのスコアを計算する必要があります。
フィッシャーの正確なスコアを計算するために、次のように、コレクション モジュールのカウンターを使用して、各単語の出現回数と、2 つのファイル全体でのそれらの同時出現回数をカウントしました。
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 モジュールを使用して、各ペアのフィッシャーの正確なスコアを計算します。
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 エントリが含まれます。)
ファイル内のすべての単語ペアの計算を完了するには、数十日かかります。
これに対する賢明な回避策は何でしょうか?
ご協力をお願いいたします。