Неудачная классификация слов сущ/не сущ с помощью char rnn/LSTM

Apr 20, 2016 20:24

1. Есть массив слов, у каждого из которых проставлен признак сущестительное / не существительное.  Массив получен из SQL русской словарной базы и содержит больше 3 миллионов словоформ, что вполне достаточно для обучения моделей.
Read more... )

нейросети, vector space model, unsupervised feature learning, русский язык, lstm, keras, rnn, рекуррентные сети, python, морфология, word embedding

Leave a comment

servponomarev April 21 2016, 09:59:17 UTC

> А чем этот вектор центра кластера будет лучше?

Лучше тем, что каждый его элемент имеет простое и понятное объяснение и не зависит от других элементов вектора. Алгоритмы маш обучения, как и люди, любят такие вектора.

Что касается генерации w2v вектора для неизвестного слова, я бы сделал так:

рассматриваем слово как последовательность символов. Генерим n-граммы. Одна буква, две буквы, три и так далее - насколько хватит памяти. Тогда любое слово, любая последовательность символов, раскладывается на набор таких n-грамм. Их много.

Далее, выписываем n-граммы для каждого слова из словаря в строчку, и обучаем на этом наборе строк (размер окна - большой, дабы все n-граммы даже длинного слова уместились). Не забываем в эту-же строчку добавить специальные токены-интересующие нас признаки (род, число, класс и т.д.)
При этом, можно сделать поглощение меньших n-грамм большими (тут важно подобрать баланс по длине поглощаемых элементов).

Что мы имеем на выходе? На выходе мы имеем векторные репрезентации для каждой цепочки символов. При этом, особо характерные цепочки (суффиксы, корни, окончания) - установят сильную связь с соответствующими токенами-признаками. Чем больше цепочка символов, тем она реже встречается в обучающей выборке, и тем сильнее она будет привязана к своим токенам-признакам. Частые или неинформативные цепочки - будут где-то посередине и не так приавязаны.

Неизвестное слово раскладываем на n-граммы, выделяем самые из них длинные (можно заодно использовать вероятности замены/пропуска/добавления символа) и смотрим, к каким токенам признакам тяготеет их взвешенная сумма.

Я так делал, только не на буквах, а на словах, когда реализовывал диалоговую модель: http://servponomarev.livejournal.com/8599.html

Пример идеи:

загорать - ГЛАГ.
раскладываем на:
з за заг аг заго аго загор.... ГЛАГ
учимся
рассматриваем слово "перезагорали":
загор али пере - самые длинные из n-грамм, взвешиваем их по частотности, суммируем их w2v вектора и смотрим, к каким из токенов они относятся больше всего.

Помимо этого подхода, предлагаю посмотреть уже обученную w2v модель на 4.5 миллиона слов по поисковым запросам. Там есть все слова, с опечатками, с кодами, с таким вот несловарным словообразованием. При этом, эти слова через косинусную меру легко сводить к известным словарным словам.

Reply

kelijah April 21 2016, 11:45:51 UTC
>Далее, выписываем n-граммы для каждого слова из словаря в строчку, и обучаем на этом наборе строк

Да, было примерно такое у меня. Вот сгенерированный входной файл, визуально понятно как он получается:

копируемые туда файлы будут автоматически переноситься на все компьютеры
копируемые туда ~айлы будут автоматически переноситься на все компьютеры
~емые туда файлы будут автоматически переноситься на все компьютеры
~емые туда файлы будут ~ески переноситься на все компьютеры
копируемые туда ~айлы будут ~ески переноситься на все компьютеры
копируемые туда ~айлы будут автоматически ~ться на все компьютеры
~емые туда файлы будут ~ески переноситься на все компьютеры
в самом начале инсталлятор просит указать желаемый язык интерфейса
в ~амом начале инсталлятор просит указать желаемый язык интерфейса
в самом начале ~ятор просит указать желаемый язык интерфейса
в ~амом начале инсталлятор просит указать желаемый язык ~ейса
в самом начале инсталлятор просит указать желаемый язык ~ейса
и эта закрытость приобрела чуть ли не маниакальный характер
и эта ~ость приобрела чуть ли не маниакальный характер
и эта ~ость приобрела чуть ли не маниакальный характер
в результате вырисовывается образ нового гиганта ит индустрии
в результате ~ется образ нового гиганта ит индустрии
в результате ~ется образ нового гиганта ит индустрии
в результате вырисовывается ~браз нового гиганта ит индустрии
в результате вырисовывается образ нового ~анта ит индустрии
в результате вырисовывается образ ~вого гиганта ит индустрии
в результате вырисовывается образ нового ~анта ит индустрии

При удачном подборе параметров обучения w2v векторы для суффиксов типа ~айлы отражают некоторую семантику морфем. Но обучать модель на таких данных очень тяжело, прежде всего из-за объема датасета. Даже в случае, если как я заменяем только одно слова на суффикс. Так что я пока этот подход оставил.

Фишка же в том, что продуктивных приставок, суффиксов и окончаний в русском языке достаточно мало. И вместе с словообразовательными корнями они позволяют лепить совершенно фантастические неологизмы, почти как у немцев. Так вот если вместо всех возможных комбинаций символьных обрезков-nграмм научиться опознавать именно эти фичи, то обучение w2v станет гораздо проще. Как и другие задачи. RNN это видимо один из прямых путей получить модель, которая сформирует список этих фич. Может быть еще contractive autoencoder, но этот эксперимент еще впереди.

>Там есть все слова

Вот я и говорю - невозможно собрать ВСЕ возможные слова. Хвост слов с частотой 1-2 тянется в бесконечность, даже если не брать опечатки.

Reply


Leave a comment

Up