В этом примере показано, как искать и извлекать все доступные твиты за последние 7 дней и импортировать их в MATLAB ®. После импорта данных можно выполнить анализ настроений. Этот анализ позволяет определить субъективную информацию, такую как настроения, мнения или эмоциональные реакции, из текстовых данных. В этом примере проводится поиск позитивных и негативных настроений в отношении индустрии финансовых услуг.
Для выполнения этого примера необходимы учетные данные Twitter ®. Чтобы получить эти учетные данные, необходимо сначала войти в свою учетную запись Twitter. Затем заполните форму в разделе Создание приложения.
Для вызова кода примера введите edit TwitterExample.m в командной строке.
Создайте подключение к Twitter, используя свои учетные данные. (Значения в этом примере не представляют реальные учетные данные Twitter.)
consumerkey = 'abcdefghijklmnop123456789'; consumersecret = 'qrstuvwxyz123456789'; accesstoken = '123456789abcdefghijklmnop'; accesstokensecret = '123456789qrstuvwxyz'; c = twitter(consumerkey,consumersecret,accesstoken,accesstokensecret);
Проверьте подключение к Twitter. Если StatusCode свойство имеет значение OK, подключение выполнено успешно.
c.StatusCode
ans =
OKПоиск последних 100 твитов об индустрии финансовых услуг с помощью объекта подключения Twitter. Использовать поисковый термин financial services. Импорт данных твита ® в рабочую область MATLAB.
tweetquery = 'financial services'; s = search(c,tweetquery,'count',100); statuses = s.Body.Data.statuses; pause(2)
statuses содержит данные твита в виде массива ячеек из 100 структур. Каждая структура содержит поле для текста твита, а остальные поля содержат другую информацию о твите.
Найдите и извлеките следующие 100 твитов, которые произошли после предыдущего запроса.
sRefresh = search(c,tweetquery,'count',100, ... 'since_id',s.Body.Data.search_metadata.max_id_str); statuses = [statuses;sRefresh.Body.Data.statuses];
statuses содержит последние 100 твитов в дополнение к предыдущим 100 твитам.
Получение всех доступных твитов об индустрии финансовых услуг с помощью while цикл. Проверьте наличие данных с помощью isfield функция и поле структуры next_results.
while isfield(s.Body.Data.search_metadata,'next_results') % Convert results to string nextresults = string(s.Body.Data.search_metadata.next_results); % Extract maximum Tweet identifier max_id = extractBetween(nextresults,"max_id=","&"); % Convert maximum Tweet identifier to a character vector cmax_id = char(max_id); % Search for Tweets s = search(c,tweetquery,'count',100,'max_id',cmax_id); % Retrieve Tweet text for each Tweet statuses = [statuses;s.Body.Data.statuses]; end
Извлеките время создания и текст каждого твита. Получение времени создания неструктурированных данных путем доступа к ним в массиве ячеек структур. Для структурированных данных необходимо получить доступ к времени создания путем переноса поля в массиве структуры.
if iscell(statuses) % Unstructured data numTweets = length(statuses); % Determine total number of Tweets tweetTimes = cell(numTweets,1); % Allocate space for Tweet times and Tweet text tweetTexts = tweetTimes; for i = 1:numTweets tweetTimes{i} = statuses{i}.created_at; % Retrieve the time each Tweet was created tweetTexts{i} = statuses{i}.text; % Retrieve the text of each Tweet end else % Structured data tweetTimes = {statuses.created_at}'; tweetTexts = {statuses.text}'; end
tweetTimes содержит время создания каждого твита. tweetTexts содержит текст для каждого твита.
Создание расписания tweets для всех твитов с использованием текста и времени создания каждого твита.
tweets = timetable(tweetTexts,'RowTimes', ... datetime(tweetTimes,'Format','eee MMM dd HH:mm:ss +SSSS yyyy'));
Создайте глоссарий слов, связанных с позитивными настроениями.
poskeywords = {'happy','great','good', ...
'fast','optimized','nice','interesting','amazing','top','award', ...
'winner','wins','cool','thanks','useful'};
poskeywords является массивом ячеек символьных векторов. Каждый символьный вектор - это слово, представляющее экземпляр положительных настроений.
Ищите в каждом твите слова из глоссария положительных настроений. Определите общее количество твитов, содержащих положительные настроения. Из общего числа положительных твитов определите общее количество ретвитов.
% Determine the total number of Tweets numTweets = height(tweets); % Determine the positive Tweets numPosTweets = 0; numPosRTs = 0; for i = 1:numTweets % Compare Tweet to positive sentiment glossary dJobs = contains(tweets.tweetTexts{i},poskeywords,'IgnoreCase',true); if dJobs % Increase total count of Tweets with positive sentiment by one numPosTweets = numPosTweets + 1; % Determine if positive Tweet is a Retweet RTs = strncmp('RT @',tweets.tweetTexts{i},4); if RTs % Increase total count of positive Retweets by one numPosRTs = numPosRTs + 1; end end end
numPosTweets содержит общее количество твитов с положительными настроениями.
numPosRTs содержит общее число ретвитов с положительными настроениями.
Создайте глоссарий слов, связанных с негативными настроениями.
negkeywords = {'sad','poor','bad','slow','weaken','mean','boring', ...
'ordinary','bottom','loss','loser','loses','uncool', ...
'criticism','useless'};negkeywords является массивом ячеек символьных векторов. Каждый символьный вектор - это слово, представляющее экземпляр отрицательных настроений.
Ищите в каждом твите слова в глоссарии негативных настроений. Определите общее количество твитов, содержащих негативные настроения. Из общего числа отрицательных твитов определите общее количество ретвитов.
% Determine the negative Tweets numNegTweets = 0; numNegRTs = 0; for i = 1:numTweets % Compare Tweet to negative sentiment glossary dJobs = contains(tweets.tweetTexts{i},negkeywords,'IgnoreCase',true); if dJobs % Increase total count of Tweets with negative sentiment by one numNegTweets = numNegTweets + 1; % Determine if negative Tweet is a Retweet RTs = strncmp('RT @',tweets.tweetTexts{i},4); if RTs numNegRTs = numNegRTs + 1; end end end
numNegTweets содержит общее число твитов с отрицательными настроениями.
numNegRTs содержит общее число ретвитов с отрицательными настроениями.
Создание таблицы со столбцами, содержащими:
Количество твитов
Количество твитов с позитивными настроениями
Количество положительных ретвитов
Количество твитов с негативными настроениями
Количество отрицательных ретвитов
matlabTweetTable = table(numTweets,numPosTweets,numPosRTs,numNegTweets,numNegRTs, ... 'VariableNames',{'Number_of_Tweets','Positive_Tweets','Positive_Retweets', ... 'Negative_Tweets','Negative_Retweets'});
Отображение таблицы данных твита.
matlabTweetTable
matlabTweetTable =
1×5 table
Number_of_Tweets Positive_Tweets Positive_Retweets Negative_Tweets Negative_Retweets
________________ _______________ _________________ _______________ _________________
11465 688 238 201 96
Из 11 465 твитов об индустрии финансовых услуг за последние 7 дней 688 твитов имеют положительные настроения, а 201 твит имеет отрицательные настроения. Из положительных твитов 238 твитов являются ретвитами. Из отрицательных твитов 96 являются ретвитами.