Skip to content
forked from w2vxx/w2vxx

word2vec++ skip-gram for CoNLL trainsets

License

Notifications You must be signed in to change notification settings

parus-proj/conll2vec

 
 

Repository files navigation

conll2vec

conll2vec — утилита для построения векторных представлений слов на основе морфологически и синтаксически размеченных данных в формате conll.

В ходе обучения conll2vec одновременно оперирует синтаксическим и оконным контекстом. Часть измерений векторного представления обучается на синтаксических контекстах, часть — на традиционных для word2vec-утилит линейно-оконных контекстах.

  • Синтаксический контекст слова определяется по дереву зависимостей. Для каждого слова отыскиваются его ближайшие соседи в синтаксическом дереве (родитель и непосредственные потомки). Контекстными единицами выступают тройки <лемма слова-соседа, направление синтаксической связи, тип синтаксического отношения>.
  • Для линейно-оконных контекстов размер окна приравнивается размеру предложения. Контекстными единицами выступают леммы слов.

Построение векторных представлений утилитой conll2vec выполняется в несколько этапов, некоторые из которых опциональны (необходимость их выполнения зависит от назначения векторной модели). Полный перечень включает:

  • предобработку conll-данных [опционально];
  • построение словарей;
  • построение модели лемм;
  • построение модели токенов [опционально];
  • добавление знаков препинания [опционально];
  • построение модели токенов с «морфологическим» дополнением [опционально].

Кроме того, в утилиту встроены средства оценки построенной модели на стандартных тестсетах (для русскоязычных моделей) и вычисления семантической близости лексических единиц (в пакетном и интерактивном режиме).

Быстрый старт

В репозитории размещены демонстрационные скрипты для Linux и Windows, обеспечивающие:

  1. сборку утилиты из исходных кодов,
  2. построение векторной модели на основе фрагмента данных из корпуса PaRuS,
  3. запуск утилиты в интерактивном режиме — для заданного слова отыскиваются ближайшие по смыслу.

Для сборки утилиты требуется компилятор с поддержкой C++17 и библиотека ICU. Сборка протестирована под Linux с компилятором gcc v9.3.0 и под Windows с компилятором от Visual Studio 2017 v15.9.18 (cl.exe версии 19.16).

Запуск под Linux Запуск под Windows
Запустите консоль. Перейдите в директорию, в которой хотите развернуть программное обеспечение. Запустите «Командную строку Native Tools x64 для VS 2017» (это обеспечит настройку окружения для сборки утилит). Перейдите в папку, в которой хотите развернуть программное обеспечение.
Примечание: для загрузки обучающего дейтасета необходим git-lfs.
git clone https://github.com/parus-proj/conll2vec.git
cd conll2vec
Установите библиотеку ICU.
sudo apt install libicu
Установите библиотеку ICU.
Воспользуйтесь скриптом icu_install.cmd для установки 64-битной версии библиотеки для msvc2017 непосредственно в каталог утилиты conll2vec.
  или
Установите ICU, следуя инструкции по установке на сайте библиотеки. Затем в открытом окне командной строки для VS 2017 настройте переменную окружения PATH так, чтобы в ней присутствовал каталог с dll-библиотеками ICU, а в файле makefile.msvc определите переменную ICU_PATH так, чтобы она указывала на корневой каталог библиотеки (внутри этого каталога должны находиться каталоги include и lib64).
./demo-linux.sh demo-windows.cmd
При успешных сборке и обучении работа скрипта завершится вызовом утилиты в режиме поиска слов с близким значением. Чтобы удостовериться в работоспособности, попробуйте ввести распространённые слова — президент, комната, автомобиль. Отмечу, что демонстрационный скрипт порождает неоптимальную векторную модель, чтобы сократить время обучения. Для построения высококачественной модели необходимо использовать больший объём данных из корпуса PaRuS или иного крупного conll-дейтасета.

Режимы работы и параметры утилиты

В conll2vec реализованы алгоритмы для решения нескольких задач. Выбор задачи осуществляется параметром -task. К числу основных задач относятся следующие.

  • vocab — режим построения словарей по conll-дейтасету. В этом режиме утилита по обучающим данным порождает четыре словарных ресурса:
    • словарь лемм,
    • словарь синтаксических контекстов,
    • словарь словоформ (токенов),
    • отображение из лемм в соответствующие возможные словоформы.
  • train — режим обучения модели лемм по conll-дейтасету.
  • sim — интерактивный режим, позволяющий для заданного слова находить ближайшие по смыслу (используется косинусная мера). Это расширенный аналог утилиты distance из оригинального word2vec.

Основными параметрами при построении словарей являются -train, задающий имя файла с обучающими conll-данными, а также группа параметров, задающих имена файлов для сохранения словарей: -vocab_l (словарь лемм), -vocab_d (словарь синтаксических контекстов), -vocab_t (словарь словоформ) и -tl_map (отображение леммы–токены). Частотные пороги для включения слова/контекста в словарь возможно определять отдельно для каждого словаря. За это отвечает группа параметров -min-count_l, -min-count_d, -min-count_t (это аналоги параметра -min-count в word2vec).

Ниже приводится пример командной строки для запуска conll2vec в режиме построения словарей:

./conll2vec -task vocab -train data.conll \
            -vocab_l main.vocab -vocab_d dep_ctx.vocab -vocab_t tokens.vocab -tl_map t2l.map \
            -min-count_l 70 -min-count_d 50 -min-count_t 50

Построение векторных представлений выполняется в соответствии с архитектурой skip-gram и подходом к снижению вычислительной нагрузки negative sampling. Сначала векторные представления строятся для словаря лемм. Обученная векторная модель сохраняется в файл, заданный параметром -model. Если в дальнейшем потребуется доучивание модели словоформ, то при обучении модели лемм необходимо также указать параметр -backup. Он позволяет сохранить весовые матрицы нейросети в файл.

Кроме того, для обучения утилите необходимо знать имя файла с обучающими conll-данными (параметр -train), имя файла со словарём синтаксических контекстов (-vocab_d), размерности частей векторного представления, обучаемых с учётом синтаксических и линейно-оконных контекстов (-size_d и -size_a). Сумма последних двух параметров даёт итоговую размерность векторных представлений модели.

Параметры позволяют также задать количество эпох обучения (-iter), начальное значение коэффициента скорости обучения (-alpha), количество отрицательных примеров, приходящихся на один положительный (-negative_d и -negative_a для синтаксических и линейно-оконных частей модели), коэффициенты субдискретизации (-sample_w, -sample_d, -sample_a — аналоги параметра -sample в word2vec для основного и двух контекстных словарей), количество потоков (-threads).

Ниже приводится пример команды для запуска conll2vec в режиме обучения векторной модели:

./conll2vec -task train -train data.conll \
            -vocab_l main.vocab -backup backup.data -vocab_d dep_ctx.vocab \
            -model vectors.c2v -size_d 75 -size_a 25

Запуск conll2vec в интерактивном режиме для поиска близких по значению слов требует указания параметров, определяющих имя файла с сохранённой векторной моделью (-model).

Пример команды:

./conll2vec -task sim -model vectors.c2v

Специальные режимы работы

Кроме трёх основных задач, о которых шла речь выше, утилита conll2vec может выполнять различные преобразования тренировочных данных и построенной модели. Рассмотрим расширенный набор задач (значений для параметра -task).

  • fit — вспомогательный режим преобразования conll-дейтасетов, выбранных из корпуса PaRuS для повышения качества векторных представлений и ускорения обучения. Утилита фильтрует малозначимые синтаксические связи, строит связи в обход служебных текстовых единиц, обобщает числовые величины, приводит к нижнему регистру словоформы и др.
  • toks — режим добавления словоформ в модель. Информация о соответствии словоформ леммам берётся из словаря, указываемого параметром -tl_map. Если словоформе соответствует единственная лемма, то вектор для словоформы порождается в ближайшей окрестности вектора леммы (выполняется небольшое случайное смещение относительно леммы). В случае омоформии результирующий вектор для словоформы находится как взвешенное среднее векторов его возможных лемм (веса вычисляются на основе частот в корпусе).
  • toks_train — режим доучивания модели после добавления в неё словоформ.
  • toks_gramm — режим доучивания модели словоформ грамматическим признакам. В результате к уже построенному векторному представлению слова будет добавлен вектор, кодирующий близость по грамматическим характеристикам. Такие вектора полезны в задачах синтеза текста и морфологического анализа. Длина векторов модели увеличивается на величину параметра -size_g.
  • punct — режим добавления в векторную модель знаков пунктуации (они не включаются в основной словарь). Вектора для них порождаются эвристическим алгоритмом.
  • balance — режим масштабирования группы измерений, обучавшихся на линейно-оконных контекстах (отвечающих за ассоциативную близость значений слов). Масштабирующий коэффициент задаётся параметром -a_ratio. Если он больше единицы, то «ассоциативные» измерения будут вносить больший вклад в результирующую меру близости, вычисляемую по всему вектору. Если коэффициент между 0 и 1, то вклад этих измерений в величину близости снижается.
  • sub — режим извлечения подмодели, заданной диапазоном измерений. Например, можно из обученной модели извлечь подмодель, отвечающую только за категориальную близость или только за ассоциации между значениями.
  • fsim — пакетный режим вычисления близости значений для пар слов. Типичный сценарий применения — оценка качества модели.
  • selftest_ru — режим самодиагностики и оценки (для русского языка). В данном режиме утилита выполняет проверку модели, а также вычисляет показатели качества модели на стандартных тестовых множествах для определения семантической близости (RUSSE'15 и RuSim1000).

Примеры запуска утилиты conll2vec в различных режимах.

# fit для случая неархивированных обучающих данных. Результат преобразования помещается в файл, задаваемый параметром -train.
./conll2vec -task fit -fit_input parus.conll -train data.conll

# Т.к. объём обучающих данных обычно большой, удобнее использовать вариант fit в конвейерном исполнении. Например, так.
bzip2 -dkc parus.conll.bz2 | ./conll2vec -task fit -fit_input stdin -train data.conll

# Добавление словоформ в модель.
./conll2vec -task toks -model vectors.c2v -tl_map l2t.map

# Доучивание словоформ.
./conll2vec -task toks_train -train data.conll \
            -vocab_t tokens.vocab -restore backup.data -vocab_d dep_ctx.vocab \
            -model vectors.c2v

# Доучивание грамматических признаков.
./conll2vec -task toks_gramm -train data.conll -vocab_t tokens.vocab -model vectors.c2v -size_g 20

# Добавление знаков препинания в модель.
./conll2vec -task punct -model vectors.c2v

# Масштабирование группы измерений, обучавшихся на линейно-оконных контекстах.
./conll2vec -task balance -model vectors.c2v -a_ratio 4.0

# Извлечение подмодели.
./conll2vec -task sub -model vectors.c2v -sub_l 0 -sub_r 75

# Пакетный режим вычисления близости значений слов.
# Пары слов в файле word_pairs.csv записываются в формате:
#   слово1,слово2,
# Результат выводится в стандартный поток вывода в формате:
#   слово1,слово2,близость_по_всему_вектору,близость_по_синтаксич_части,близость_по_оконной_части
./conll2vec -task fsim -model vectors.c2v -fsim_file word_pairs.csv -fsim_fmt detail

# Самодиагностика.
./conll2vec -task selftest_ru -model vectors.c2v -a_ratio 1.0 -st_yo 0

Благодарности

Утилита conll2vec создана при финансовой поддержке РФФИ в рамках научного проекта № 19-07-00779.

About

word2vec++ skip-gram for CoNLL trainsets

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C++ 98.9%
  • Other 1.1%