1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-sentencepiece

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

SentencePiece

Сборка C++ Сборка Wheels GitHub Issues Версия PyPI Загрузки PyPi Добро пожаловать с вкладами Лицензия SLSA 3

SentencePiece — это независимый от меток токенизатор и де-токенизатор текста, главным образом для систем генерации текста на основе нейронных сетей, где размер словаря заранее определяется до обучения модели. SentencePiece реализует подсловарные единицы (например, byte-pair encoding (BPE) [Sennrich et al.]) и единичную языковую модель [Kudo.] с расширением прямого обучения из сырых предложений. SentencePiece позволяет создавать полностью конечную систему, которая не зависит от специфических для языка предварительной/постобработки.Это не официальный продукт Google.

Технические особенности

  • Чистота данных: SentencePiece обучает модели токенизации и дешифровки на основе предложений. Предварительная токенизация (токенизатор Moses/MeCab/KyTea) не всегда требуется.
  • Независимость от языка: SentencePiece рассматривает предложения как последовательности символов Unicode. Нет зависимости от конкретного языка.
  • Множество алгоритмов субслова: BPE [Sennrich et al. ] и универсальная модель языка [Kudo. ] поддерживаются.
  • Регуляризация субслов: SentencePiece реализует выборку субслов для регуляризации субслов и BPE-dropout, что помогает повысить надёжность и точность моделей машинного перевода.
  • Быстрый и легкий: Скорость сегментации составляет около 50 тысяч предложений в секунду, а потребление памяти — около 6 МБ.
  • Самостоятельное содержание: Та же самая токенизация/дешифровка получается при использовании одного и того же файла модели.
  • Прямое генерирование идентификаторов словаря: SentencePiece управляет отображением словаря к идентификаторам и может прямым образом генерировать последовательности идентификаторов словаря из сырого текста.- Нормализация на основе NFKC: SentencePiece выполняет нормализацию текста на основе NFKC. Для тех, кто незнаком с SentencePiece как с программой/алгоритмом, можно прочитать мягкий ввод здесь.## Сравнение с другими реализациями |Описание|SentencePiece|subword-nmt|WordPiece| |:---|:---:|:---:|:---:| |Поддерживаемый алгоритм|BPE, unigram, char, word|BPE|BPE*| |Открытый исходный код?|Да|Да|Google внутренний| |Регуляризация subword|Да|Нет|Нет| |Библиотека Python (pip)|Да|Нет|Н/Д| |Библиотека C++|Да|Нет|Н/Д| |Необходимо ли предварительное разделение?|Нет|Да|Да| |Пользовательская нормализация (например, NFKC)|Да|Нет|Н/Д| |Прямое генерирование ID|Да|Нет|Н/Д|

Обратите внимание, что алгоритм BPE, используемый в WordPiece, немного отличается от оригинального BPE.

Обзор

Что такое SentencePiece?

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('▁', ' ')

Эта особенность позволяет выполнять дешифрование без использования специализированных ресурсов для конкретного языка.

Обратите внимание, что мы не можем применять такие же потерькие преобразования при разделении предложения с помощью стандартных словных сегментаторов, так как они рассматривают пробел как специальный символ. Токенизированная последовательность не хранит необходимую информацию для восстановления исходного предложения.

  • (en) Hello world. → [Hello] [World] [.] (Пробел между Hello и World)
  • (ja) こんにちは世界。 → [こんにちは] [世界] [。] (Нет пробела между こんにちは и 世界)#### Подслово регуляризация и BPE-dropout Подслowo регуляризация [Kudo.] и BPE-dropout Provilkov et al — простые методы регуляризации, которые фактически увеличивают тренировочные данные за счет случайного выбора подслов на лету, что помогает повысить точность и устойчивость моделей машинного перевода. Чтобы включить регулярное субслово, вы можете интегрировать библиотеку SentencePiece (C++/Python) в систему машинного перевода для выборки одного сегмента для каждого обновления параметра, что отличается от стандартной подготовки данных офлайн. Вот пример библиотеки Python. Вы заметите, что 'New York' сегментируется по-разному при каждом вызове 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## Инструкции по использованию

Обучение модели SentencePiece

% 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Несанкционированный токенизатор текста для генерации текста на основе нейронной сети. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mirrors-sentencepiece.git
git@api.gitlife.ru:oschina-mirror/mirrors-sentencepiece.git
oschina-mirror
mirrors-sentencepiece
mirrors-sentencepiece
master