我需要迭代两个文件数百万次,计算在整个文件中出现的字词对的数量。(为了建立两个词的偶合表,计算费舍尔的准确测试分数)
我现在在用
from itertools import izip
src=tuple(open('src.txt','r'))
tgt=tuple(open('tgt.txt','r'))
w1count=0
w2count=0
w1='someword'
w2='anotherword'
for x,y in izip(src,tgt):
if w1 in x:
w1count+=1
if w2 in y:
w2count+=1
.....虽然这还不错,但我想知道是否有更快的方法来迭代两个文件,希望有更快的速度。
我感谢你提前提供帮助。
发布于 2013-10-17 11:03:24
我仍然不太明白您到底想要做什么,但是下面的一些示例代码可能会为您指明正确的方向。
我们可以使用字典或collections.Counter实例在一次遍历文件中对所有出现的单词和对进行计数。之后,我们只需要查询内存中的数据.
import collections
import itertools
import re
def find_words(line):
for match in re.finditer("\w+", line):
yield match.group().lower()
counts1 = collections.Counter()
counts2 = collections.Counter()
counts_pairs = collections.Counter()
with open("src.txt") as f1, open("tgt.txt") as f2:
for line1, line2 in itertools.izip(f1, f2):
words1 = list(find_words(line1))
words2 = list(find_words(line2))
counts1.update(words1)
counts2.update(words2)
counts_pairs.update(itertools.product(words1, words2))
print counts1["someword"]
print counts1["anotherword"]
print counts_pairs["someword", "anotherword"]发布于 2013-10-17 10:02:47
通常,如果您的数据足够小,可以容纳到内存中,那么您最好的选择是:
如果文件很大,您可以将文件预处理到数据结构中,例如压缩的数据,并将其保存为一种格式,如泡菜,这种格式的加载速度要快得多&然后在单独的文件中处理该文件。
发布于 2013-10-17 10:18:40
就像一种开箱即用的思维解决方案:您是否尝试过将文件制作成Pandas数据帧?也就是说,我假设你已经从输入中列出了一个单词列表(通过删除诸如。和,)并使用input.split(‘')或类似的东西。然后您可以将其转换为DataFrames,执行wordd计数,然后再进行笛卡儿连接?
import pandas as pd
df_1 = pd.DataFrame(src, columns=['word_1'])
df_1['count_1'] = 1
df_1 = df_1.groupby(['word_1']).sum()
df_1 = df_1.reset_index()
df_2 = pd.DataFrame(trg, columns=['word_2'])
df_2['count_2'] = 1
df_2 = df_2.groupby(['word_2']).sum()
df_2 = df_2.reset_index()
df_1['link'] = 1
df_2['link'] = 1
result_df = pd.merge(left=df_1, right=df_2, left_on='link', right_on='link')
del result_df['link']我用这样的东西来做篮子分析,效果很好。
https://stackoverflow.com/questions/19423400
复制相似问题