exponenta event banner

Проведение анализа настроений с использованием исторических твитов

В этом примере показано, как искать и извлекать все доступные твиты за последние 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. Импорт данных твита ® в рабочую область 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 являются ретвитами.

См. также

Функции

Объекты

Связанные темы

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