Алгоритм для определения того, как положительный или отрицательный оператор/текст

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

Например:

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

     

Jason - пользователь SO (0)

     

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

     

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

     

Пока, хорошо в SO, Джейсон хуже всего делает плохо (+10)

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

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

Спасибо.

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

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

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

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

Ответ 3

Это подпадает под зонтиком Natural Language Processing, и поэтому чтение о том, что это, вероятно, хорошее место для начала.

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

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

Ответ 4

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

Ответ 5

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

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

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

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

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

Ответ 6

Вы можете сделать следующее:

    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)

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

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

лучший (+), сосание (-). так что (+) + (-) = (-)

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

худшее (-), плохое (-). так что (-) + (-) = (+)

Ответ 7

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

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

  • SVM
  • наивный базовый
  • J48

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

Ответ 8

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

Ответ 9

Это все о контексте, я думаю. Если вы ищете людей, которые лучше всего сосать с SO. Сосать лучшее может быть положительным. Для определения, что плохо или хорошо, и сколько я мог бы порекомендовать в Fuzzy Logic.

Это немного похоже на высокий. Кто-то, кто 1,95 м, может считаться высоким. Если вы помещаете этого человека в группу с людьми со всего 2.10m, он выглядит коротким.

Ответ 10

Может быть, может быть использовано программное обеспечение для оценки эссе для оценки тона? WIRED.
Возможная ссылка. (Я не мог его прочитать.)
В этом отчете сравнивается навык написания с уровнем уровня Flesch-Kincaid, необходимым для его чтения!
Страница 4 из e-rator говорит, что они смотрят на неправильное обращение и тому подобное. (Может быть, плохой пост тоже написано неправильно)

Slashdot.

Вы также можете использовать какой-либо фильтр электронной почты для негатива, а не спама.

Ответ 11

Как насчет сарказма:

  • Джейсон - лучший пользователь SO, которого я когда-либо видел, НЕ
  • Джейсон - лучший пользователь SO, которого я когда-либо видел, справа

Ответ 12

А, я помню одну библиотеку java для этого LingPipe (коммерческая лицензия), которую мы оценили. Это будет хорошо работать для примера corpus, который доступен на сайте, но для реальных данных он отстой очень плохо.

Ответ 13

   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});