情感分析:从文本中挖掘情绪
学习目标
本课程将深入探讨情感分析的基本原理和技术,重点学习如何使用NLTK(Natural Language Toolkit)进行情感分析,包括正面、负面和中性情感的识别。通过本课程的学习,学员将能够独立完成情感分析项目,为文本数据的情感倾向提供准确的判断。
相关知识点
- NLTK情感分析
学习内容
1 NLTK情感分析
1.1 情感分析的基本概念
情感分析,也称为意见挖掘,是一种通过自然语言处理、文本分析和计算语言学来识别和提取文本中主观信息的技术。这些信息通常包括情感(正面、负面或中性)、态度、情绪和观点。情感分析在社交媒体监控、市场研究、产品分析和客户服务等多个领域都有广泛的应用。
情感分析可以分为几个不同的层次:
- 文档级情感分析:分析整个文档的情感倾向。
- 句子级情感分析:分析单个句子的情感倾向。
- 方面级情感分析:分析特定方面的情感倾向,例如产品特性或服务的某个方面。
情感分析的方法可以分为基于规则的方法、基于机器学习的方法和基于深度学习的方法。基于规则的方法依赖于预定义的规则和词典,而基于机器学习的方法则通过训练模型来自动学习情感倾向。基于深度学习的方法则利用神经网络来捕捉文本中的复杂模式。
1.2 使用NLTK进行文本预处理
在进行情感分析之前,文本预处理是一个非常重要的步骤。文本预处理包括去除噪声、分词、词干提取和词形还原等步骤,这些步骤有助于提高情感分析的准确性。
1.2.1 去除噪声
去除噪声是指从文本中移除无关的信息,如HTML标签、特殊字符和数字等。这些信息通常不会对情感分析产生积极影响,反而可能干扰模型的训练。
#安装相关依赖
%pip install nltk
#下载数据
!wget https://model-community-picture.obs.cn-north-4.myhuaweicloud.com/ascend-zone/notebook_datasets/36f81a50300d11f0ac12fa163edcddae/nltk_data.zip
!wget https://model-community-picture.obs.cn-north-4.myhuaweicloud.com/ascend-zone/notebook_datasets/36f81a50300d11f0ac12fa163edcddae/test-00000-of-00001.parquet
#解压数据
!unzip nltk_data.zip
import re
def remove_noise(text):
# 去除HTML标签
text = re.sub(r'<.*?>', '', text)
# 去除特殊字符和数字
text = re.sub(r'[^a-zA-Z\s]', '', text)
return text
# 示例
text = "<p>This is a test text that contains some special characters!123</p>"
clean_text = remove_noise(text)
print(clean_text)
1.2.2 分词
分词是将文本分割成单词或短语的过程。分词是自然语言处理中的一个基本步骤,有助于后续的词频统计和特征提取。
import nltk
nltk.data.path.append('./nltk_data')
def tokenize(text):
return nltk.word_tokenize(text)
# 示例
text = "<p>This is a test text that contains some special characters!123</p>"
tokens = tokenize(text)
print(tokens)
1.2.3 词干提取和词形还原
词干提取是将单词还原为其基本形式的过程,而词形还原则是将单词还原为其词典形式。这两个步骤有助于减少词汇的多样性,提高模型的泛化能力。
from nltk.stem import PorterStemmer, WordNetLemmatizer
def stem_and_lemmatize(tokens):
stemmer = PorterStemmer()
lemmatizer = WordNetLemmatizer()
stemmed = [stemmer.stem(token) for token in tokens]
lemmatized = [lemmatizer.lemmatize(token) for token in stemmed]
return lemmatized
# 示例
tokens = ['running', 'ran', 'runs', 'flying', 'flew', 'flies']
processed_tokens = stem_and_lemmatize(tokens)
print(processed_tokens)
1.3 构建情感分析模型
构建情感分析模型是情感分析的核心步骤。可以使用NLTK中的预训练模型,也可以自己训练一个模型。本课程将介绍如何使用NLTK中的预训练模型进行情感分析。
1.3.1 使用NLTK的预训练模型
NLTK提供了一些预训练的情感分析模型,这些模型可以直接使用,无需额外的训练。将使用VADER(Valence Aware Dictionary and sEntiment Reasoner)模型,它是一个基于规则和词汇表的情感分析工具,特别适合社交媒体文本。
from nltk.sentiment import SentimentIntensityAnalyzer
def analyze_sentiment(text):
sia = SentimentIntensityAnalyzer()
sentiment = sia.polarity_scores(text)
return sentiment
# 示例
text = "This movie is very wonderful and I love it so much!"
sentiment = analyze_sentiment(text)
print(sentiment)
VADER模型返回一个字典,包含四个值:
neg:负面情感的得分。neu:中性情感的得分。pos:正面情感的得分。compound:综合得分,范围从-1(最负面)到1(最正面)。
1.3.2 自定义情感分析模型
如果预训练模型不能满足需求,还可以训练一个情感分析模型。这通常需要一个标注好的数据集,以及一些机器学习或深度学习的算法。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score
import pandas as pd
# 读取 parquet 文件
data = pd.read_parquet('test-00000-of-00001.parquet')
# 获取评论内容
texts = data['text']
# 获取标签
labels = data['label']
train_texts, test_texts, train_labels, test_labels = train_test_split(
texts, labels, test_size=0.2, random_state=42, stratify=labels
)
vectorizer = CountVectorizer(
lowercase=True,
stop_words='english',
ngram_range=(1, 2)
)
train_features = vectorizer.fit_transform(train_texts)
test_features = vectorizer.transform(test_texts)
model = MultinomialNB()
model.fit(train_features, train_labels)
predictions = model.predict(test_features)
print(classification_report(test_labels, predictions))
precision recall f1-score support
negative 0.62 0.65 0.64 794
neutral 0.62 0.71 0.66 1188
positive 0.75 0.41 0.53 475
accuracy 0.63 2457
macro avg 0.66 0.59 0.61 2457
weighted avg 0.64 0.63 0.63 2457
1458

被折叠的 条评论
为什么被折叠?



