Когда я начал изучать технологии искусственного интеллекта, самой горячей темой был анализ тональности неструктурированного текста, в частности, блогов и твитов. Я попытался реализовать модуль для решения этой задачи, но потерпел неудачу из-за отсутствия возможностей, времени и, что более важно, библиотек! Теперь, когда я приобрел неплохие навыки программирования, и в моем распоряжении отличные библиотеки, доступные на GitHub, я решил сделать вторую попытку. Даже не верится насколько это сейчас легко! Давайте выполним этот проект вместе.
Перед тем как начать программировать, необходимо подготовить инструменты.
Регистрируем приложение для работы с Twitter
- Переходим на сайт для разработчиков и нажимаем на ссылку My Applications (Мои приложения), которая появляется при наведении курсора на правую верхнюю часть экрана (в районе изображения профиля).
-
Нажимаем Create new app (Создать новое приложение) и заполняем базовую информацию.
-
Переходим в раздел API Keys (Ключи API), прокручиваем страницу вниз и нажимаем Create my access token (Создать мой токен доступа). Обновляем страницу, пока необходимая информация не появится на экране.
-
Далее создаем новый Java-проект в Eclipse и в корневом каталоге проекта создаем файл twitter4j.properties.
-
Записываем в файл следующую информацию:
debug=true oauth.consumerKey=oauth.consumerSecret= oauth.accessToken= oauth.accessTokenSecret=
Устанавливаем 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 getTweets(String topic) {
Twitter twitter = new TwitterFactory().getInstance();
ArrayList tweetList = new ArrayList();
try {
Query query = new Query(topic);
QueryResult result;
do {
result = twitter.search(query);
List 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 tweets = TweetManager.getTweets(topic);
NLP.init();
for(String tweet : tweets) {
System.out.println(tweet + " : " + NLP.findSentiment(tweet));
}
}
}
-
Этот класс загружает твиты, соответствующие теме, инициализирует конвейер и подает твиты по одному в анализатор тональности.
Вот, собственно, и все. Запустив проект, сначала мы увидим некоторую техническую информацию, выведенную Twitter4J в процессе загрузки твитов. После этого на экране появится список твитов и оценок их тональности в следующем формате:
:
Мы можем существенно улучшить результат, выполняя очистку твитов перед их анализом, поскольку большинство твитов содержат бесполезные данные, такие как имена пользователей, ссылки, хештеги и др. Для очистки твитов можно использовать, например, эту отличную библиотеку.
Кстати, я не поместил свой проект на GitHub, потому что он имеет достаточно большой размер: около 400 МБ. Кроме того, не хотелось бы, чтобы кто-нибудь подсмотрел мои ключи. 🙂
Теперь вы знаете, как можно легко анализировать тональность твитов, написав не более 100 строк кода!
Перевод Станислава Петренко
