- Как параметризуются тексты
- Как формируется словарь
- Параметризация с помощью bag of words
- Параметризация с помощью embedding
- Какие сети используются для обработки текста
- Принцип работы keras’овского токенайзера
- Пример на разбор с изменением размерности
Нейросети работают с цифровыми представлениями объектов, поэтому перед подачей на вход нейросети текст необходимо превратить в числовое представление, для этого существует несколько способов. Один из способов это разбиение текста на отдельные слова – токенизация. Затем слова сопоставляют с числами в соответствии с частотой встречания слова в тексте. Чем чаще встречается слово в тексте тем меньший индекс ему соответствует. Обычно счет начинается с двойки, единице соответствуют все незнакомые слова.
BOW – сумка со словами. При этом способе фраза разбивается на отдельные составляющие части фиксированной длины и представляется в виде вектора заданной длины, размер которого задается параметров max_ words – индекс максимального слова, который будет анализироваться,
при этом все слова, у которых индексы больше max_words, заменяются на индекс 1. В результате у нас получается вектор длины max_words из
0 и 1 (0 – там, где нет слов, и 1 – на месте индекса встречающего слова). Следует принять во внимание, что в данном подходе однокоренные
слова являются разными словами, например, ходить – приходить – уходить, это три разных слова. В случае, если их надо привести к нормальной форме, есть библиотека pymorphy. Например, «люди -> человек» или «гулял -> гулять». Прежде чем представлять в форме BOW, надо привести весь текст к нормальной форме, а потом уже конвертировать в BOW.
Embedding
Еще одним из способов предобработки текста для использования в сети является Embedding. Embedding – это представление текста в n-мерной
форме. В библиотеке Keras для представления в формате Embedding есть уже готовый слой, например,
model.add (Embedding (1000, 64, input_length=10)), где
input_dim = 1000 – размер словаря, т. е. максимальный целочисленный
индекс в входном векторе + 1 (max_words в BOW),
output_dim = 64 – размер плотного embedding-а,
input_length = 10 – длина входных последовательностей.
Для обработки текста используются полносвязные нейросети, рукуррентные нейросети, сети с одномерной сверткой, трансформеры и д
В Keras существует встроенный класс Tokenizer (https://ru-keras.com/text-preprocessing/). Этот класс позволяет выполнить векторизацию текстовых данных, превращая каждый элемент текста либо в последовательность целых чисел (где каждое целое число является индексом токена (лексемы) в словаре), либо в вектор, в котором значение каждого токена может быть бинарным, либо представлено на основании метода “мешка слов”, либо на основании метода tf-idf…
В общем виде:
Tokenizer(
num_words=None,
filters=’!»#$%&()*+,-./:;<=>?@[\\]^_
{ |}~\t\n’,
lower=True,
split=’ ‘,
char_level=False,
oov_token=None,
document_count=0),
где
num_words: максимальное количество слов, для которых нужно провести токенизацию, основываясь на частоте слов в тексте. Будут
переведены в токены только самые распространенные слова в количестве num_words-1.
filters: строка, содержащая символы, которые будут исключены из текста. По умолчанию используются все символы пунктуации, плюс
символы табуляции и разрыва строки, но исключая символ ‘ (одиночный апостроф).
lower: логическое значение. Следует ли приводить текст к нижнему регистру.
split: строка. Символ, по которому будет происходить разделение слов в тексте.
char_level: если указано значение True, тогда каждый символ будет рассматриваться как токен.
oov_token: (Out-Of-Vocabulary - Вне словарного запаса) если передан этот параметр, то он будет добавлен в word_index и использован
для замены слов, не входящих в словарь, во время вызовов text_to_sequence.
По умолчанию вся пунктуация удаляется и текст превращается в последовательности слов, разделенные пробелами (слова могут включать символ ‘ - одиночный апостроф). Затем эти последовательности разбиваются на списки из токенов. Потом они будут индексированы или векторизованы.
0 - это зарезервированный индекс, который не будет присвоен ни одному слову.
Максимальное количество слов, которое будем учитывать,
maxWordsCount = 20 000. Создадим экземпляр класса:
tokenizer = Tokenizer(
num_words=maxWordsCount, filters=’!”#$%&()*+,-–—./...:;<=>?@
[\\]^_
{|}~«»\t\n\xa0\ufeff’,lower=True,
split=’ ‘,
oov_token=’unknown’,
char_level=False)
Таким образом, из исходного текста будут удалены все символы !”#$%&()*+,-–—./…:;<=>?@[\\]^_`{|}~«»\t\n\xa0\ufeff, все слова будут
приведены к нижнему регистру, в качестве разделителя слов – пробел. Для того чтобы собрать словарь частотности в классе Tokenizer, есть
метод .fit_on_texts(), который на вход принимает текст, на выходе – словарь: «слово – индекс» Соберем словарь частотности для текстов наших писателей, для этого подадим тексты из обучающей выборки:
tokenizer.fit_on_texts(trainText)
Для того чтобы посмотреть, какие индексы у слов, воспользуемся методом .word_index, который объект класса преобразует в словарь, и методом словаря .items(), который возвращает кортеж пары ключ- значение типа dict_items, который не индексируется, для того, чтобы можно было обращаться к элементам по индексу, необходимо преобразовать в список:
items = list(tokenizer.word_index.items())
посмотрим часто встречающиеся слова:
print(items[-10:])
выведет:
[(‘поджарьте’, 133061), (‘заполните’, 133062), (‘мучающие’, 133063),
(‘погремушкой’, 133064), (‘свистком’, 133065), (‘потерян’, 133066),
(‘расплывающиеся’, 133067), (‘миллионе’, 133068), (‘зияющая’, 133069),
(‘ничтонавстречу’, 133070)]
Теперь необходимо преобразовать текст в набор индексов вместо слов, согласно созданному нами частотному словарю, для этого воспользуемся встроенным методом класса .texts_to_sequences, который принимает на вход текст, а возвращает список индексов слов (т. к. в выборке у нас тексты хранились в списке для каждого писателя, то получим список списков:
trainWordIndexes = tokenizer.texts_to_sequences(trainText)
testWordIndexes = tokenizer.texts_to_sequences(testText)
Чтобы наши тексты (индексы слов) обучающей и тестовой выборки нарезать на куски и сформировать обучающий набор (xTrain – двумерный
массив, список фиксированного размера), состоящий из индексов слов (yTrain – номер класса в форме one-hot-encoding) и проверочной
выборки, необходимы вспомогательные функции.
https://colab.research.google.com/drive/1WKdSiixsbHeoospcKo3t5PY0Up8V-zgl – токенайзер