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 у
Символ _ добавляется самой библиотекой вместо пробелов (об этом более подробно сказано в доке).
Бросается в глаза вносимая такой токенизацией дополнительная "полисемия" токенов, например _кот является частью таких слов, как "кот" и "котлета". К сожалению, это еще немного снизит интерпретируемость моделей.