Итерация по массиву Numpy для приложения NLP - PullRequest
0 голосов
/ 24 октября 2019

У меня есть модель Word2Vec, которую я создаю, в которой у меня имеется список слов ~ 30 тыс. Слов. У меня есть список предложений (фразе_лист) размером около 150к. Я пытаюсь удалить токены (слова) из предложений, которые не были включены в vocab_list. Задача казалась простой, но вложение в циклы и перераспределение памяти выполняется медленно с использованием приведенного ниже кода. Эта задача заняла ок. 1 час, чтобы бежать, поэтому я не хочу повторять это.

Есть ли более чистый способ попробовать это?

import numpy as np
from datetime import datetime

start=datetime.now()
timing=[]
result=[]
counter=0
for sent in sentences_list:
    counter+=1
    if counter %1000==0 or counter==1:
        print(counter, 'row of', len(sentences_list), ' Elapsed time: ', datetime.now()-start)
        timing.append([counter, datetime.now()-start])
    final_tokens=[]
    for token in sent:
        if token in vocab_list:
            final_tokens.append(token)
    #if len(final_tokens)>0:
    result.append(final_tokens)
print(counter, 'row of', len(sentences_list),' Elapsed time: ', datetime.now()-start)
timing.append([counter, datetime.now()-start])
sentences=result
del result
timing=pd.DataFrame(timing, columns=['Counter', 'Elapsed_Time'])

1 Ответ

1 голос
/ 24 октября 2019

Обратите внимание, что типичные реализации word2vec (такие как оригинальные word2vec.c или gensim * от Google) часто просто игнорируют слова в своем вводе, которые не являются частью их установленного словаря (как указано vocab_list или применяются черезmin_count). Таким образом, вам может не потребоваться выполнять эту фильтрацию вообще.

Использование более идиоматического понимания списков Python может заметно быстрее (и, безусловно, будет более компактным). Ваш код может быть просто:

filtered_sentences = [ 
    [word for word in sent if word in vocab_list] 
    for sent in sentences_list
]
...