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