exponenta event banner

Подготовка классификатора настроений

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

Предварительно подготовленное вложение слов играет несколько ролей в этом рабочем процессе. Он преобразует слова в числовые векторы и формирует основу для классификатора. Затем с помощью классификатора можно предсказать настроения других слов, используя их векторное представление, и использовать эти классификации для вычисления настроений части текста. Существует четыре этапа обучения и использования классификатора настроений:

  • Загрузите предварительно подготовленное вложение слов.

  • Загрузить лексикон заключения с перечислением положительных и отрицательных слов.

  • Обучить классификатор настроений, используя векторы слов положительных и отрицательных слов.

  • Вычислите средние оценки чувств слов в тексте.

Загрузка предварительно обученного встраивания слов

Слово встраивает слова в словарь в числовые векторы. Эти вложения могут захватывать семантические детали слов так, чтобы подобные слова имели схожие векторы. Они также моделируют отношения между словами через векторную арифметику. Например, отношение Рима к Парижу, как Италия к Франции, описывается уравнением Rome-Italy+France≈Paris.

Загрузите предварительно подготовленное вложение слов с помощью fastTextWordEmbedding функция. Для выполнения этой функции требуется модель Text Analytics Toolbox™ для пакета поддержки внедрения Token Word на английском языке на 16 миллиардов. Если этот пакет поддержки не установлен, функция предоставляет ссылку для загрузки.

emb = fastTextWordEmbedding;

Лексикон заключения о нагрузке

Загрузить положительные и отрицательные слова из лексикона мнений (также известного как лексикон настроений) из https://www.cs.uic.edu/~liub/FBS/sentiment-analysis.html. [1] Сначала извлеките файлы из .rar файл в папку с именем opinion-lexicon-English, а затем импортировать текст.

Загрузите данные с помощью функции readLexicon в конце этого примера. Продукция data является таблицей с переменными Word содержащие слова, и Label содержащий категорическую метку настроения, Positive или Negative.

data = readLexicon;

Просмотрите первые слова, помеченные как положительные.

idx = data.Label == "Positive";
head(data(idx,:))
ans=8×2 table
        Word         Label  
    ____________    ________

    "a+"            Positive
    "abound"        Positive
    "abounds"       Positive
    "abundance"     Positive
    "abundant"      Positive
    "accessable"    Positive
    "accessible"    Positive
    "acclaim"       Positive

Просмотрите первые слова, помеченные как отрицательные.

idx = data.Label == "Negative";
head(data(idx,:))
ans=8×2 table
        Word          Label  
    _____________    ________

    "2-faced"        Negative
    "2-faces"        Negative
    "abnormal"       Negative
    "abolish"        Negative
    "abominable"     Negative
    "abominably"     Negative
    "abominate"      Negative
    "abomination"    Negative

Подготовка данных для обучения

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

idx = ~isVocabularyWord(emb,data.Word);
data(idx,:) = [];

Отложите 10% слов случайным образом для тестирования.

numWords = size(data,1);
cvp = cvpartition(numWords,'HoldOut',0.1);
dataTrain = data(training(cvp),:);
dataTest = data(test(cvp),:);

Преобразование слов в учебных данных в векторы слов с помощью word2vec.

wordsTrain = dataTrain.Word;
XTrain = word2vec(emb,wordsTrain);
YTrain = dataTrain.Label;

Классификатор настроений поезда

Обучить классификатор вспомогательных векторов (SVM), который классифицирует векторы слов на положительные и отрицательные категории.

mdl = fitcsvm(XTrain,YTrain);

Классификатор испытаний

Преобразование слов в тестовых данных в векторы слов с помощью word2vec.

wordsTest = dataTest.Word;
XTest = word2vec(emb,wordsTest);
YTest = dataTest.Label;

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

[YPred,scores] = predict(mdl,XTest);

Визуализация точности классификации в матрице путаницы.

figure
confusionchart(YTest,YPred);

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

figure
subplot(1,2,1)
idx = YPred == "Positive";
wordcloud(wordsTest(idx),scores(idx,1));
title("Predicted Positive Sentiment")

subplot(1,2,2)
wordcloud(wordsTest(~idx),scores(~idx,2));
title("Predicted Negative Sentiment")

Расчет настроений коллекций текста

Чтобы вычислить настроение части текста, например обновление в социальных сетях, спрогнозировать оценку чувств каждого слова в тексте и взять среднюю оценку чувств.

filename = "weekendUpdates.xlsx";
tbl = readtable(filename,'TextType','string');
textData = tbl.TextData;
textData(1:10)
ans = 10×1 string array
    "Happy anniversary! ❤ Next stop: Paris! ✈ #vacation"
    "Haha, BBQ on the beach, engage smug mode!   ❤  #vacation"
    "getting ready for Saturday night  #yum #weekend "
    "Say it with me - I NEED A #VACATION!!! ☹"
    " Chilling  at home for the first time in ages…This is the life!  #weekend"
    "My last #weekend before the exam  ."
    "can’t believe my #vacation is over  so unfair"
    "Can’t wait for tennis this #weekend  "
    "I had so much fun!  Best trip EVER!  #vacation #weekend"
    "Hot weather and air con broke in car  #sweaty #roadtrip #vacation"

Создайте функцию, которая маркирует и предварительно обрабатывает текстовые данные, чтобы их можно было использовать для анализа. Функция preprocessText, перечисленное в конце примера, выполняет следующие шаги в порядке:

  1. Маркировка текста с помощью tokenizedDocument.

  2. Стереть пунктуацию с помощью erasePunctuation.

  3. Удалите стоп-слова (например, «и», «of» и «the»), используя removeStopWords.

  4. Преобразовать в нижний регистр с помощью lower.

Использовать функцию предварительной обработки preprocessText для подготовки текстовых данных. Выполнение этого шага может занять несколько минут.

documents = preprocessText(textData);

Удалить слова из документов, которые не отображаются в слове встраивания emb.

idx = ~isVocabularyWord(emb,documents.Vocabulary);
documents = removeWords(documents,idx);

Чтобы визуализировать, насколько хорошо классификатор настроений обобщает новый текст, классифицирует настроения на словах, встречающихся в тексте, но не в обучающих данных и визуализирует их в облаках слов. Используйте облака слов, чтобы вручную проверить, что классификатор ведет себя так, как ожидалось.

words = documents.Vocabulary;
words(ismember(words,wordsTrain)) = [];

vec = word2vec(emb,words);
[YPred,scores] = predict(mdl,vec);

figure
subplot(1,2,1)
idx = YPred == "Positive";
wordcloud(words(idx),scores(idx,1));
title("Predicted Positive Sentiment")

subplot(1,2,2)
wordcloud(words(~idx),scores(~idx,2));
title("Predicted Negative Sentiment")

Чтобы вычислить настроение данного фрагмента текста, вычислите оценку чувств для каждого слова в тексте и вычислите среднюю оценку чувств.

Рассчитайте средний балл настроения обновлений. Для каждого документа преобразуйте слова в векторы слов, прогнозируйте оценку настроения на векторах слов, преобразуйте оценки, используя функцию преобразования «оценка-задняя», а затем вычисляйте среднюю оценку настроения.

for i = 1:numel(documents)
    words = string(documents(i));
    vec = word2vec(emb,words);
    [~,scores] = predict(mdl,vec);
    sentimentScore(i) = mean(scores(:,1));
end

Просмотр прогнозируемых оценок настроения с текстовыми данными. Баллы больше 0 соответствуют положительным настроениям, баллы меньше 0 соответствуют отрицательным настроениям, а баллы, близкие к 0, соответствуют нейтральным настроениям.

table(sentimentScore', textData)
ans=50×2 table
       Var1                                                                textData                                                          
    __________    ___________________________________________________________________________________________________________________________

        1.8382    "Happy anniversary! ❤ Next stop: Paris! ✈ #vacation"                                                                       
         1.294    "Haha, BBQ on the beach, engage smug mode!   ❤  #vacation"                                                           
        1.0922    "getting ready for Saturday night  #yum #weekend "                                                                     
      0.094709    "Say it with me - I NEED A #VACATION!!! ☹"                                                                                 
        1.4073    " Chilling  at home for the first time in ages…This is the life!  #weekend"                                          
       -0.8356    "My last #weekend before the exam  ."                                                                                  
       -1.3556    "can’t believe my #vacation is over  so unfair"                                                                          
        1.4312    "Can’t wait for tennis this #weekend  "                                                                            
        3.0458    "I had so much fun!  Best trip EVER!  #vacation #weekend"                                                      
      -0.39243    "Hot weather and air con broke in car  #sweaty #roadtrip #vacation"                                                      
        0.8028    " Check the out-of-office crew, we are officially ON #VACATION!! "                                                     
       0.38217    "Well that wasn’t how I expected this #weekend to go  Total washout!! "                                                
          3.03    "So excited for my bestie to visit this #weekend!  ❤ "                                                                 
        2.3849    "Who needs a #vacation when the weather is this good ☀ "                                                                 
    -0.0006176    "I love meetings in summer that run into the weekend! Wait that was sarcasm. Bring on the aircon apocalypse!  ☹ #weekend"
       0.52992    "You know we all worked hard for this! We totes deserve this  #vacation  Ibiza ain’t gonna know what hit em "        
      ⋮

Функция чтения лексикона

Эта функция считывает положительные и отрицательные слова из лексикона настроения и возвращает таблицу. Таблица содержит переменные Word и Label, где Label содержит категориальные значения Positive и Negative соответствует настроению каждого слова.

function data = readLexicon

% Read positive words
fidPositive = fopen(fullfile('opinion-lexicon-English','positive-words.txt'));
C = textscan(fidPositive,'%s','CommentStyle',';');
wordsPositive = string(C{1});

% Read negative words
fidNegative = fopen(fullfile('opinion-lexicon-English','negative-words.txt'));
C = textscan(fidNegative,'%s','CommentStyle',';');
wordsNegative = string(C{1});
fclose all;

% Create table of labeled words
words = [wordsPositive;wordsNegative];
labels = categorical(nan(numel(words),1));
labels(1:numel(wordsPositive)) = "Positive";
labels(numel(wordsPositive)+1:end) = "Negative";

data = table(words,labels,'VariableNames',{'Word','Label'});

end

Функция предварительной обработки

Функция preprocessText выполняет следующие шаги:

  1. Маркировка текста с помощью tokenizedDocument.

  2. Стереть пунктуацию с помощью erasePunctuation.

  3. Удалите стоп-слова (например, «и», «of» и «the»), используя removeStopWords.

  4. Преобразовать в нижний регистр с помощью lower.

function documents = preprocessText(textData)

% Tokenize the text.
documents = tokenizedDocument(textData);

% Erase punctuation.
documents = erasePunctuation(documents);

% Remove a list of stop words.
documents = removeStopWords(documents);

% Convert to lowercase.
documents = lower(documents);

end

Библиография

  1. Ху, Минцин и Бин Лю. «Анализ и обобщение отзывов клиентов». В трудах десятой международной конференции ACM SIGKDD по открытию знаний и анализу данных, стр. 168-177. ACM, 2004.

См. также

| | | | | | |

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