1. С помощью утилиты Txt2VecConsole (см.
https://github.com/zhongkaifu/Txt2Vec) получаю векторные представления слов. В целом эта утилита является портом на C# утилиты word2vec, каких-то особых отличий в результатах я не видел. Хотя результаты в мелочах все-таки отличаются на одинаковом корпусе при одинаковых параметрах. Корпус - примерно 6 Гб очищенных от мусора русских предложений, взятых из википедии, всякой художественной литературы и новостных ресурсов. Лемматизацию не делал, чтобы не получить курицу и яйцо в рамках данной задачи.
2. Затем в свою программу ModelTrainer добавил генерацию данных для
RNNSharp. Программа делает следующее. Она берет мой эталонный корпус с разборами русских предложений и формирует обучающий и тестовый dataset'ы для нескольких моделей и задач. В данном случае формируются текстовые файлы для задачи частеречной разметки такого вида:
юноша ~оша 136
отрицательно ~ьно 252
покачал ~чал 229
головой ~вой 132
. . 251
принцесса ~сса 135
вообще ~бще 252
потеряла ~яла 230
дар дар 149
речи ~ечи 140
. . 251
стражник ~ник 136
беззвучно ~чно 252
упал ~пал 229
лицом ~цом 133
вниз ~низ 248
. . 251
Входной формат для RNNSharp очень прост. Первые N-1 столбцов считаются фичами, последний столбец содержит тег, который модель должна научится выставлять. Как и в
CRF++, используется жутко неудобный промежуточный файл "шаблонов фич", который описывает правила комбинирования столбцов для получения тех фич, которые кушает модель. Я в свое время ушел из-за этих шаблонов на CRFSuite, где фичи я могу генерировать прямо в том виде, как их увидит модель. Но тут деваться некуда, пришлось смириться. Для экспериментов написал вот такой набор шаблонов:
U01:%x[-2,1]
U02:%x[-1,1]
U03:%x[0,1]
U04:%x[1,1]
U05:%x[2,1]
То есть берем в качестве фич второй столбец для слова и +/- 2 его соседей. Итоговый набор признаков получается на порядок или даже на два порядка проще, чем в моей текущей модели POSTagger в парсере, но для сравнения возможностей RNN+w2v это вполне годится.
3. Обучение RNNSharp идет на ~400 тысячах слов, тестируется на ~40 тысячах. Для генерации runtime-контекста используется
LSTM. 20 итераций по обучающему сету.
4. Результаты такие.
Для w2v модели с параметрами cbow=0, win=3, size=16 ошибаемость частеречной разметки получается ~3.25%.
Для w2v модели с параметрами cbow=1, win=2, size=128 ошибаемость уменьшается до ~2.86%.
Это намного хуже, чем у моей базовой CRF модели. Но для корректного сравнения надо бы попробовать взять полный корпус русского языка, то есть около 3 миллионов слов, и поиграться с w2v моделью.