В этом примере показано, как обучить классификатор анализу мнений с помощью аннотируемого списка положительных и отрицательных слов чувства и предварительно обученного встраивания слова.
Предварительно обученное встраивание слова играет несколько ролей в этом рабочем процессе. Это преобразует слова в числовые векторы и формирует основание для классификатора. Можно затем использовать классификатор, чтобы предсказать чувство других слов с помощью их векторного представления и использовать эти классификации, чтобы вычислить чувство части текста. Существует четыре шага в обучении и использовании классификатора чувства:
Загрузите предварительно обученное встраивание слова.
Загрузите словарь мнения, перечисляющий положительные и отрицательные слова.
Обучите классификатор чувства с помощью векторов слова положительных и отрицательных слов.
Вычислите среднее множество чувства слов в части текста.
Чтобы воспроизвести результаты в этом примере, установите rng
к 'default'
.
rng('default')
Вложения 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
, перечисленный в конце примера, выполняет следующие шаги в порядке:
Маркируйте текст с помощью tokenizedDocument
.
Сотрите пунктуацию с помощью erasePunctuation
.
Удалите слова остановки (такой как "и", и) использование removeStopWords
.
Преобразуйте в нижний регистр с помощью 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
выполняет следующие шаги:
Маркируйте текст с помощью tokenizedDocument
.
Сотрите пунктуацию с помощью erasePunctuation
.
Удалите слова остановки (такой как "и", и) использование removeStopWords
.
Преобразуйте в нижний регистр с помощью 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
Ху, Minqing и Бин Лю. "Добывая и обобщая отзывы покупателей". В Продолжениях десятой международной конференции ACM SIGKDD по вопросам открытия Знаний и анализа данных, стр 168-177. ACM, 2004.
bagOfWords
| erasePunctuation
| fastTextWordEmbedding
| removeStopWords
| removeWords
| tokenizedDocument
| word2vec
| wordcloud