Алгоритм определения того, насколько положительным или отрицательным является утверждение / текст - PullRequest
62 голосов
/ 15 ноября 2008

Мне нужен алгоритм, чтобы определить, является ли предложение, абзац или статья отрицательным или положительным по тону ... или еще лучше, насколько отрицательным или положительным.

Например:

Джейсон - худший пользователь SO, которого я когда-либо видел (-10)

Джейсон - SO (0)

Джейсон - лучший SO, которого я когда-либо видел (+10)

Джейсон лучше всех сосет с SO (-10)

В то время как в СО, Джейсон хуже всех делает (+10)

Не легко, а? :)

Я не ожидаю, что кто-то объяснит мне этот алгоритм, но я предполагаю, что где-то в академии уже много работы над чем-то подобным. Если вы можете указать мне некоторые статьи или исследования, мне бы это понравилось.

Спасибо.

Ответы [ 14 ]

48 голосов
/ 15 ноября 2008

Существует подполе обработки естественного языка, называемое анализ настроений , которое конкретно относится к этой проблемной области. В этой области проделана значительная коммерческая работа, потому что потребительские продукты так активно рассматриваются на онлайн-форумах пользователей (UGC или пользовательский контент). Существует также прототип платформы для анализа текста, названный GATE из университета Шеффилда, и проект Python, названный nltk . Оба считаются гибкими, но не очень высокими характеристиками. Один или другой могут быть полезны для разработки ваших собственных идей.

34 голосов
/ 24 декабря 2008

В моей компании есть продукт, который делает это, а также хорошо работает. Я сделал большую часть работы над этим. Я могу дать краткое представление:

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

Некоторые предложения, даже если они разделены, должны быть объединены.

Например: продукт потрясающий, отличный и фантастический.

Мы разработали исчерпывающий набор правил о типе предложений, которые должны быть разделены, а какие не должны (на основе POS-тегов слов)

На первом уровне вы можете использовать подход с набором слов, что означает - иметь список положительных и отрицательных слов / фраз и проверять каждое под-предложение. При этом также обратите внимание на слова отрицания, такие как «нет», «нет» и т. Д., Которые изменят полярность предложения.

Даже если вы не можете найти чувства, вы можете пойти на наивный байесовский подход . Этот подход не очень точен (около 60%). Но если вы примените это только к предложению, которое не проходит через первый набор правил - вы можете легко получить точность 80-85%.

Важная часть - это список положительных / отрицательных слов и способ, которым вы разбиваетесь на части. Если хотите, вы можете подняться даже на уровень выше, внедрив HMM (скрытая модель Маркова) или CRF (условные случайные поля). Но я не профессионал в НЛП, и кто-то другой может заполнить вас в этой части.

Для любопытных людей мы реализовали все это - python с NLTK и модулем Reverend Bayes.

Довольно просто и обрабатывает большинство предложений. Однако вы можете столкнуться с проблемами при попытке пометить контент из Интернета. Большинство людей не пишут правильные предложения в Интернете. Также очень трудно справиться с сарказмом.

8 голосов
/ 15 ноября 2008

Это подпадает под эгиду Обработка естественного языка , поэтому чтение об этом, вероятно, является хорошим началом.

Если вы не хотите входить в очень сложную проблему, вы можете просто создать списки «положительных» и «отрицательных» слов (и взвесить их, если хотите) и выполнить подсчет слов по разделам текста. Очевидно, что это не «умное» решение, но оно дает вам некоторую информацию с очень небольшим количеством работы, где выполнение серьезного НЛП будет очень много времени.

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

5 голосов
/ 16 ноября 2008

В зависимости от вашего приложения вы можете сделать это с помощью алгоритма Байесовской фильтрации (который часто используется в фильтрах спама).

Один из способов сделать это - два фильтра. Один для позитивных документов, а другой для негативных документов. Вы должны заполнить положительный фильтр положительными документами (какими бы критериями вы не пользовались) и отрицательный фильтр отрицательными документами. Хитрость заключается в том, чтобы найти эти документы. Может быть, вы могли бы настроить его так, чтобы ваши пользователи эффективно оценивали документы.

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

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

Байесовские фильтры, хотя и просты, но удивительно эффективны.

5 голосов
/ 16 ноября 2008

Как уже отмечалось, это относится к анализу настроений при обработке естественного языка.
В Afaik GATE нет компонента, который выполняет анализ настроений.
Исходя из своего опыта, я реализовал алгоритм, который является адаптацией алгоритма, описанного в статье «Признание контекстуальной полярности в анализе настроений на уровне фраз» Терезы Уилсон, Джанис Уиб, Пола Хоффмана ( this ) в Плагин GATE, который дает разумные хорошие результаты. Это может помочь вам, если вы хотите запустить реализацию.

3 голосов
/ 21 февраля 2012

Вы можете сделать так:

    Jason is the worst SO user I have ever witnessed (-10)

худшее (-), остальное (+). так что это будет (-) + (+) = (-)

    Jason is an SO user (0)

() + () = ()

    Jason is the best SO user I have ever seen (+10)

лучший (+), остальное (). так что это будет (+) + () = (+)

    Jason is the best at sucking with SO (-10)

лучше всего (+), сосать (-). Итак, (+) + (-) = (-)

    While, okay at SO, Jason is the worst at doing bad (+10)

худший (-), плохой (-). Итак, (-) + (-) = (+)

1 голос
/ 15 июля 2016

Это старый вопрос, но я наткнулся на него, когда искал инструмент, который мог бы анализировать тон статьи, и нашел IBM 100 * Watson Tone Analyzer . Это позволяет 1000 звонков API ежемесячно бесплатно.

1 голос
/ 19 декабря 2014

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

weka алгоритмы классификации

  • SVM
  • наивный басиан
  • J48

    Только вы должны проделать эту модель в вашем контексте, добавить выбранный вектор и настройку на основе правил. В моем случае я получил некоторые (точность 61%). Итак, мы переходим в stanford core nlp (они обучили свою модель для обзоров фильмов), и мы использовали их тренировочный набор и добавили наш тренировочный набор. мы могли достичь точности 80-90%.

0 голосов
/ 24 ноября 2018

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

Я бы предложил использовать несколько инструментов и использовать механизм агрегации или голосования, чтобы определить интенсивность настроения. Лучшее исследование по инструментам анализа настроений, с которым я столкнулся, это SentiBench . Вы найдете это полезным.

0 голосов
/ 23 августа 2011
   use Algorithm::NaiveBayes;
     my $nb = Algorithm::NaiveBayes->new;

     $nb->add_instance
       (attributes => {foo => 1, bar => 1, baz => 3},
        label => 'sports');

     $nb->add_instance
       (attributes => {foo => 2, blurp => 1},
        label => ['sports', 'finance']);

     ... repeat for several more instances, then:
     $nb->train;

     # Find results for unseen instances
     my $result = $nb->predict
       (attributes => {bar => 3, blurp => 2});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...