Python'da yeni ve şu anda Python 2 kullanıyorum. Her biri çok büyük miktarda veri içeren bazı kaynak dosyalarım var (yaklaşık 19 milyon satır)).python - büyük dosya arama verimliliğini artırarak artırın (boyut)
apple \t N \t apple
n&apos
garden \t N \t garden
b\ta\md
great \t Adj \t great
nice \t Adj \t (unknown)
etc
Benim görevim bir hedef kelime 10 kelime önce ve bu kelimeden sonra korpus bulunan bazı hedef kelime ve her seferinde her dosyanın 3 sütun arama yapmaktır gelmiş olması: Aşağıdaki benziyor çok boyutlu bir sözlüğe eklendi.
EDIT: '&', '\' veya '(bilinmeyen)' dizgisini içeren satırlar dışlanmalıdır.
Bunu, aşağıdaki kodda gördüğünüz gibi readlines() ve numaralandır() kullanarak çözmeye çalıştım. Kod, gerekeni yapar ama kaynak dosyasında sağlanan veri miktarı için yeterince verimli değildir.
Tüm dosyaları belleğe yüklediğinden, büyük veri kümeleri için readlines() veya read() işlevinin kullanılmaması gerektiğini biliyorum. Bununla birlikte, dosya satırını okuyarak, 10 kelimeyi hedef kelimeden önce ve sonra almak için numaralandırma yöntemini kullanmadım. Ayrıca, bu dosyada kullanma iznim olmadığı için mmap kullanamıyorum.
Yani, bazı boyut sınırlamaları olan readlines yönteminin en verimli çözüm olacağını düşünüyorum. Bununla birlikte, bunun için kod, sadece sözcük kırılırken, hedef kelimenin yakalanmayacağı 10 kelimeden sonuna kadar geçen süre kadar, bazı hatalar yapmaz mıyım? o çıkarılan tüm bilgilerin dışarı çok boyutlu bir sözlük yaratır ve sonra bir csv dosyası yazar bir fonksiyonun bir parçası olarak
def get_target_to_dict(file):
targets_dict = {}
with open(file) as f:
for line in f:
targets_dict[line.strip()] = {}
return targets_dict
targets_dict = get_target_to_dict('targets_uniq.txt')
# browse directory and process each file
# find the target words to include the 10 words before and after to the dictionary
# exclude lines starting with <,-,; to just have raw text
def get_co_occurence(path_file_dir, targets, results):
lines = []
for file in os.listdir(path_file_dir):
if file.startswith('corpus'):
path_file = os.path.join(path_file_dir, file)
with gzip.open(path_file) as corpusfile:
# PROBLEMATIC CODE HERE
# lines = corpusfile.readlines()
for line in corpusfile:
if re.match('[A-Z]|[a-z]', line):
if '(unknown)' in line:
continue
elif '\\' in line:
continue
elif '&' in line:
continue
lines.append(line)
for i, line in enumerate(lines):
line = line.strip()
if re.match('[A-Z][a-z]', line):
parts = line.split('\t')
lemma = parts[2]
if lemma in targets:
pos = parts[1]
if pos not in targets[lemma]:
targets[lemma][pos] = {}
counts = targets[lemma][pos]
context = []
# look at 10 previous lines
for j in range(max(0, i-10), i):
context.append(lines[j])
# look at the next 10 lines
for j in range(i+1, min(i+11, len(lines))):
context.append(lines[j])
# END OF PROBLEMATIC CODE
for context_line in context:
context_line = context_line.strip()
parts_context = context_line.split('\t')
context_lemma = parts_context[2]
if context_lemma not in counts:
counts[context_lemma] = {}
context_pos = parts_context[1]
if context_pos not in counts[context_lemma]:
counts[context_lemma][context_pos] = 0
counts[context_lemma][context_pos] += 1
csvwriter = csv.writer(results, delimiter='\t')
for k,v in targets.iteritems():
for k2,v2 in v.iteritems():
for k3,v3 in v2.iteritems():
for k4,v4 in v3.iteritems():
csvwriter.writerow([str(k), str(k2), str(k3), str(k4), str(v4)])
#print(str(k) + "\t" + str(k2) + "\t" + str(k3) + "\t" + str(k4) + "\t" + str(v4))
results = open('results_corpus.csv', 'wb')
word_occurrence = get_co_occurence(path_file_dir, targets_dict, results)
Ben bütünlük adına kod bütün bölümünü kopyaladı.
Gerçekten bu kod daha verimli hale getirmek için herhangi bir ipucu veya öneri takdir ediyorum. Benim fikrim 10 satır ve sonrasında saklamak için başka tampon önce saklamak için bir tampon oluşturmaktı
"map", "filter", "groupby" ve "islice" –
'u verimli bir şekilde kullanarak yapabilirsiniz. Teşekkürler, bunu okudum ve çok verimli görünüyor. Yukarıdaki kodla ilgili biraz daha detaylandırır mısınız? 'Map' kullanmak için, kesinlikle listelemek için corpusfile'a ihtiyacım var, değil mi? –
Sütunda 10 kelime veya 10 kelime daha buluyor musunuz? –