Проведите анализ настроений, используя исторические твиты

В этом примере показано, как искать и извлечь все доступные Tweets за последние 7 дней и импортировать их в MATLAB®. После импорта данных можно провести анализ настроений. Этот анализ позволяет вам определить субъективную информацию, такую как настроения, мнения или эмоциональные реакции, из текстовых данных. Этот пример ищет положительные и отрицательные настроения относительно отрасли финансовых услуг.

Чтобы запустить этот пример, вам нужен Twitter® учетные данные. Чтобы получить эти учетные данные, сначала войдите в свою учетную запись Twitter. Затем заполните форму в Создать заявку.

Для доступа к коду примера введите edit TwitterExample.m в командной строке.

Подключиться к Twitter

Создайте подключение к 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. Импорт Tweet® данные в рабочее пространство MATLAB.

tweetquery = 'financial services';
s = search(c,tweetquery,'count',100);
statuses = s.Body.Data.statuses;
pause(2)

statuses содержит данные Tweet как массив ячеек из 100 структур. Каждая структура содержит поле для текста Tweet, а остальные поля содержат другую информацию о Tweet.

Поиск и извлечение следующих 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

Извлеките время создания и текст каждого Tweet. Получите время создания неструктурированных данных путем доступа к ним в массиве ячеек структур. Для структурированных данных получите доступ ко времени создания путем транспонирования поля в массиве структур.

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 содержит время создания для каждого Tweet. tweetTexts содержит текст для каждого Tweet.

Создайте tweets timetable для всех твитов с использованием текста и времени создания каждого твита.

tweets = timetable(tweetTexts,'RowTimes', ...
    datetime(tweetTimes,'Format','eee MMM dd HH:mm:ss +SSSS yyyy'));

Проведите анализ настроений на Tweets

Создайте глоссарий слов, которые связаны с положительными настроениями.

poskeywords = {'happy','great','good', ...
    'fast','optimized','nice','interesting','amazing','top','award', ...
    'winner','wins','cool','thanks','useful'};

poskeywords - массив ячеек из векторов символов. Каждый вектор символов является словом, которое представляет собой образец положительного настроения.

Поиск слов в каждом Tweet в глоссарии положительных настроений. Определите общее количество твитов, которые содержат положительные настроения. Из общего количества положительных твитов определите общее количество ретвитов.

% 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 - массив ячеек из векторов символов. Каждый вектор символов является словом, которое представляет собой образец негативного настроения.

Поиск слов в каждом Tweet в глоссарии негативных настроений. Определите общее количество твитов, которые содержат отрицательные настроения. Из общего количества отрицательных твитов определите общее количество ретвитов.

% 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'});

Отображение таблицы данных Tweet.

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 твитов являются ретвитами. Из отрицательных Tweets 96 являются Retweets.

См. также

Функции

Объекты

Похожие темы

Внешние веб-сайты