Когда я начал изучать технологии искусственного интеллекта, самой горячей темой был анализ тональности неструктурированного текста, в частности, блогов и твитов. Я попытался реализовать модуль для решения этой задачи, но потерпел неудачу из-за отсутствия возможностей, времени и, что более важно, библиотек! Теперь, когда я приобрел неплохие навыки программирования, и в моем распоряжении отличные библиотеки, доступные на 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 ArrayListgetTweets(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"; ArrayListtweets = TweetManager.getTweets(topic); NLP.init(); for(String tweet : tweets) { System.out.println(tweet + " : " + NLP.findSentiment(tweet)); } } }
-
Этот класс загружает твиты, соответствующие теме, инициализирует конвейер и подает твиты по одному в анализатор тональности.
Вот, собственно, и все. Запустив проект, сначала мы увидим некоторую техническую информацию, выведенную Twitter4J в процессе загрузки твитов. После этого на экране появится список твитов и оценок их тональности в следующем формате:
:
Мы можем существенно улучшить результат, выполняя очистку твитов перед их анализом, поскольку большинство твитов содержат бесполезные данные, такие как имена пользователей, ссылки, хештеги и др. Для очистки твитов можно использовать, например, эту отличную библиотеку.
Кстати, я не поместил свой проект на GitHub, потому что он имеет достаточно большой размер: около 400 МБ. Кроме того, не хотелось бы, чтобы кто-нибудь подсмотрел мои ключи. 🙂
Теперь вы знаете, как можно легко анализировать тональность твитов, написав не более 100 строк кода!
Перевод Станислава Петренко