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 строк кода!

Источник

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

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

Ваш адрес email не будет опубликован.

закрыть

Поделиться

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

Вход

закрыть

Регистрация

+ =