Как SentencePiece токенизирует русскоязычный текст

Jan 07, 2019 18:41

SentencePiece - питоновская библиотека для unsupervised tokenization. Для японского и и китайского, видимо, является очень хорошей альтернативой токенизаторам с handcrafted rules (типа MeCab, который и я когда-то использовал). А для английского языка дает в нейросетевых моделях (гугловский трансформер и BERT) такую приятную вещь, как заранее фиксированный размер словаря.

А как выглядит результат токенизации для русскоязычного текста, учитывая темную сторону русского языка - слишком богатое словоизменение? Далее - краткие результаты эксперимента.

1. Модель обучалась на части моего 120Гб корпуса текстов. На 64 Гб оперативки удалось обучаться примерно на 40 млн предложений. Обучение выполнялось командой:

spm_train --input=/home/inkoziev/Corpus/word2vector/ru/w2v.ru.corpus.txt --model_prefix=ru_raw --vocab_size=20000 --input_sentence_size=40000000 --character_coverage=1.0 --num_threads=8 --model_type=bpe

Параметры подробно описаны на странице библиотеки, в частности размер словаря задается как --vocab_size=20000, а --model_type=bpe определяет алгоритм сегментации.

2. Вывод результатов токенизации делаю с помощью простого кода, который ожидает ввода разбираемого предложения с консоли:

import sys
import sentencepiece as spm

sp = spm.SentencePieceProcessor()
rc = sp.Load("/home/inkoziev/github/sentencepiece/ru_raw.model")
print('SentencePiece model loaded with status={}'.format(rc))

while True:
text = raw_input(':> ').decode(sys.stdout.encoding).strip().lower()
px = sp.EncodeAsPieces(text)
print('{} pieces:'.format(len(px)))
for i, p in enumerate(px):
print(u'{:<2d} {}'.format(i, p))
print('\n\n')

3. Результаты:

:> голодная черная кошка резво ловит серую мышку
15 pieces:
0  ▁голо
1  д
2  ная
3  ▁чер
4  ная
5  ▁ко
6  шка
7  ▁рез
8  во
9  ▁ло
10 вит
11 ▁сер
12 ую
13 ▁мы
14 шку

:> миша ест котлету
7 pieces:
0  ▁ми
1  ша
2  ▁е
3  ст
4  ▁кот
5  лет
6  у

:> голодный кот резво ловит мышку
9 pieces:
0  ▁голо
1  дный
2  ▁кот
3  ▁рез
4  во
5  ▁ло
6  вит
7  ▁мы
8  шку

:> тощий голодный кот жадно ест котлету
12 pieces:
0  ▁то
1  щий
2  ▁голо
3  дный
4  ▁кот
5  ▁жа
6  дно
7  ▁е
8  ст
9  ▁кот
10 лет
11 у

Символ _ добавляется самой библиотекой вместо пробелов (об этом более подробно сказано в доке).

Бросается в глаза вносимая такой токенизацией дополнительная "полисемия" токенов, например _кот является частью таких слов, как "кот" и "котлета". К сожалению, это еще немного снизит интерпретируемость моделей.

unsupervised feature learning, nlp, sentencepiece

Previous post Next post
Up