LSTM и векторное представление слов в задаче Part-Of-Speech Tagging

Mar 11, 2016 09:10

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 моделью.

vector space model, tree bank, word2vec, word embedding, частеречная разметка, pos tagger

Previous post Next post
Up