Python: как преобразовать список количества слов в формат, подходящий для CountVectorizer

У меня есть ~ 100 000 списков строк в форме:
['the: 652', 'of: 216', 'in: 168', 'to: 159', 'is: 145'] и т. Д., Которые по сути составляют мой корпус. Каждый список содержит слова из документа и их количество слов.

Как мне преобразовать этот корпус в форму, которую я могу передать в CountVectorizer?

Есть ли более быстрый способ, чем превращение каждого списка в строку, содержащую «652 раза» из «216 раз» и т. Д.?


person Unstack    schedule 16.09.2017    source источник


Ответы (1)


Предполагая, что вы пытаетесь достичь векторизованного корпуса в формате разреженной матрицы вместе с обученным векторизатором, вы можете моделировать процесс векторизации без повторения данных:

from scipy.sparse.lil import lil_matrix
from sklearn.feature_extraction.text import CountVectorizer

corpus = [['the: 652', 'of: 216', 'in: 168', 'to: 159', 'is: 145'],
          ['king: 20', 'of: 16', 'the: 400', 'jungle: 110']]


# Prepare a vocabulary for the vectorizer
vocabulary = {item.split(':')[0] for document in corpus for item in document}
indexed_vocabulary = {term: index for index, term in enumerate(vocabulary)}
vectorizer = CountVectorizer(vocabulary=indexed_vocabulary)

# Vectorize the corpus using the coordinates known to the vectorizer
X = lil_matrix((len(corpus), len(vocabulary)))
X.data = [[int(item.split(':')[1]) for item in document] for document in corpus]
X.rows = [[vectorizer.vocabulary[(item.split(':')[0])] for item in document]
          for document in corpus]

# Convert the matrix to csr format to be compatible with vectorizer.transform output
X = X.tocsr()

В этом примере вывод будет:

[[ 168.  216.    0.  159.  652.  145.    0.]
 [   0.   16.  110.    0.  400.    0.   20.]]

Это может позволить дальнейшую векторизацию документов:

vectorizer.transform(['jungle kid is programming', 'the jungle machine learning jungle'])

Что дает:

[[0 0 1 0 0 1 0]
 [0 0 2 0 1 0 0]]
person Elisha    schedule 16.09.2017
comment
И если бы я хотел удалить стоп-слова во время этого процесса, было бы лучше сделать это до создания словаря или после? - person Unstack; 16.09.2017
comment
Это немного сложно, поскольку векторизация корпуса не выполняется в векторизаторе. Я могу придумать простой способ - предоставить конструктору векторизатора stop_words. Позже, при построении data и rows, добавьте фильтр к стоп-словам векторизатора (vectorizer.get_stop_words()). Этот метод поддерживает быстрый процесс векторизации и поддерживает преобразование документов в будущем. - person Elisha; 16.09.2017