次のような構造の、数字と単語シーケンスを含む行で構成される入力ファイルがあります。
\1-grams:
number w1 number
number w2 number
\2-grams:
number w1 w2 number
number w1 w3 number
number w2 w3 number
\end\
一意の n グラムごとに両方の数値を簡単に取得できるように、単語シーケンス (いわゆる n グラム) を保存したいと考えています。私が今していることは、次のとおりです。
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]
問題は、このストアド プロシージャがかなり遅いことです。特に、n グラムが多数 (> 100k) あり、アクセス速度を低下させずに同じ結果を達成するためのより高速な方法があるかどうか疑問に思っています。ここで次善の策を講じていますか? どこを改善できますか?
前もって感謝します、
ヨリス