#python #nlp #data-analysis
#python #nlp #анализ данных
Вопрос:
Я провожу анализ текстового корпуса, содержащего около 135 тыс. документов (по несколько страниц на документ), и словарного запаса примерно в 800 тыс. слов. Я заметил, что примерно половина словарного запаса — это слова с частотой 1 или 2, поэтому я хочу их удалить.
Итак, я запускаю что-то вроде этого:
remove_indices = np.array(index_df[index_df['frequency'] <= 2]['index']).astype(int)
for file_name in tqdm(corpus):
content = corpus[file_name].astype(int)
content = [index for index in content if index not in remove_indices]
corpus[file_name] = np.array(content).astype(np.uint32)
Где corpus
выглядит примерно так:
{
'filename1.txt': np.array([43, 177718, 3817, ...., 28181]).astype(np.uint32),
'filename2.txt': ....
}
и каждое слово было предварительно закодировано с положительным целочисленным индексом.
Проблема заключается в том, content = [index for index in content if index not in remove_indices]
что необходимо проходить len(remove_indices) * len(content)
ряд проверок с каждой итерацией. Это заняло бы вечность (tqdm сообщает мне более 100 часов). Есть какие-нибудь советы о том, как ускорить это?
Что я пробовал до сих пор
- Пользуясь тем фактом, что если слова имеют только частоту 1 или 2, мы можем удалить их из
remove_indices
после того, как они были удалены из корпуса. Все еще занимает вечность…
Ответ №1:
Вы могли бы использовать numpy.isin()
метод https://numpy.org/devdocs/reference/generated/numpy.isin.html вместо понимания этого списка.
В качестве альтернативы вы могли бы создать set
из существующих слов / индексов. Тогда эта in
операция будет представлять собой O (1) вместо O (n) (где n — длина массива).
Комментарии:
1. Удивительно, что это за колдовство? Любые ресурсы о том, как это работает математически?
2. Я на самом деле изменяю ответ, я считаю, что numpy.isin является предпочтительным решением. О временной сложности набора / списка см., например, wiki. python.org/moin/TimeComplexity , более общий en.wikipedia.org/wiki/Best,_worst_and_average_case (python
set
— это разновидность хэш-таблицы.)