【发布时间】:2013-06-25 02:54:30
【问题描述】:
我有一个输入文件,由带有数字和单词序列的行组成,结构如下:
\1-grams:
number w1 number
number w2 number
\2-grams:
number w1 w2 number
number w1 w3 number
number w2 w3 number
\end\
我想以这样一种方式存储单词序列(所谓的 n-gram),以便我可以轻松地检索每个唯一 n-gram 的两个数字。我现在要做的是:
all = {}
ngrams = {}
for line in open(file):
m = re.search('\\\([1-9])-grams:',line.strip()) # find nr of words in sequence
if m != None:
n = int(m.group(1))
ngrams = {} # reinitialize dict for new n
else:
m = re.search('(-[0-9]+?[\.]?[0-9]+)\t([^\t]+)\t?(-[0-9]+\.[0-9]+)?',line.strip()) #find numbers and word sequence
if m != None:
ngrams[m.group(2)] = '{0}|{1}'.format(m.group(1), m.group(3))
elif "\end\\" == line.strip():
all[int(n)] = ngrams
通过这种方式,我可以轻松快速地找到数字,例如序列 s='w1 w2' 这样:
all[2][s]
问题是这个存储过程相当慢,特别是当有很多(> 100k)n-gram时,我想知道是否有更快的方法来实现相同的结果而不会减少访问速度。我在这里做的不是最理想的吗?哪里可以改进?
提前致谢,
乔里斯
【问题讨论】:
-
all是一个内置函数。不要重复使用此名称。 -
哪个慢:从磁盘加载数据,还是使用它?两者都有?
-
使用数据很慢。我不知道有办法优化“for l in open(f)”?!
-
@Elazar:是的,不好的做法,我同意。
-
@niefpaarschoenen:我的意思是问:这很慢,您发布的解析数据并将其放入字典的代码;还是之后使用字典的代码?