Как эффективно удалять элементы одного массива из другого

#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 — это разновидность хэш-таблицы.)