Обучите классификатор чувства

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

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

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

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

  • Обучите классификатор чувства с помощью векторов слова положительных и отрицательных слов.

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

Чтобы воспроизвести результаты в этом примере, установите rng к 'default'.

rng('default')

Загрузите предварительно обученный Word Embedding

Вложения Word сопоставляют слова в словаре к числовым векторам. Эти вложения могут получить семантические детали слов так, чтобы подобные слова имели подобные векторы. Они также отношения модели между словами через векторную арифметику. Например, король отношения королеве, как человек женщине, описан королем уравнения – человек + женщина = королева.

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

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. Удалите слова остановки (такой как "и", и) использование 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. Удалите слова остановки (такой как "и", и) использование 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. Ху, Minqing и Бин Лю. "Добывая и обобщая отзывы покупателей". В Продолжениях десятой международной конференции ACM SIGKDD по вопросам открытия Знаний и анализа данных, стр 168-177. ACM, 2004.

Смотрите также

| | | | | | |

Похожие темы