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

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

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

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

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

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

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

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

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

Загрузите предварительно обученное встраивание слова с помощью 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.

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

| | | | | | |

Похожие темы