Pull to refresh

Comments 48

Для спойлеров есть тег spoiler, так то!
Так-то пишется через дефис, так-то! :)
Так то «так-то», а «так то» — без дефиса, так-то! Но вы правы, у автора комментария дефис нужен.
Очень интересная статья, спасибо! А остальной код где-то на гитхабе?
И вам спасибо за отзыв. Остальной код ничего хитрого из себя не представляет — стемминг и замена одинаковых слов числами по словарику, поэтому я не стал его оформлять. Если интересно — могу выложить,
Было бы просто отлично, если бы вы выложили код вместе с туториалом, как воспроизвести ваши результаты.
Вообще тема рекурентных сетей выглядит очень перспективно, особенно в связи со своей Тьюринг-Полнотой.
А вы видели где-нибудь вразумительно доказательство? Пока всё что я читал это: «есть мысли что оно всё же Тьюринг-полно». Скорее всего это действительно так, но любопытно было бы увидеть разумное обоснование.
На самом деле прямо формального доказательства полноты по Тьюрингу я не видел, но неоднократно встречал упоминания того, что оно вроде бы существует в природе. Возможно, в учебнике по DL от Бенджио что-то такое есть, но я его еще не прочитал. В статьях встречал только вот такое творчество от DeepMind, где попытались создать модель МТ на основе DL.
Классическое доказательство, см. Siegelmann and Sontag, «On the computational power of neural nets»

Что не значит, однако, что любая рекуррентная сеть обладает этим свойством.
Хорошо, постараюсь до выходных найти время привести код в божеский вид и поделиться с вами :)
Присоединяюсь к просьбе!
Пробуждение силы и так продукт нейронной сети. К тому же нейронную сеть явно переобучили на главной выборке.
Спасибо за статью. Комментарий и вопрос:

1.
>«Результат предсказания сетки мы сравнивали с обыкновенной логистической регрессией, которая показывала [...] примерно те же самые 75%, но при использовании tf-idf для биграмм.»

Ну а так как «принципы действия» этих методов (RNN и bags of bigrams) несколько различаются и они дают не совсем коррелированные предсказания, то при объединении их в ансамбль результат предсказания скорее всего можно заметно улучшить
Скорее всего Вы уже читали статью Миколова и Ко по этому поводу: Ensemble of Generative and Discriminative Techniques for Sentiment Analysis of Movie Reviews Там же есть ссылка (Baselines and Bigrams: Simple, Good Sentiment and Topic Classification) на то, что достаточно простые модели (bags of n-grams + Naive Bayes, SVM и даже NB-SVM) на некоторых датасетах показывают таки лучшие результаты по сравнению с различными вариантами RCC.

2.
>«обучающая выборка была всё-таки маловата (по-честному для такой сети нужно не меньше 1 млн твитов обучающей выборки)»
А вы не пробовали предобучить Embedding слой на не размеченных (т.е. более доступных) данных? Или воспользоваться готовыми обученными моделями типа Word2Vec? Интуитивно кажется, что требования к размеру обучающей выборки тогда ослабеют.

А можно про пункт 2 по-подробнее? почему это может помочь? Может у вас так же будут полезные ссылки по этому поводу?
1. Да, разумеется читали; при решении данной задачи хотелось заодно попробовать новую для себя технологию, на лучшее решение из возможных не претендуем. Так вышло гораздо интереснее на мой взгляд. Вот как раз при сравнении с логрегом убедились, что решение неплохо.

2. Не очень очевидно, что это прям сильно улучшит качество. Да и где взять миллион русских твитов, пусть даже неразмеченных, тоже еще вопрос, я не смог найти подобных датасетов, а выгрузить столько сами мы бы не успели. Качественных предобученных прям на русских твитах-отзывах моделей Word2Vec мне тоже неизвестно. Буду багодарен, если поделитесь ссылкой на таковую или похожие.

Не очень очевидно, что это прям сильно улучшит качество

Как правило это улучшает качество существенно. Правда качество надо еще правильно измерять (см. мой комментарий ниже)

Да и где взять миллион русских твитов, пусть даже неразмеченных

Это и не нужно. вектора предобучаются на любой большой коллекции текстов, например, на википедии. Это легко сделать самостоятельно.
Но ведь в википедии в обиходе совсем иная модель языка, нежели в твиттере. Это как научить ребенка читать азбуку, а потом дать читать Достоевского — прочесть прочитает, но смысл не поймет и передаст с потерями. Для подобного предварительного обучения на «левых» данных нужно использовать ту же самую модель языка, на которой происходит обучение (и с которой в дальнейшем будет работать модель), иначе веса слов будут значительно смещены
Язык все равно остается языком и очень много информации общей между твиттером и википедией. Для остального существует дообучение векторов на вашей выборке. Рассуждения о том, что
Это как научить ребенка читать азбуку, а потом дать читать Достоевского
— это философия. А критерий истины это практика. Если на то пошло, существует в определенных задачах такое явление как обобщение признаков нейронной сетью между разными языками вообще. Проблема главная предобученных векторов для анализа тональности, не условная разница между языками твиттера и вики, а то, что слова вроде «хороший» и «плохой» оказываются рядом в пространстве признаков. Но даже при этом предобученные вектора дают как правило улучшение результатов.
1. По мотивации — солидарен.

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

Про использование предобученного на неразмеченном датасете нижнего слоя конкретно в задаче анализа тональности текста статей не припоминаю, но у ЛеКуна в уже прошлогодней статье Text understanding from Scratch описана попытка расширить текстовый корпус (data augmentation) заменой синонимов из тезауруса. Кстати, в статье изложен любопытный способ обработки текста — текст перекодируют с уровня символов (а не слов!) в изображения, а уж к ним применяют хорошо себя зарекомендовавшую в задачах обработки изображений свёрточную сеть.

Конечно, лексика, грамматика и образы «твиттерного мышления» нексколько отличаются от таковых в развёрнутых текстах. Но… вопрос, насколько.
Конечно, лексика, грамматика и образы «твиттерного мышления» нексколько отличаются от таковых в развёрнутых текстах. Но… вопрос, насколько.

Настолько, что при ограничении в 140 символов люди стараются как можно сильнее ужаться, а на вики наоборот стремятся писать более развернуто. Мне кажется, это значимая разница с точки зрения модели языка. И такие слова как «олдскульно», «дноклы» и «фанатею» вряд ли можно найти на Википедии, нужно в дополнение на Лурке еще обучать, что ли :)
А не расскажете, как обучать оценке тональности на выборках с неуказаной оценкой тональности?
Речь не совсем об этом. Речь о предобучении нижнего слоя, выход из которого можно рассматривать как преобразованные (перекодированные) исходные данные.
А каков на нём критерий обучения?
Так же как и обычно для word embeddings, скорее всего. Положительное подкрепление за замену слова на имеющее такой же контекст в рамках корпуса, штраф за замену на слово, использование которого в данном контексте не подкреплено примером из корпуса.
Тем не менее, Theano это только библиотека для эффективных расчётов, на ней нужно самостоятельно реализовывать backpropagation, нейроны и всё остальное.

Backpropagation как раз автоматом делается — надо только целевую функцию задать, а градиенты Theano сама посчитает. Даже и во времени.
Ну я имел ввиду, что для этого нужно так или иначе отдельную процедуру писать, в keras про это ничего вообще нет.
Точность, имеется в виду accuracy или precision? Хотелось бы увидеть на самом деле F1 для каждого класса на тестовой выборке. Какова доля положительных твитов в обучающей выборке? Судя по графику, положительные твиты доминируют. Если их доля, скажем 70% то функция, которая не делает ничего, а просто возвращает положительный результат для любого твита будет иметь точность (в смысле accuracy), тоже 70% (по доле положительных твитов), поэтому сама по себе цифра 75% кажется высокой, но ни о чем еще не говорит.
имеется в виду Accuracy. Конечно, заранее неизвестно, сколько твитов про Звездные войны положительные, сколько нет, а вот на обучающей выборке классы были сбалансированы, так что положительных примерно 50%
Вы на три класса делите, положительные, нейтральные и отрицательные. Должно быть тогда примерно 33% положительных. Кстати, это Accuracy по какой выборке подсчитано?
75% процентов Accuracy получены при классификации на два класса с threshold = 0.5 в условиях сбалансированных выборок
То есть:
— Вы взяли набор твитов (обо всем на свете, не только о фильмах), разбитых на два класса, и искуственно сбалансированный.
— Обучили нейронную сеть, практически один в один совпадающую с учебным примером из комплекта Keras.
— Не озаботились дать на вход пре-тренированные вектора слов. Судя по комментариям, не знаете даже зачем это нужно и как работает.
— Получили результат, который почти никак не лучше чем baseline логистическая регрессия. Свалили все на малый размер, немаленькой на самом деле выборки в 160 000 штук. 160 000 это очень много! Это более 1 млн. слов. Например, у нас при определении тональности термина в этой работе, в обучающей выборке было около 3000 терминов и всего порядка 60 тыс. слов.

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

Само по себе это не плохо. Программисты часто пишут разнообразные hello world'ы только для того чтобы понять как что-то работает. Разобрать азы. Понятное и очень достойное занятие.

Но это — на минутку — исследование общественного мнения!.. Которое попало в весьма популярную газету и на основании его сделаны там еще какие-то выводы про то, какие люди когда ходили в кино. И вот это вопиющее безобразие. Собрали быстренько нечто, настроили за полдня и вперед. Мы крутые и с нами сила!

Может быть я слишком резко реагирую да.Люди не сильно пострадают, если статистика по мнениям о фильме будет не очень правильной. Просто я слишком много видел, что так же делаются и остальные более серьезные исследования. Имел несчастье лично наблюдать, что в российской медицине, например, полно работ, которые настрогали таким же образом, не обращая внимания на досадные детали люди малознакомые с темой. А потом в газетах «российские ученые открыли...» и дальше нас этим лечат, экстрактом рогов и копыт.

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

Да, и еще. Странно читать обилие просьб к авторам статьи выложить это на github. Вообще-то это там уже есть, как пример от библиотеки keras. Без загрузки-выгрузки данных твиттера правда. Но основной код это именно он.
Скажите, а почему задача деления на три класса намного сложнее, и результаты получаются хуже? Я не спорю, просто хотелось бы узнать больше об этом. Может, поделитесь ссылками. Спасибо!
Чем больше классов мы выделяем, тем ближе они друг к другу находятся и тем хуже определена между ними граница. Это особенно верно для деления на классы непрерывных в общем-то значений, таких как отношение пользователя к чему-либо.

Посмотрите например вот здесь, это результаты тестирования систем по анализу тональности ROMIP 2011 года. Сравните значения F1 в таблице 4, 6 и 7 (два класса, три класса, и пять классов). Ухудшение весьма и весьма значительное. Тоже самое можно видеть и на материалах 2012 года. При анализе коротких фрагментов текста, результаты и того хуже.

Интуитивно можно это представить так. Допустим вам быстро (на секунду) показывают карточки белого и черного цвета и вам надо назвать цвет. Это не сложно. А теперь представьте, что карточек стало три — белый, черный и темно-синий. Число ошибок возрастет.
В данной задаче классификатор только вычислял вероятность того, что отзыв положительный, градуировку шкалы с разбиением на 3 класса делали уже независимо, убедившись в первую очередь, что гистограмма количества твитов в разных диапазонах вероятностей более менее ровная + построив еще несколько графиков, которые не противоречили выбранной гипотезе.
Но без проверки результатов на тестовой выборке с тремя классами. Что тут еще сказать? Посмотрите, по ссылкам в моем комментарии выше, как плохо работают мульти-классовые классификаторы тональности у людей которые их создавали изначально на данных разбитых на n-классов. И которые потратили месяцы, а то и годы на разработку. Можно ли взять вот так пороги посмотрев на диаграммы и получить хороший результат? Да, повезти может и в лотерею. Но учитывая вышесказанное, без доказательств на тестовой выборке разбитой вручную на три класса, я лично в эти данные не верю.
Эх… заминусуют… Но истина дороже.
There are three kinds of lies: lies, damned lies, and statistics

Немного удивлен. Сам с женой сходили на новый эпизод Звездных Войн — досидели только из-за уважения…
Мягко говоря не понравилось…

Многих знакомых поспрашивал в оффлайне. Из 23 респондентов только трое высказали нейтральное мнение и двое положительное…
Это у меня одного реальность такая?
Жаль, что к посту не приложен опрос: «а вам понравился новый эпизод Звездных Войн»?
Да уж, ДВАДЦАТЬ ТРИ респондента из искривленной выборки ваших знакомых — это, конечно, то к чему можно аппелировать словами «истина дороже»…
ну как бы там нибыло могу сюда прибавить еще около 10 своих знакомых (и себя тоже)…

просто неинтересный фильм, не плохой — что хочется написать гадость, и не хороший — что хочется об этом рассказать всем, а такой — что как в том анекдоте «вляпался, так не чирикай» — лень даже идти и ставить оценку…

p.s. но конечно мнения таких респондентов учесть иначе как опросом после выхода с киносеанса нельзя…
Ну да, еще одна искривленная выборка из 11 человек меняет дело )
Тут ведь вопрос в том, что комментатор заявляет, что статистика — ложь, а ему истина дороже. То есть свое мнение и мнение 23 своих знакомых считает более истинным чем 160000 отзывов. Никак не озаботившись даже не только размером выборки, но и ее соответствием ген.совокупности зрителей фильма.
Никто не говорит что меняет,
я же объяснил в своем прошлом сообщении — очень, очень, очень многие вообще не испытали никаких эмоций к фильму, поэтому и не написали ничего…

и то что будет много отзывов молодежи от 14 до 22 и именно они положительно отзовутся сомнения ни у кого не было — тут фильм, что называется «попал в своего зрителя»… — и отзывы это подтвердили…
Прочитала с большим интересом, спасибо! Вот тут когда-то писали про сентимент-анализ русскоязычного текста.
Пару вопросов:
1) насколько я знаю, twitterSearch вытягивает данные только за последнюю неделю или около того. Вы их и анализировали?
2) почему брали только твиты с хештегами, а не просто упоминаниями?
3) правильно ли я понимаю, что это поиск по русскоязычным твитам, а не по пользователям из России?
Спасибо!
Спасибо за отзыв! Отвечаю:
1) вообще twitter всегда отдает частично неполные данные за период не более 6 — 9 дней с момента запроса и это не зависит от способа их получения, я собирал данные в течение трех дней, таким образом набрал твиты за 10 дней
2) Вообще хештег это просто ссылка на результат поиска, а при поиске Твиттер не учитывает символ #, так что это аналогично поиску по упоминаниями
3) Поиск по русскоязычным твитам, в API Твиттера можно указать желаемый язык твита; геопозиция, к сожалению, указана у очень маленького процента твитов
Насколько я понимаю, чтобы получить твиты за более длительный период, нужно использовать Streaming API, но когда я пыталась это сделать, не смогла преодолеть проблемы с аутентификацией (т.е. Search API работал, а Streaming API нет)

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

И еще вопрос (я прошу прощения, просто тема очень интересная): почему вы брали только твиттер? Насколько я знаю, это не самая популярная в России соц.сеть.
Streaming API вроде как немножко другое. В такой клиент будут пушиться новые твиты, которые подходят под заданный критерий, старые, по моему, таким образом не достать.

Получается, да. Реально наблюдал очень низкий процент.

Открытые API есть только у VK и Twitter, доступ к остальным получить несколько сложнее и ограничения там жеще. Я пытался анализировать и записи VK, но большинство из них по данным хештегам либо реклама, либо картинки, либо музыка, текстов обычных пользователей реально очень мало.
Скажите пожалуйста,

Описанный вами подход, для данной, задачи не является ли немного избыточным? Не кажется ли вам что обычная автоматическая классификация методом, скажем, максимальной энтропии, могла бы справится блестяще с данной задачей? Если я правильно понял, то вы изначально собрали corpus по трем категориям?
Скажем так, не я первый такой подход применил. Уже писал выше — вместе с проведением исследования заодно хотелось освоить новую технологию. Метод максимальной энтропии справился бы превосходно, я сравнивал предложенный метод с некоторыми другими более простыми методами, качество работы нейронной сети не хуже. В частности в статье указывается, что log-reg на tf-idf по биграммам слов показывает такое же качество, остальные были чуть похуже
Sign up to leave a comment.