Я думаю, что наиболее эффективный способ - циклически проходить термины каждого документа, получать положение термина в (отсортированном) корпусе и соответственно устанавливать бит.
Сортированный список терминов корпуса можно сохранитьв качестве словаря с term -> index
отображением (в основном инвертированный индекс ).
Вы можете создать его так:
corpus = dict(((term, index) for index, term in enumerate(sorted(all_words))))
Для каждогодокумент, который вы должны создать список 0
как вектор объектов:
num_words = len(corpus)
fvs = [[0]*num_words for _ in docs]
Тогда построение векторов объектов будет:
for i, doc_terms in enumerate(docs):
fv = fvs[i]
for term in doc_terms:
fv[corpus[term]] += 1
В заголовке нетпроверяя членство, вам просто нужно пройтись по всем условиям всех документов.
При всем этом, в зависимости от размера корпуса, вы должны взглянуть на numpy и scipy .Вероятно, у вас возникнут проблемы с памятью, и scipy предоставит специальные типы данных для разреженных матриц (вместо использования списка списков), которые могут сэкономить много памяти.
Вы можете использовать тот же подход, как показано выше, но вместо добавления чисел к элементам списка вы добавляете его к элементам матрицы (например, строки будут документами, а столбцы - терминами корпуса).
Вы также можете использовать некоторые матричные операции, предоставляемые numpy, если вы хотите применить локальные или глобальные весовые схемы.
Надеюсь, это поможет вам начать:)