Мы строим сервис TopRater.com, который должен агрегировать в себе все мнения из Интернета относительно массы объектов e-commerce. Для этого мы "прочитали" миллионы отзывов и научились выделять из них сущности, аспекты, тональности и факты. При этом, хотя объемы данных кажутся маленькими для специалистов Big Data (всего несколько терабайт) — почти во всех задачах нам пришлось использовать технологии Big Data — сотни серверов на Google Cloud, Apache Spark, MPP Базы данных.
В докладе в форме "галопом по Европам" будет рассказано о гибридных подходах к NLP и машинному обучению, будут всякие интересные простые решения (некоторые широко известные, но, как показывает практика, часто забытые), ну и, конечно, немного про Deep Learning, а также про наш кластер и как там все организовано.
TopRater.com Машинное понимание миллионов отзывов / Павел Велихов (TopRater)
1. Павел Велихов, Chief Science Officer @ Toprater.com
Миллиард отзывов и
комментариев и Big Data
Полезные советы, опыт и
грабли по продвинутому
NLP на больших объемах
данных
2. Toprater.com - площадка, где собираются мнения со всего интернета
относительно любых объектов e-commerce.
Первый шаг - собрать существующие мнения и их
проанализировать. Нас интересуют сотни и тысячи критериев, о
которых писалось в отзывах и которые помогают выбрать лучшее
3. Как пользоваться такой системой?
❖ Хочу поехать на лыжах покататься, но чтобы был
бассейн для детей и аниматоры, которым их сдать. А
ночью танцы!
❖ Хочу фильм с самым классным 3D, где мощно бьются
на мечах и много крови!
4. Western sentimental orchestral melodies permeating every last gouge and lunge, and
especially throughout the sentimental scenes at the end.
5. Надо просто понимать отзывы :)
❖ Отзывы могут быть:
❖ Фейковые
❖ Саркастические/Юморные
❖ Написаны на языке Engrish
❖ и так далее
❖ После этого - загоняем данные в поисковик, и все!
6. ❖ “It is day 87 and the horses have
accepted me as one of their own. I have
grown to understand and respect their
gentle ways. Now I question
everything I thought I once knew and
fear I am no longer capable of following
through with my primary objective. I
know that those who sent me will not
relent. They will send others in my
place... But we will be ready”
Amazon: Accoutrements Horse Head Mask
Не все отзывы оказываются полезными :)
7. Как понять смысл отзыва
❖ Научное название: Aspect-based sentiment analysis +
information extraction
❖ Задача сложная (вообще-то нерешаемая), но оказывается
достаточно высокой точности добиться можно.
❖ Для решения в ход идет все из арсенала NLP (Natural
Language Processing):
❖ грамматический разбор, онтологии, словари, ручные
системы, векторные представления слов и фраз,
“традиционное” и глубокое обучение.
8. Постановка задачи
Если вы ищете спокойную гостиницу
для отдыха с детьми, вам не сюда.
Отличный отель, уютные просторные комнаты,
но в ресторане шумно и курят.
Аспекты Сентименты
10. Данные для машинного обучения
❖ Если уже выделен критерий, легко собрать данные по оценке:
❖ Например, берем Amazon Mechanical Turk
❖ Кидаем туда задания, платим $0.01 за каждый ответ
❖ Несколько раз дублируем задание, чтобы не было левых ответов
❖ Можно даже потом сравниться с бенчмарками (но есть
проблемы, написал пост на linkedin: “Something is really wrong
with sentiment analysis and nobody seems to notice”).
❖ Для задачи выделения критерия - все сложнее, легче делать своими
людьми
11. Попробуем простое решение:
❖ По старинке (например, как в курсе у Ng):
❖ Берем простую модель bag-of-words:
❖ Строим классификатор в аспекты
❖ Вычисляем тональность каждого аспекта
Модель: {“был”, ”а”, ”но”, “номер”, “удобным”,
“ресторан”, “прокуренным”, “приятный”}
12. Попробуем простое решение:
❖ По старинке (например, как в курсе у Ng):
❖ Берем простую модель bag-of-words:
❖ Строим классификатор в аспекты
❖ Вычисляем тональность каждого аспекта
Модель: {“был”, ”а”, ”но”, “номер”, “удобным”,
“ресторан”, “прокуренным”, “приятный”}
Текст: “Номер был удобным, но
прокуренным, а ресторан приятный”
13. Более продвинутый NLP
❖ Части речи: существительное, глагол, прилагательное, наречие и т.п.
❖ Омонимия (разные значения одного слова):
❖ пример: Картина
❖ - картина на стене (“на стене висит картина”)
❖ - фильм (“снял хорошую картину”)
❖ - ситуация (“картина событий последних дней Помпей”)
❖ В английском тексте ~ 40% слов омонимичны (!)
❖ Грамматический разбор. Тут обычно 2 варианта:
❖ Constituency Tree
❖ Dependency Tree
14. Пример dependency tree
Very nice hotel with clean rooms,
but we didn't like the restaurant
Части речи
Зависимости
15. Точность разбора
❖ Стэнфорд дает около 92-93% точности
❖ .92^20 = 18%
❖ То есть обязательно накосячит в достаточно длинном
предложении
❖ Еще одна причина не налегать 100% на результаты
парсера
16. Небольшая экскурсия в Deep Learning
❖ Основные ключевые идеи Deep Learning для NLP:
❖ word embeddings. word2vec - только начало
❖ Recurrent NNs
❖ LSTM
❖ Recursive NNs
17. Deep Learning: Embeddings
wt-2 wt-1 wt wt+1 wt+2
wt
Размерность = 50…300
Слово, чье скалярное произведение с
wt максимально
19. Есть и проблемы:
Упс, мы сами не можем разделить классы,
ну и ни один алгоритм не сможет
20. Deep Learning: Embeddings
❖ Семантическое пространство слов
❖ Но:
❖ Омонимия?
❖ Разные подпростанства, насколько они хороши? Не
очень, но их можно подчинить, задав априорные
знания
❖ Например синтаксические подпростанства можно с
дополнением частей речи делать
❖ Смешанные модели (слова + символы)
21. Интеграция prior knowledge в word2vec
❖ Пихать в word2vec еще и разного рода ограничения:
❖ принадлежность к одному классу = минимальное
расстояние
❖ если класс маленький - более сильное
ограничение
❖ если большой - не так страшно
22. Deep Learning: примитивное использование
❖ word2vec - просто признак для машинного обучения
в модели bag-of-words. Не очень, даже
кластеризация - лучше
❖ С текстом мы имеем дело с последовательностью
слов, имеет смысл word2vec грамотнее.
❖ В глубоком обучении очень простая модель:
рекурентная нейронная сеть.
24. LTSM
❖ С рекуррентными сетями есть проблемы
❖ По сути, они почти ничего не запоминают
❖ LTSM: Long Term Short Memory
❖ Отдельные нейроны (gates) в сети отвечают за память:
❖ Запись, чтение, keep
❖ При эксплуатации - понятно, что это значит
❖ При тренировке - помогают правильно отправить ошибку
назад в прошлое
28. Что мы имеем с DL для NLP?
❖ Обычная история с DL - тренируем на огромных
объемах на GPUs, потом эксплуатируем на CPU
❖ В NLP (особенно LSTM и Recursive NNs) - сложно
переложить на GPU + алгоритм тренировки backprop во
времени или по структуре, да еще и embeddings.
Например, пока Theano грандиозного выигрыша не дает
❖ Плюс: если хотите использовать bleeding edge - надо
писать все самим. Иначе 1-2 годовалой давности
алгоритмы
29. Перейдем к теме Big Data!
❖ Изначально отзывы занимают какие-то GB
❖ Но “готовый” корпус занимает беспрецедентные объемы
данных, например:
❖ 20 тыс предложений = 400Mb данных
❖ В production - поменьше (не всегда), но просто раздать
людям поиграться - уже накладно
❖ Как организовать хранение и обработку данных, чтобы было
возможно ставить много экспериментов и быстро внедрять в
production?
30. Big Data: первый блин
❖ 200 машин на Google Cloud
❖ Cassandra на выделенном сервере
❖ GNU Parallel
❖ Новые пакеты Stanford NLP увеличили
производительность в 50-100x
❖ Зато в это время мы прикрутили свой deep learning и
другие недешевые алгоритмы
❖ Все равно дешевле свой кластер на Hetzner
31. Текущая архитектура Big Data
❖ Кластер на “дорогих” машинах
❖ Хранение - Cassandra
❖ Быстрая запись и чтение, как последовательное, так и по
ключу, масштабируется
❖ Колоночное хранение с компрессией - очень удачно
подходит для такого класса задач
❖ Параллельная обработка
❖ Apache Spark - сейчас только для структурированных
данных, были проблемы с Cassandra
❖ GNU Parallel + HDFS, в будущем - миграция на Spark
32. Неожиданный классный инструмент
❖ У нас куча разных обработчиков на разных языках
(C,Java,Jython,Python,Julia), интегрировать легче всего через раздачу
id в Cassandra и параллельной обработкой
❖ get_ids | parallel -j 8 -S $SERVERS --progress my_script {}
❖ Очень удобно, если надо быстро (буквально минуты) что-то запустить
❖ Может стать долгосрочным временным решением! :)
❖ Планируем переход на Apache Spark в будущем, но пока глючил
драйвер Cassandra, решили подождать
33. Кроме отзывов, еще куча структурированных данных
❖ Apache Spark + GreenplumDB
❖ GreenplumDB - параллельная SQL СУБД класса Vertica, Redshift, т.п.
❖ Совсем недавно вышла в open-source
❖ 2 типа хранилища:
❖ Распределенное кортежное (tuple-based)
❖ Распределенное колоночное с компрессией
❖ По скорости намного медленнее, чем Cassandra для массивно-
параллельной записи (MVCC, что делать), но отлично выполняет
сложные SQL на больших объемах. + не надо бэкапить!
34. Спасибо за внимание!
Вопросы и Ответы
https://ru.linkedin.com/in/velikhov
Общие вопросы: feedback@toprater.com
Для команд: startup@toprater.com