SentencePiece — это независимый от меток токенизатор и де-токенизатор текста, главным образом для систем генерации текста на основе нейронных сетей, где размер словаря заранее определяется до обучения модели. SentencePiece реализует подсловарные единицы (например, byte-pair encoding (BPE) [Sennrich et al.]) и единичную языковую модель [Kudo.] с расширением прямого обучения из сырых предложений. SentencePiece позволяет создавать полностью конечную систему, которая не зависит от специфических для языка предварительной/постобработки.Это не официальный продукт Google.
Обратите внимание, что алгоритм BPE, используемый в WordPiece, немного отличается от оригинального BPE.
SentencePiece — это реинкарнация подсловных единиц, эффективного способа решения проблем открытого словаря в нейронном машинном переводе. SentencePiece поддерживает два метода сегментации: byte-pair encoding (BPE) [Sennrich et al.] и uni-gram language model [Kudo.]. Вот основные различия по сравнению с другими реализациями.#### Количество уникальных токенов заранее определено Модели нейронного машинного перевода обычно работают с фиксированным словарием. В отличие от большинства алгоритмов автоматического деления слов, которые предполагают бесконечное количество слов, SentencePiece обучает модель сегментации таким образом, чтобы конечный размер словария был фиксирован, например, 8к, 16к или 32к.Обратите внимание, что SentencePiece указывает конечный размер словария при обучении, что отличается от использования subword-nmt, который использует количество операций слияния. Количество операций слияния является специфическим параметром BPE и не применимо к другим методам сегментации, включая unigram, word и char.
Предыдущие реализации субсловарей предполагали, что входные предложения уже предварительно токенизированы. Это ограничение было необходимо для эффективного обучения, но усложняло предобработку, так как нам приходилось запускать лингвистически зависимые токенизаторы заранее. Реализация SentencePiece достаточно быстрая, чтобы обучать модель на сырых предложениях. Это полезно для обучения токенизатора и детокенизатора для китайского и японского языков, где явных пробелов между словами нет.
Первый шаг обработки естественного языка — это токенизация текста. Например, стандартный английский токенизатор разделит текст "Hello world." следующим образом:
[Hello] [world] [.]
Одним из наблюдений является то, что исходный ввод и токенизированная последовательность не являются обратимо конвертируемыми. Например, информация о том, что между "world" и "." нет пробела, теряется в токенизированной последовательности, поскольку, например, Tokenize("world.") == Tokenize("world .")
.SentencePiece рассматривает входной текст как последовательность Юникод символов. Пробел также обрабатывается как обычный символ. Чтобы явно обработать пробел как базовый токен, SentencePiece сначала экранирует пробел метасимволом "▁" (U+2581):
Hello▁World.
Затем этот текст делится на небольшие части, например:
[Hello] [▁Wor] [ld] [.]
Поскольку пробел сохраняется в разделённом тексте, мы можем дешифровать текст без каких-либо амбигуитет.
detokenized = ''.join(pieces).replace('▁', ' ')
Эта особенность позволяет выполнять дешифрование без использования специализированных ресурсов для конкретного языка.
Обратите внимание, что мы не можем применять такие же потерькие преобразования при разделении предложения с помощью стандартных словных сегментаторов, так как они рассматривают пробел как специальный символ. Токенизированная последовательность не хранит необходимую информацию для восстановления исходного предложения.
SampleEncode (C++)
или encode with enable_sampling=True (Python)
. Подробности параметров выборки можно найти в sentencepiece_processor.h.>>> import sentencepiece as spm
>>> s = spm.SentencePieceProcessor(model_file='spm.model')
>>> for n in range(5):
... s.encode('New York', out_type=str, enable_sampling=True, alpha=0.1, nbest_size=-1)
...
['▁', 'N', 'e', 'w', '▁York']
['▁', 'New', '▁York']
['▁', 'New', '▁Y', 'o', 'r', 'k']
['▁', 'New', '▁York']
['▁', 'New', '▁York']
```## Установка
### Python модуль
SentencePiece предоставляет Python обёртку, поддерживающую как обучение SentencePiece, так и его сегментацию.
Вы можете установить двоичный пакет Python SentencePiece следующей командой:
pip install sentencepiece
Для получения более подробной информации см. [Python модуль](python/README.md).
### Клонирование и сборка SentencePiece командных инструментов из исходников C++
Для сборки SentencePiece необходимы следующие инструменты и библиотеки:
* [cmake](https://cmake.org/)
* C++11 компилятор
* [gperftools](https://github.com/gperftools/gperftools) библиотека (необязательна, может обеспечивать улучшение производительности на 10-40%)
На Ubuntu можно установить инструменты сборки с помощью apt-get:
% sudo apt-get install cmake build-essential pkg-config libgoogle-perftools-dev
Затем вы можете склонировать, собрать и установить командные инструменты следующими командами:
% git clone https://github.com/google/sentencepiece.git % cd sentencepiece % mkdir build % cd build % cmake .. % make -j $(nproc) % sudo make install % sudo ldconfig -v
На macOS замените последнюю команду на `sudo update_dyld_shared_cache`.
### Установка с использованием vcpkg
Вы можете скачать и установить sentencepiece с помощью менеджера зависимостей [vcpkg](https://github.com/microsoft/vcpkg):
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install sentencepiece
Порт sentencepiece в vcpkg поддерживается членами команды Microsoft и участниками сообщества. Если версия устарела, пожалуйста, [создайте issue или pull request](https://github.com/microsoft/vcpkg) на репозиторий vcpkg.### Скачивание и установка SentencePiece из подписанных выпущенных wheel-файлов
Вы можете скачать wheel с [страницы выпусков GitHub](https://github.com/google/sentencepiece/releases/latest).
Мы генерируем [подписи SLSA3](slsa.dev) с помощью OpenSSF's [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator) во время процесса выпуска. Для проверки бинарника выпуска:
1. Установите инструмент верификации с [slsa-framework/slsa-verifier#installation](https://github.com/slsa-framework/slsa-verifier#installation).
2. Скачайте файл аттестации `attestation.intoto.jsonl` с [страницы выпусков GitHub](https://github.com/google/sentencepiece/releases/latest).
3. Запустите верификатор:
```shell
slsa-verifier -artifact-path <путь_к_wheel> -provenance attestation.intoto.jsonl -source github.com/google/sentencepiece -tag <тэг>
pip install wheel_file.whl## Инструкции по использованию
% spm_train --input=<ввод> --model_prefix=<имя_модели> --vocab_size=8000 --character_coverage=1.0 --model_type=<тип>
--input
: сырой корпус с одним предложением на каждой строке. Нет необходимости запускать токенизатор, нормализатор или предварительную обработку. По умолчанию SentencePiece нормализует ввод с помощью Unicode NFKC. Можно передать список файлов через запятую.--model_prefix
: префикс имени выходной модели. Генерируются файлы <имя_модели>.model
и <имя_модели>.vocab
.--vocab_size
: размер словаря, например, 8000, 16000 или 32000.--character_coverage
: количество символов, покрытых моделью, хорошие значения по умолчанию: 0.9995
для языков с богатым набором символов, таких как японский или китайский, и 1.0
для других языков с маленьким набором символов.--model_type
: тип модели. Выберите из unigram
(по умолчанию), bpe
, char
или word
. Входное предложение должно быть предварительно токенизировано при использовании типа word
.Используйте флаг --help
, чтобы отобразить все параметры обучения, или просмотрите этот раздел для общего представления.% spm_encode --model=<файл_модели> --output_format=piece < вход > выход
% spm_encode --model=<файл_модели> --output_format=id < вход > выход
Используйте флаг --extra_options
, чтобы вставить маркеры начала/конца последовательности или обратить порядок ввода.
% spm_encode --extra_options=eos (добавляет только </s>)
% spm_encode --extra_options=bos:eos (добавляет <s> и </s>)
% spm_encode --extra_options=reverse:bos:eos (обратит порядок ввода и добавит <s> и </s>)
SentencePiece поддерживает многопроходовое сегментирование и выборочное сегментирование с помощью флагов --output_format=(nbest|sample)_(piece|id)
.
% spm_encode --model=<файл_модели> --output_format=sample_piece --nbest_size=-1 --alpha=0.5 < вход > выход
% spm_encode --model=<файл_модели> --output_format=nbest_id --nbest_size=10 < вход > выход
```### Декодирование предложений/идентификаторов в сырой текст
% spm_decode --model=<файл_модели> --input_format=piece < вход > выход % spm_decode --model=<файл_модели> --input_format=id < вход > выход
Используйте флаг `--extra_options`, чтобы декодировать текст в обратном порядке.
% spm_decode --extra_options=reverse < вход > выход
### Пример от начала до конца
% spm_train --input=data/botchan.txt --model_prefix=m --vocab_size=1000 unigram_model_trainer.cc(494) LOG(INFO) Начинается обучение с : ввод: "../data/botchan.txt" ... unigram_model_trainer.cc(529) LOG(INFO) EM подитерация=1 размер=1100 obj=10.4973 количество_токенов=37630 количество_токенов/куска=34.2091 trainer_interface.cc(272) LOG(INFO) Сохранение модели: m.model trainer_interface.cc(281) LOG(INFO) Сохранение словарей: m.vocab
% echo "Я видел девушку в телескоп." | spm_encode --model=m.model
▁Я ▁видел ▁девушку ▁в ▁т е л е с к о п .%
echo "Я видел девушку в телескоп." | spm_encode --model=m.model --output_format=id
9 459 11 939 44 11 4 142 82 8 28 21 132 6
%
echo "9 459 11 939 44 11 4 142 82 8 28 21 132 6" | spm_decode --model=m.model --input_format=id
Я видел девушку в телескоп.
Вы можете заметить, что исходное предложение восстанавливается из последовательности идентификаторов словаря.
% spm_export_vocab --model=<model_file> --output=<output_file>
<output_file>
хранит список слов и вероятностей эмиссий. Идентификатор слова соответствует номеру строки в этом файле.
По умолчанию SentencePiece использует следующие специальные токены: Unknown (<unk>
), BOS (<s>
), и EOS (</s>
), имеющие идентификаторы Yöntem 0, 1 и 2 соответственно. Мы можем переопределить это отображение во время обучения следующим образом.
% spm_train --bos_id=0 --eos_id=1 --unk_id=5 --input=... --model_prefix=... --character_coverage=...
При установке -1
идентификатора, например, bos_id=-1
, этот специальный токен отключается. Обратите внимание, что идентификатор unk не может быть отключен. Можно определить идентификатор для заполнителя (<pad>
) как --pad_id=3
.
Если вы хотите назначить ещё какие-либо специальные токены, обратитесь к разделу Использование пользовательских символов.### Ограничение словаря
spm_encode
принимает опции --vocabulary
и --vocabulary_threshold
, чтобы spm_encode
производил только те символы, которые также присутствуют в словаре (с определённой частотой). Подробнее об этой функции можно прочитать на странице subword-nmt.Использование аналогично тому, которое используется в subword-nmt
. Предположим, что L1 и L2 — два языка (источник/цель), обучаем общую модель SentencePiece и получаем результирующий словарь для каждого:
% cat {train_file}.L1 {train_file}.L2 | shuffle > train
% spm_train --input=train --model_prefix=spm --vocab_size=8000 --character_coverage=0.9995
% spm_encode --model=spm.model --generate_vocabulary < {train_file}.L1 > {vocab_file}.L1
% spm_encode --model=spm.model --generate_vocabulary < {train_file}.L2 > {vocab_file}.L2
Команда shuffle
используется лишь в случае необходимости, так как spm_train
по умолчанию загружает первые 10 миллионов строк корпуса.
Затем сегментируем корпус для обучения/тестирования с помощью опции --vocabulary
.
% spm_encode --model=spm.model --vocabulary={vocab_file}.L1 --vocabulary_threshold=50 < {test_file}.L1 > {test_file}.seg.L1
% spm_encode --model=spm.model --vocabulary={vocab_file}.L2 --vocabulary_threshold=50 < {test_file}.L2 > {test_file}.seg.L2
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )