Токенизация слов при помощи nltk и keras

Токенизация слов при помощи nltk и keras

Не секрет, что современные компьютеры далеки от понимания человеческих слов в привычном для нас смысле. Человеческий мозг способен мыслить словами, излагать их на бумагу и даже переводить с одного языка на другой. Компьютеры же «перешептываются» друг с другом числами. Поэтому прежде, чем компьютер сможет оценить наше текстовое творение, это творение нужно перевести в числовое представление. Для этого необходимо разбить текст на более мелкие части, токены, чтобы в дальнейшем присвоить каждому токену индивидуальный код. Именно этот процесс — процесс разбиения текста на более мелкие части, называется токенизацией. Однако, насколько мелкими должны быть части разбиения? Давайте рассмотрим возможные варианты токенизации текста:

  1. Можно считать токеном целое предложение
  2. Или разбить это предложение на пересекающиеся словосочетания. Тогда для предложения: «Это кот съел все конфеты» набор токенов будет выглядеть так: «это кот», «кот съел», «съел все», «все конфеты»
  3. Или же — разбить предложение на буквы и закодировать каждую букву отдельно, однако, в этом случае слова «ток» и «кот» будут состоять из одинакового набора токенов, что не всегда удобно..
  4. А можно считать токеном целое слово!

Каждый из рассмотренных вариантов имеет место быть для определенного круга задач. Однако, на сегодняшний день, наиболее используемым способом является токенизация слов. Рассмотрим токенизацию слов в Python при помощи библиотек nltk и keras:

Токенизация слов при помощи библиотеки nltk

(Для реализации этого кода необходимо установить библиотеку nltk.)

Сначала рассмотрим код:

# Импортируем метод word_tokenize из библиотеки nltk
from nltk.tokenize import word_tokenize 

# Определяем текстовую переменную
text = "Это кот съел все конфеты! Одежду разбросал тоже кот"

# Токенизируем текст
tokenized_text = word_tokenize(text)
print(tokenized_text)

В результате выполнения кода, получим результат:

['Это', 'кот', 'съел', 'все', 'конфеты', '!', 'Одежду', 'разбросал', 'тоже', 'кот']

А теперь подробности:

Прежде всего, импортируем метод word_tokenize из библиотеки nltk. После определения текстовой переменной text, вызываем функцию word_tokenize(text), которая разбивает копию переменной text на токены и возвращает результат разбиения.

Токенизация при помощи библиотеки Keras

Работающий код (подробные пояснения см. ниже):

# Импортируем библиотеки tensorflow и keras, а также класс Tokenizer
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer

# Определяем текст
text = ["Это кот съел все конфеты!", "Одежду разбросал тоже кот"]

# Создаем экземпляр токенизатора 
tokenizer = Tokenizer(num_words=100)
# Токенайзер обновляет словарь токенов в соответствии с частотой вхождения слов.
tokenizer.fit_on_texts(text)

# Выведем список всех слов в словаре
word_indexes = tokenizer.word_index
print(word_indexes)

# Выведем числовое представление текста
sequences = tokenizer.texts_to_sequences(text)
print(sequences)

В результате работы, скрипт выведет на экран список всех слов в словаре word_indexes:

{'кот': 1, 'это': 2, 'съел': 3, 'все': 4, 'конфеты': 5, 'одежду': 6, 'разбросал': 7, 'тоже': 8}

И числовые последовательности, представляющие текст sequences:

[[2, 1, 3, 4, 5], [6, 7, 8, 1]]

Пояснения к коду:

1. Импортируем библиотеки tensorflow и keras, а также класс библиотеки keras — Tokenizer, который позволяет токенизировать текст:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer

2. В переменной text сохраняем подлежащий токенизации текст в виде списка:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer

text = ["Это кот съел все конфеты!", "Одежду разбросал тоже кот"]

3. Создаем экземпляр токенизатора tokenizer. В качестве аргумента передадим параметр num_words, содержащий максимальное количество слов в словаре токенайзера. В нашем случае num_words=100. Если в подлежащем токенизации тексте окажется больше сотни слов, то в словарь будут помещены 100 слов, которые встречаются в тексте чаще остальных:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
text = ["Это кот съел все конфеты!", "Одежду разбросал тоже кот"]

tokenizer = Tokenizer(num_words=100)

4. Применим к экземпляру токенайзера метод fit_on_texts(), а в качестве аргумента передадим переменную с текстом text. Это позволит токенайзеру обойти весь текст и обновить словарь токенов в соответствии с частотой вхождения слов, так, чтобы наиболее популярные слова в тексте получили наименьшие индексы. Например, в предложении: «А за окном то снег, то дождь», у частицы «то» будет нулевой индекс, то есть word_index[‘то’] = 0:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer

text = ["Это кот съел все конфеты!", "Одежду разбросал тоже кот"]
tokenizer = Tokenizer(num_words=100)

tokenizer.fit_on_texts(text)

5. Для того, чтобы вывести полный список слов, находящихся в словаре токенизатора, обратимся к свойству «word_index«:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer

text = ["Это кот съел все конфеты!", "Одежду разбросал тоже кот"]
tokenizer = Tokenizer(num_words=100)
tokenizer.fit_on_texts(text)

word_indexes = tokenizer.word_index
print(word_indexes)

Результат работы кода:

{'кот': 1, 'это': 2, 'съел': 3, 'все': 4, 'конфеты': 5, 'одежду': 6, 'разбросал': 7, 'тоже': 8}

Обратите внимание, что в нашем тексте «Это кот съел все конфеты! Одежду разбросал тоже кот» слово «кот» встречается дважды, остальные слова по одному разу. Поэтому слово «кот», как наиболее популярное, находится первым в словаре.

6. Слова помещены в словарь! Осталось вывести числовые последовательности, которые представляют наш текст в компьютерном мире. Сделать это можно с помощью метода texts_to_sequences:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer

text = ["Это кот съел все конфеты!", "Одежду разбросал тоже кот"]
tokenizer = Tokenizer(num_words=100)
tokenizer.fit_on_texts(text)
word_indexes = tokenizer.word_index
print(word_indexes)

sequences = tokenizer.texts_to_sequences(text)
print(sequences)

Вывод на экран:

[[2, 1, 3, 4, 5], [6, 7, 8, 1]]

Обратите внимание, что результат получен в виде тензора, в который упакованы 2 матрицы, соответствующие рассматриваемым двум предложениям «Это кот съел все конфеты! Одежду разбросал тоже кот». Проверим, верен ли вывод! В соответствии со словарем токенизатора, полученным в пункте 5, слово «кот» имеет числовой код «1». В первой матрице «1» занимает 2-ю позицию,как и слово «кот» в предложении «Это кот съел все конфеты!». Во втором предложении «Одежду разбросал тоже кот» популярный кот-хулиган упоминается последним, как и числовой код «1» во второй матрице. Аналогичным образом можно убедиться в соответствии позиций словесных и числовых значений каждого слова из словаря токенизатора.

1 комментарий

Добавить комментарий