?

Log in

No account? Create an account

Компьютерная лингвистика

Новостная лента www.solarix.ru

Previous Entry Share Next Entry
Как SentencePiece токенизирует русскоязычный текст
kelijah
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  ст
▁кот
5  лет
6  у

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


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


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

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

  • 1
Он компрессор, поэтому меньший размер словаря заставляет его искать некую модель, а если словарь больше некоего критического размера, то поиска модели вообще не происходит.

Я собственно и предлагаю проследить эволюцию содержания словаря в PCA пространстве, скорее всего там будет какой то качественный скачок (а то и не один) на определенном этапе увеличения давления на алгоритм.

PS Может если выкинуть пробелы получиться меньше 8000 словарь.

Edited at 2019-01-10 01:09 pm (UTC)

>Он компрессор, поэтому меньший размер словаря заставляет его искать некую модель

Угу, идею понял. Да, в этом есть разумное зерно.

  • 1