
Не секрет, что современные компьютеры далеки от понимания человеческих слов в привычном для нас смысле. Человеческий мозг способен мыслить словами, излагать их на бумагу и даже переводить с одного языка на другой. Компьютеры же «перешептываются» друг с другом числами. Поэтому прежде, чем компьютер сможет оценить наше текстовое творение, это творение нужно перевести в числовое представление. Для этого необходимо разбить текст на более мелкие части, токены, чтобы в дальнейшем присвоить каждому токену индивидуальный код. Именно этот процесс — процесс разбиения текста на более мелкие части, называется токенизацией. Однако, насколько мелкими должны быть части разбиения? Давайте рассмотрим возможные варианты токенизации текста:
- Можно считать токеном целое предложение
- Или разбить это предложение на пересекающиеся словосочетания. Тогда для предложения: «Это кот съел все конфеты» набор токенов будет выглядеть так: «это кот», «кот съел», «съел все», «все конфеты»
- Или же — разбить предложение на буквы и закодировать каждую букву отдельно, однако, в этом случае слова «ток» и «кот» будут состоять из одинакового набора токенов, что не всегда удобно..
- А можно считать токеном целое слово!
Каждый из рассмотренных вариантов имеет место быть для определенного круга задач. Однако, на сегодняшний день, наиболее используемым способом является токенизация слов. Рассмотрим токенизацию слов в 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» во второй матрице. Аналогичным образом можно убедиться в соответствии позиций словесных и числовых значений каждого слова из словаря токенизатора.
Спасибо . Очень мне помогли .