Category: путешествия

Category was added automatically. Read all entries about "путешествия".

Визуализация влияния batch_size на качество модели wordchar2vector - ч.3

Продолжение поста https://kelijah.livejournal.com/237155.html.

То, что казалось достаточно очевидным и логичным, стало интересным при увеличении количества исходных данных. Я погонял обучение модели на новых batch_size и даже по 2 раза для некоторых batch_size, и получается вот такое облако для максимальной достигаемой точности при разных batch_size:
Collapse )
Спад для batch_size>=1000 достаточно четкий, но вот все что слева уже не такое простое. Можно видеть даже, как batch_size=180 и 500 дают очень близкие результаты, это больше похоже на плато или макушку параболы.

Зачем нужна декомпозиция оценки сентимента на полярность и упоминание аспекта (и еще facets)

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

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

Collapse )

PS:

Collapse )

Вторая часть для системы оценки сентимента в отзывах - детектор аспектов

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

Чистота, красивая территория, номера точь-в точь как на фото, аниматоры не дают скучать детям.

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

Перестановочная нормализация фраз в результатах оценки сентимента

Сделал очень простой алгоритм, который подбирает правильный порядок слов в ходе нормализации словосочетаний.

Выдержка из результатов тестового прогона по моей базе оценок из отзывов:

Collapse )

Сейчас в базе 23990 уникальных словосочетаний по которым сделана оценка или обнаружен факт наличия/отсутствия какого-то аспекта. Общее количество оценок и фактов равно 9677415. Думаю, можно попытаться поучить RNN/LSTM модель нормализовать словосочетания по такому шаблону:

Collapse )

100% качества добиться, наверное, вряд ли получится из-за ограничений на объем памяти в сетке, но общие закономерности рекуррентная модель должна уловить. Например:

приведение к нейтральной форме:
анимация бедноватенькая ==> бедноватая анимация

приведение главного существительного к словарной форме и пересогласование зависимого прилагательного:
анимационные программы очень веселые ==> очень веселая анимационная программа

и так далее.

Несколько нюансов по текущим делам

1. Работать с real-valued continuous word vectors в моделях с RNN очень тяжело. Несколько разных моделей ведут себя похожим образом, попадая на какие-то плато. Практически в долину смерти оптимизаторов, где по склонам валяются скелеты умерших от истощения градиентных спускателей. Это приводит к очень плохой сходимости. Переход на хитрые оптимизаторы типа adagrad в целом не помогает. А использовать 1-hot vector представление очень не хочется из-за катастрофических проблем с размером лексикона и отсутствием композируемости для составных слов.

2. Генерация бинарных sparse distributed representations для слов - забавная штука. Но получение 2048-разрядных векторов для 1kk+ лексикона приводит к забавному эффекту на хосте с 32 Гб оперативки. В общем, убунта, ушедшая в свопирование на таком объеме, с очень большим трудом поддается снятию задачи-виновника, особенно если спарсификация - многопоточная и занимает хотя бы 4 из 8 ядер. Да и после снятия задачи около 5 минут система приходит в себя, очищая своп. В этот момент она очень похожа на кота, который занят вылизыванием и умыванием. Его можно ненадолго отвлечь, но предпочтение будет все равно отдано вылизыванию и умыванию. Так что жесткий ребут помогает тут лучше. Но вопрос о недостаточности 32 Гб для некоторых задач уже встал :(

Что-то похожее на понимание смысла незнакомого слова

Disclaimer: если бы не необходимость иметь достаточно большую статистику употребления, word2vector модель могла бы неплохо объяснить феномен понимания смысла слов без явного учителя.

Использую мой корпус отзывов и gensim.
В нем есть слово 'анекстура'. Что оно значит?
Collapse )

Разбор отзывов

До НГ тестировал парсер на самом тяжелом материале, который есть - на отзывах, которые люди оставляют в инете. В моем случае это отзывы на отдых в разных отелях.

Во-первых, теперь я на 100%, что синтаксис в варианте dependency tree является очень сильной идеализацией для повседневной речи. Ошибки, опечатки, потоки слов без разделитей постоянно сбивают парсер и сильно повышают процент ошибок:

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


Но это-то, конечно, не самое неприятное в рамках задачи определения тональности, для которой парсер и тестировался.
Вот как определять тональность в условиях сарказма и иронии:

Collapse )
А основной массив предложений с ненулевой тональностью вообще находится в категории "common sence", то есть понятно, почему это плохо, но объяснить это через лексический анализ (хоть bag of word, хоть как-то еще), по-моему, нереально:

Collapse )

Skip-gram и открой окно пошире...

Продолжая http://kelijah.livejournal.com/167972.html.
В word2vector модели при генерации поставил cbow=0 и слелал размер окна 10.
Плюс изменил порядок сравнения близости контекстов.
Итог - неточность снятия омонимии и определения нужного смысла для многозначных слов упала в 3 раза, до ~8%:
Collapse )