100 строк кода: Анализ тональности твитов

Когда я начал изучать технологии искусственного интеллекта, самой горячей темой был анализ тональности неструктурированного текста, в частности, блогов и твитов. Я попытался реализовать модуль для решения этой задачи, но потерпел неудачу из-за отсутствия возможностей, времени и, что более важно, библиотек! Теперь, когда я приобрел неплохие навыки программирования, и в моем распоряжении отличные библиотеки, доступные на GitHub, я решил сделать вторую попытку. Даже не верится насколько это сейчас легко! Давайте выполним этот проект вместе.

Перед тем как начать программировать, необходимо подготовить инструменты.

Регистрируем приложение для работы с Twitter

  • Переходим на сайт для разработчиков и нажимаем на ссылку My Applications (Мои приложения), которая появляется при наведении курсора на правую верхнюю часть экрана (в районе изображения профиля).
  • Нажимаем Create new app (Создать новое приложение) и заполняем базовую информацию.

  • Переходим в раздел API Keys (Ключи API), прокручиваем страницу вниз и нажимаем Create my access token (Создать мой токен доступа). Обновляем страницу, пока необходимая информация не появится на экране.

  • Далее создаем новый Java-проект в Eclipse и в корневом каталоге проекта создаем файл twitter4j.properties.

  • Записываем в файл следующую информацию:

debug=true

oauth.consumerKey=<api-key-for-your-app>

oauth.consumerSecret=<api-secret-for-your-app>

oauth.accessToken=<access-token>

oauth.accessTokenSecret=<access-token-secret>

Устанавливаем Twitter4J

  • В только что созданном проекте Eclipse, создаем каталог lib.
  • Загружаем последнюю стабильную версию Twitter4J.

  • Распаковываем архив и копируем файл twitter4j-core-xxx.jar в наш каталог lib.

  • Добавляем этот jar-файл в Java Build Path (список файлов, необходимых для сборки проекта). Для этого щелкаем правой клавишей на проекте => Properties => Java Build Path => вкладка Libraries => Add Jars.

  • Теперь пришло время загрузить немного твитов. Создаем класс TweetManager, скопировав следующий код, который, я думаю, не требует пояснений:

import java.util.ArrayList;

import java.util.List;

import twitter4j.Query;

import twitter4j.QueryResult;

import twitter4j.Status;

import twitter4j.Twitter;

import twitter4j.TwitterException;

import twitter4j.TwitterFactory;

public class TweetManager {

public static ArrayList<String> getTweets(String topic) {

Twitter twitter = new TwitterFactory().getInstance();

ArrayList<String> tweetList = new ArrayList<String>();

try {

Query query = new Query(topic);

QueryResult result;

do {

result = twitter.search(query);

List<Status> tweets = result.getTweets();

for (Status tweet : tweets) {

tweetList.add(tweet.getText());

}

} while ((query = result.nextQuery()) != null);

} catch (TwitterException te) {

te.printStackTrace();

System.out.println("Failed to search tweets: " + te.getMessage());

}

return tweetList;

}

}
  • Если Twitter4J не импортируется, необходимо убедиться в том, что мы действительно добавили библиотеку в Java Build Path.

  • Представленный выше класс содержит единственный метод getTweets, который принимает тему в качестве аргумента, выполняет запрос и возвращает список твитов.

Устанавливаем Stanford CoreNLP

  • Загружаем последний релиз библиотеки CoreNLP.
  • Распаковываем архив, копируем следующие файлы в каталог lib нашего проекта и добавляем их в Java Build Path:

    • ejml-xxx.jar

    • stanford-core-nlp-xxx.jar

    • stanford-core-nlp-xxx-models.jar

  • Далее в корневом каталоге проекта создаем файл MyPropFile.properties. Если во время выполнения возникнет ошибка, сообщающая о том, что файл MyPropFile.properties не может быть найден, тогда необходимо переместить его в каталог src. Копируем в этот файл следующую строку:

annotators = tokenize, ssplit, parse, sentiment
  • Подробную информацию о значении каждого параметра можно узнать в разделе Usage на странице библиотеки.

  • Создаем класс NLP, скопировав следующий код:

import edu.stanford.nlp.ling.CoreAnnotations;

import edu.stanford.nlp.neural.rnn.RNNCoreAnnotations;

import edu.stanford.nlp.pipeline.Annotation;

import edu.stanford.nlp.pipeline.StanfordCoreNLP;

import edu.stanford.nlp.sentiment.SentimentCoreAnnotations;

import edu.stanford.nlp.trees.Tree;

import edu.stanford.nlp.util.CoreMap;

public class NLP {

static StanfordCoreNLP pipeline;

public static void init() {

pipeline = new StanfordCoreNLP("MyPropFile.properties");

}

public static int findSentiment(String tweet) {

int mainSentiment = 0;

if (tweet != null && tweet.length() > 0) {

int longest = 0;

Annotation annotation = pipeline.process(tweet);

for (CoreMap sentence : annotation

.get(CoreAnnotations.SentencesAnnotation.class)) {

Tree tree = sentence

.get(SentimentCoreAnnotations.AnnotatedTree.class);

int sentiment = RNNCoreAnnotations.getPredictedClass(tree);

String partText = sentence.toString();

if (partText.length() > longest) {

mainSentiment = sentiment;

longest = partText.length();

}

}

}

return mainSentiment;

}

}
  • Этот класс инициализирует аналитический конвейер (pipeline) на основе файла MyPropFile.properties, а также выполняет другие полезные операции, о чем вы можете подробнее узнать здесь.

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

Собираем все вместе

  • Теперь у нас есть все необходимое, а значит, осталось только объединить эти компоненты. Для этого создаем класс WhatToThink, скопировав следующий код:
import java.util.ArrayList;

public class WhatToThink {

public static void main(String[] args) {

String topic = "ICCT20WC";

ArrayList<String> tweets = TweetManager.getTweets(topic);

NLP.init();

for(String tweet : tweets) {

System.out.println(tweet + " : " + NLP.findSentiment(tweet));

}

}

}
  • Этот класс загружает твиты, соответствующие теме, инициализирует конвейер и подает твиты по одному в анализатор тональности.

Вот, собственно, и все. Запустив проект, сначала мы увидим некоторую техническую информацию, выведенную Twitter4J в процессе загрузки твитов. После этого на экране появится список твитов и оценок их тональности в следующем формате:

<Tweet> : <Sentiment-score>

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

Кстати, я не поместил свой проект на GitHub, потому что он имеет достаточно большой размер: около 400 МБ. Кроме того, не хотелось бы, чтобы кто-нибудь подсмотрел мои ключи. 🙂

Теперь вы знаете, как можно легко анализировать тональность твитов, написав не более 100 строк кода!

Источник

Перевод Станислава Петренко

Автор публикации

не в сети 10 часов

DataReview

Комментарии: 16Публикации: 953Регистрация: 05-06-2014

Вам также может понравиться

Добавить комментарий

Ваш e-mail не будет опубликован.

закрыть

Поделиться

Отправить на почту
закрыть

Вход

закрыть

Регистрация

+ =
Авторизация
*
*

Login form protected by Login LockDown.


Регистрация
*
*
*
*
Генерация пароля