В этом примере показано, как обучить классификатор анализу мнений с помощью аннотируемого списка положительных и отрицательных слов чувства и предварительно обученного встраивания слова.
Предварительно обученное встраивание слова играет несколько ролей в этом рабочем процессе. Это преобразует слова в числовые векторы и формирует основание для классификатора. Можно затем использовать классификатор, чтобы предсказать чувство других слов с помощью их векторного представления и использовать эти классификации, чтобы вычислить чувство части текста. Существует четыре шага в обучении и использовании классификатора чувства:
Загрузите предварительно обученное встраивание слова.
Загрузите словарь мнения, перечисляющий положительные и отрицательные слова.
Обучите классификатор чувства с помощью векторов слова из положительных и отрицательных слов.
Вычислите среднее множество чувства слов в части текста.
Вложения 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