Как сделать мой код Python более эффективным в вычислительном отношении - PullRequest
0 голосов
/ 12 октября 2019

Я работаю над проектом по поиску информации, где мне нужно обработать текстовые данные размером ~ 1,5 ГБ и создать словарь (слова, частота документа) и список публикаций (идентификатор документа, частота слова). По словам профессора, это должно занять около 10-15 минут. Но мой код работает уже более 8 часов! Я попробовал меньший набор данных (~ 35 МБ), и на его обработку ушло 5 часов.

Я новичок в python и думаю, что это занимает много времени, потому что я создал много словарей и списков python в своем коде,Я пытался использовать генератор, но я не уверен, как с ним работать.

file = open(filename, 'rt')
text = file.read()
file.close()

p = r'<P ID=\d+>.*?</P>' 
tag = RegexpTokenizer(p)
passage = tag.tokenize(text)
doc_re = re.compile(r"<P ID=(\d+)>")

def process_data(docu):
    tokens = RegexpTokenizer(r'\w+')    
    lower_tokens = [word.lower() for word in tokens.tokenize(docu)]     
    table = str.maketrans('','', string.punctuation)
    stripped = [w.translate(table) for w in lower_tokens] 
    alpha = [word for word in stripped if word.isalpha()]   
    stopwordlist = stopwords.words('english')
    stopped = [w for w in alpha if not w in stopwordlist]

    return stopped

data = {}
for doc in passage:
    group_docID = doc_re.match(doc)
    docID = group_docID.group(1)
    tokens = process_data(doc)
    data[docID] = list(set(tokens))

vocab = [item for i in data.values() for item in i]
total_vocab = list(set(vocab))
total_vocab.sort()
print('Document Size = ', len(data))
print('Collection Size = ', len(vocab)) 
print('Vocabulary Size= ', len(total_vocab)) 


inv_index = {} 
for x in total_vocab:
    for y, z in data.items():
        if x in z:
            wordfreq = z.count(x)
            inv_index.setdefault(x, []).append((int(y), wordfreq)) 

flattend = [item for tag in inv_index.values() for item in tag] 
posting = [item  for tag in flattend for item in tag ] 


doc_freq=[]
for k,v in inv_index.items():
    freq1=len([item for item in v if item])
    doc_freq.append((freq1))

#offset value of each vocabulary/words
offset = []
offset1=0
for i in range(len(doc_freq)):
    if i>0:
        offset1 =offset1 + (doc_freq[i-1]*2)
    offset.append((offset1))

#create dcitionary of words, document frequency and offset
dictionary = {}
for i in range(len(total_vocab)):
    dictionary[total_vocab[i]]=(doc_freq[i],offset[i])

#dictionary of word, inverse document frequency
idf = {}
for i in range(len(dictionary)):
    a = np.log2(len(data)/doc_freq[i])
    idf[total_vocab[i]] = a

with open('dictionary.json', 'w') as f:
    json.dump(dictionary,f)

with open('idf.json', 'w') as f:
    json.dump(idf, f)

binary_file = open('binary_file.txt', 'wb')

for i in range(0, len(posting)):
    binary_int = (posting[i]).to_bytes(4, byteorder = 'big')
    binary_file.write(binary_int)

binary_file.close()

Может ли кто-нибудь помочь мне переписать этот код, чтобы он стал более вычислительным и эффективным по времени?

...