Шаг 184.
Введение в машинное обучение с использованием Python. Работа с текстовыми данными. ... . Применение модели "мешка слов" к синтетическому набору данных

    На этом шаге мы рассмотрим пример формирования "мешка слов".

    Модель "мешка слов" реализована в классе 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():


Это возможно благодаря тому, что мы используем небольшой синтетический набор данных, который содержит лишь 13 слов. Если бы мы взяли реальный набор данных, то получили бы исключение MemoryError.
[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" встречаются в обеих строках.

    На следующем шаге мы рассмотрим модель "мешка слов" для киноотзывов.




Предыдущий шаг Содержание Следующий шаг