На этом шаге мы рассмотрим пример формирования "мешка слов".
Модель "мешка слов" реализована в классе CountVectorizer, который выполняет соответствующее преобразование. Давайте сначала применим CountVectorizer к синтетическому набору данных, состоящему из двух примеров, чтобы проиллюстрировать его работу:
[In 7]: bards_words = ["The fool doth think he is wise,", "but the wise man knows himself to be a fool"]
Мы импортируем класс CountVectorizer, создам экземпляр класса и подгоняем модель к нашим синтетическим данным следующим образом:
[In 8]: from sklearn.feature_extraction.text import CountVectorizer vect = CountVectorizer() vect.fit(bards_words)
Процесс подгонки CountVectorizer включает в себя токенизацию обучающих данных и построение словаря, к которому мы можем получить доступ с помощью атрибута vocabulary_:
[In 9]: print("Размер словаря: {}".format(len(vect.vocabulary_))) print("Содержимое словаря:\n {}".format(vect.vocabulary_)) Размер словаря: 13 Содержимое словаря: {'the': 9, 'fool': 3, 'doth': 2, 'think': 10, 'he': 4, 'is': 6, 'wise': 12, 'but': 1, 'man': 8, 'knows': 7, 'himself': 5, 'to': 11, 'be': 0}
Словарь состоит из 13 слов, начинается со слова "be" и заканчивается словом "wise".
Чтобы получить представление "мешок слов" для обучающих данных, мы вызываем метод transform():
[In 10]: bag_of_words = vect.transform(bards_words) print("bag_of_words: {}".format(repr(bag_of_words))) bag_of_words: <2x13 sparse matrix of type '<class 'numpy.int64'>' with 16 stored elements in Compressed Sparse Row format>
Представление "мешок слов" записывается в разреженной матрице SciPy, которая хранит только ненулевые элементы (см. 11 шаг). Матрица имеет форму 2x13, в ней каждая строка соответствует точке данных, а каждый столбец (признак) соответствуют слову, записанному в словаре. Использование разреженной матрицы обусловлено тем, что документы, как правило, содержат лишь небольшое количество слов, записываемое в словарь, таким образом, большая часть элементов массива будет равна 0. Подумайте о том, сколько различных слов может встретиться в киноотзыве, учитывая словарный запас английского языка. Хранение всех этих нулей - ненужные затраты памяти. Чтобы взглянуть на фактическое содержимое разреженной матрицы, мы можем преобразовать ее в "плотный" массив NumPy (который помимо ненулевых элементов также хранит все нулевые элементы) с помощью метода toarray():
[In 11]: print("Плотное представление bag_of_words:\n{}".format( bag_of_words.toarray())) Плотное представление bag_of_words: [[0 0 1 1 1 0 1 0 0 1 1 0 1] [1 1 0 1 0 1 0 1 1 1 0 1 1]]
Видно, что частоты слов равны либо 0, либо 1. Ни одна из двух строк массива bards_words не содержит слов, которые встречались бы дважды. Давайте разберемся, как нужно работать с этими векторами признаков.
Первая строка ("The fool doth think he is wise") соответствует первому ряду элементов, и слово "be", записанное в словаре первым, встречается в ней ноль раз. Второе слово "but" тоже встречается в этой строке ноль раз. Третье слово "doth" встречается один раз. Взглянув на оба ряда, мы можем увидеть, что четвертое слово "fool", десятое слово "the" и тринадцатое слово "wise" встречаются в обеих строках.
На следующем шаге мы рассмотрим модель "мешка слов" для киноотзывов.