使用Python进行情感分析_如何用python做情感分析
使用Python进行情感分析
简介
在当今的数字时代,Twitter、Goodreads 和 Amazon 等平台充斥着人们的意见,这使得组织从这庞大的数据量中提取洞察变得至关重要。Python 中的情感分析为这一挑战提供了一种强有力的解决方案。这项技术是 自然语言处理 (NLP) 的一个子集,涉及将文本分类为积极、消极或中立等情感。通过使用各种 Python 库 和模型,分析师可以高效地自动化这个过程。让我们深入探讨如何在 Python 中进行情感分析,并探索一些应用实例。因此,基本上我们在文章中分享了关于使用 Python 进行情感分析的信息以及如何在 Python 中进行情感分析。
在本文中,您将清楚了解情感分析模型,包括其应用和一个实际的情感分析示例。
学习成果
- 获得对Python中情感分析不同方法的深入了解,例如Text Blob、VADER和机器学习-基模型。
- 了解如何为情感分析预处理文本数据,包括清洗、标记化和特征提取。
- 实现对现实世界数据集的情感分析,将文本分类为积极、消极或中性情感。
- 评估情感分析模型的性能,使用适当的指标。
- 探索使用深度学习模型,如LSTM和基于变换器的模型,进行先进情感分析技术。
- 将情感分析应用于实际案例,如社交媒体监控、产品/服务分析和股票价格预测。
- 了解在Python中进行情感分析的局限性和挑战。
- 在各个领域中提高Python在情感分析应用程序中的熟练程度。
目录
- 介绍
- 什么是情感分析?
- Gaining Insights and Making Decisions with Sentiment Analysis
- 情感分析用例
- 在Python中执行情感分析的方法
- 使用 Text Blob
- 使用 VADER
- 使用基于词袋向量化的模型
- 使用基于LSTM的模型
- 使用基于 Transformer 的模型
- 什么是最佳的Python情感分析库?
- 结论
什么是情感分析?
情感分析是**自然语言处理(NLP)的一种用例,属于文本分类**类别。简而言之,情感分析涉及将文本分类为各种情感,例如积极或消极,高兴、悲伤或中立等。因此,情感分析的终极目标是解读文本的潜在情绪、情感或心情。这也被称为观点挖掘。
让我们看看快速的谷歌搜索如何定义情感分析:
情感分析是如何工作的?
在Python中的情感分析通常通过使用自然语言处理(NLP)技术来分析和理解文本中表达的情感。该过程涉及几个步骤:
- 文本预处理: 文本清理过程涉及从文本数据中删除无关信息,例如特殊字符、标点符号和停用词。
- 分词: 该文本被划分为单个单词或标记,以便于分析。
- 特征提取: 文本提取过程包括从文本中提取相关特征,例如单词、n-grams或甚至词性。
- 情感分类: 机器学习算法或预训练模型用于对每个文本实例的情感进行分类。研究人员通过监督学习实现这一点,他们在标记数据上训练模型,或者使用从大数据集中学习到情感模式的预训练模型。
- 后处理: 情感分析结果可能会进行额外处理,例如聚合情感分数或应用阈值规则将情感分类为积极、消极或中性。
- 评估: 研究人员使用评估指标如准确率、精确率、召回率或F1分数来评估情感分析模型的性能。
情感分析的类型
根据分析的具体重点和目标,可以执行各种类型的情感分析。一些常见的类型包括:
- 文档级情感分析: 这种分析确定文档中表达的整体情感,例如评论或文章。它旨在将整个文本分类为积极、消极或中立。
- 句子级情感分析: 在这里,对文档中每个句子的情感进行分析。这种类型提供了对不同文本部分表达的情感的更细致理解。
- 基于方面的情感分析: 该方法专注于识别和提取与文本中提到的特定方面或实体相关的情感。例如,在产品评论中,可以分别分析对产品不同特征(例如,性能、设计、可用性)的情感。
- 实体级情感分析: 这种类型的分析识别文本中提及的特定实体或目标(如人、公司或产品)所表达的情感。它有助于理解同一文档中与不同实体相关的情感。
- 比较情感分析: 这种方法涉及比较文本中提到的不同实体或方面之间的情感。它旨在识别对各种实体或特征表达的相对情感或偏好。
利用情感分析获取洞察和做出决策
情感分析是组织理解客户情感和做出明智决策的有价值工具。例如,一家在线销售香水的公司可以使用情感分析来确定受欢迎的香水,并对不受欢迎的香水提供折扣。通过分析客户评论,公司可以识别受欢迎的香水并做出明智的决策。然而,由于可用的香水数量庞大,在一生中分析所有香水可能是一个挑战。
您只需将所有评论集中在一个地方,并对其应用情感分析。以下是对三种香水(薰衣草、玫瑰和柠檬)评论进行情感分析的示意表示。(请注意,这些评论可能存在拼写、语法和标点符号错误,因为这是真实场景中的情况)
从这些结果中,我们可以清楚地看到:
- 香水-1 (薰衣草) 收到了客户的高度好评,这表明贵公司可以 提高价格 因为其受欢迎程度。
- 香味-2(玫瑰) 在客户中拥有中立的看法,这意味着贵公司不应改变其定价。
- 香味-3 (柠檬) 与整体消极情绪相关?—?因此,您的公司应该考虑对此提供折扣以平衡局面。
这只是一个简单的例子,说明情感分析如何帮助您深入了解您的产品/服务,并帮助您的组织做出决策。
情感分析用例
我们刚刚看到情感分析如何为组织提供能够帮助他们做出数据驱动决策的洞见。现在,让我们深入了解情感分析的一些其他用例:
- 社交媒体监测用于品牌管理: 品牌可以使用情感分析来评估其品牌的公众观点。例如,一家公司可以收集所有提及或标记该公司的推文,并进行情感分析以了解公司的公众形象。
- 产品/服务分析: 品牌/组织可以对客户评价进行情感分析,以了解产品或服务在市场上的表现如何,从而做出未来的决策。
- 股票价格预测: 预测一家公司的股票是上涨还是下跌对投资者至关重要。可以通过对包含该公司名称的文章新闻标题进行情感分析来确定这一点。如果与某个组织相关的新闻标题具有积极情感——其股票价格应该上涨,反之亦然。
在Python中进行情感分析的方法
Python 是执行数据科学任务时最强大的工具之一——它提供了多种方式在 Python 中进行情感 分析。以下是最受欢迎的几种:
- 使用文本块
- 使用Vader
- 使用基于词袋向量化的模型
- 使用基于LSTM的模型
- 使用基于Transformer的模型
让我们逐一深入探讨它们。
注意: 为了演示方法3和4(使用基于词袋向量化模型和使用基于LSTM模型),采用了情感分析。它包含超过5000条标记为正面、负面或中性的文本。该数据集在知识共享许可证下发布。
使用文本块
Text Blob是一个用于自然语言处理的Python库。使用Text Blob进行情感分析非常简单。它将文本作为输入,并可以返回极性和主观性作为输出。
- 极性决定了文本的情感。其值范围在 [-1,1] 之间,其中 -1 表示高度负面的情感,1 表示高度正面的情感。
- 主观性 决定一个文本输入是事实信息还是个人观点。其值在 [0,1] 之间,接近 0 的值表示一条事实信息,而接近 1 的值表示个人观点。
这里是在Python中执行情感分析的步骤,并将情感分析代码放入Python中。
步骤1:安装
pip install textblob
Step2: 导入文本块
从 textblob 导入 TextBlob
第3步:使用Text Blob进行情感分析的代码实现
使用TextBlob进行情感分析的代码编写相当简单。只需导入TextBlob对象并将要分析的文本与适当的属性传递,如下所示:
from textblob import TextBlob
text_1 = "这部电影真棒。"
text_2 = "这里的食物味道糟糕。"
# 确定极性
p_1 = TextBlob(text_1).sentiment.polarity
p_2 = TextBlob(text_2).sentiment.polarity
# 确定主观性
s_1 = TextBlob(text_1).sentiment.subjectivity
s_2 = TextBlob(text_2).sentiment.subjectivity
print("文本 1 的极性是", p_1)
print("文本 2 的极性是", p_2)
print("文本 1 的主观性是", s_1)
print("文本 2 的主观性是", s_2)
输出
文本1的极性为1.0
文本2的极性为-1.0
文本1的主观性为1.0
文本2的主观性为1.0
使用 VADER
VADER(情感感知词典和情感推理器)是一个基于规则的情感分析器,已在社交媒体文本上进行了训练。就像Text Blob一样,它在Python中的使用非常简单。稍后我们将通过一个示例来看它在代码实现中的使用。
第一步:安装
pip install vaderSentiment
Step2: 从Vader导入SentimentIntensityAnalyzer类
来自 vaderSentiment.vaderSentiment 的 SentimentIntensityAnalyzer
步骤3:使用Vader进行情感分析的代码
首先,我们需要创建一个
SentimentIntensityAnalyzer类的对象;然后我们需要将文本传递给该对象的polarity_scores()函数,如下所示:
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
sentiment = SentimentIntensityAnalyzer()
text_1 = "这本书在写作风格和情节之间取得了完美的平衡。"
text_2 = "这块披萨味道糟糕。"
sent_1 = sentiment.polarity_scores(text_1)
sent_2 = sentiment.polarity_scores(text_2)
print("文本1的情感:", sent_1)
print("文本2的情感:", sent_2)
输出:
文本1的情感: {'neg': 0.0, 'neu': 0.73, 'pos': 0.27, 'compound': 0.5719}
文本2的情感: {'neg': 0.508, 'neu': 0.492, 'pos': 0.0, 'compound': -0.4767}
正如我们所见,VaderSentiment对象返回一个字典,包含待分析文本的情感分数。
使用基于词袋向量化的模型
在前面讨论的两种方法,即Text Blob和Vader中,我们只是简单地使用了Python库来执行情感分析。现在我们将讨论一种方法,在这种方法中我们将训练自己的模型来完成这个任务。使用词袋向量化方法执行情感分析的步骤如下:
- 预处理训练数据的文本(文本预处理包括标准化、分词、去除停用词和词干提取/词形还原。)
- 使用计数向量化或TF-IDF向量化方法为预处理的文本数据创建词袋。
- 在处理后的数据上训练一个合适的分类模型用于情感分类。
使用词袋向量化方法进行情感分析的代码:
要使用 BOW 向量化方法在 Python 中构建情感分析模型,我们需要一个标记的数据集。如前所述,这个演示中使用的数据集是从 Kaggle 获取的。我们只是使用了 sklearn 的计数向量器来创建 BOW。之后,我们训练了一个多项式朴素贝叶斯分类器,获得了 0.84 的准确率。
数据集可以从这里获取。
#加载数据集
import pandas as pd
data = pd.read_csv('Finance_data.csv')
#使用计数向量器进行预处理和词袋向量化
from sklearn.feature_extraction.text import CountVectorizer
from nltk.tokenize import RegexpTokenizer
token = RegexpTokenizer(r'[a-zA-Z0-9]+')
cv = CountVectorizer(stop_words='english',ngram_range = (1,1),tokenizer = token.tokenize)
text_counts = cv.fit_transform(data['sentences'])
#将数据拆分为训练和测试
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(text_counts, data['feedback'], test_size=0.25, random_state=5)
#训练模型
from sklearn.naive_bayes import MultinomialNB
MNB = MultinomialNB()
MNB.fit(X_train, Y_train)
#计算模型的准确率
from sklearn import metrics
predicted = MNB.predict(X_test)
accuracy_score = metrics.accuracy_score(predicted, Y_test)
print("准确率: ",accuracy_score)
输出:
准确率: 0.9111675126903553
训练好的分类器可以用来预测给定文本输入的情感。
使用基于 LSTM 的模型
尽管我们能够通过词袋向量化方法获得一个不错的准确率,但是在处理更大数据集时,它可能无法产生相同的结果。这就需要采用基于深度学习的模型来训练Python中的情感分析模型。
对于NLP任务,我们通常使用基于RNN的模型,因为它们是为了处理序列数据而设计的。在这里,我们将使用TensorFlow和Keras训练一个LSTM(长短期记忆)模型。使用基于LSTM的模型进行情感分析的步骤如下:
- 预处理训练数据的文本(文本预处理包括规范化、分词、去除停用词和词干提取/词形还原。)
- Tokenizer 是从 Keras.preprocessing.text 导入并创建的,适配于整个训练文本。文本嵌入使用 texts_to_sequence() 生成,并在填充到相同长度后存储。嵌入是文本的数值/向量化表示,不直接输入模型。
- 该模型使用TensorFlow构建,包括输入层、LSTM层和全连接层。为提高准确性,调整了dropout和超参数。在内部层中,我们使用ReLU或LeakyReLU激活函数以避免消失梯度问题,而在输出层中,我们使用Softmax或Sigmoid激活函数。
基于LSTM模型的情感分析代码
在这里,我们使用了与BOW方法相同的数据集。获得了0.90的训练准确率。
# 导入必要的库
import nltk
import pandas as pd
from textblob import Word
from nltk.corpus import stopwords
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
from keras.models import Sequential
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.layers import Dense, Embedding, LSTM, SpatialDropout1D
from sklearn.model_selection import train_test_split
# 加载数据集
data = pd.read_csv('Finance_data.csv')
# 预处理文本
def cleaning(df, stop_words):
df['sentences'] = df['sentences'].apply(lambda x: ' '.join(x.lower() for x in x.split()))
# 替换数字
df['sentences'] = df['sentences'].str.replace('d', '')
# 移除停用词
df['sentences'] = df['sentences'].apply(lambda x: ' '.join(x for x in x.split() if x not in stop_words))
# 词形还原
df['sentences'] = df['sentences'].apply(lambda x: ' '.join([Word(x).lemmatize() for x in x.split()]))
return df
stop_words = stopwords.words('english')
data_cleaned = cleaning(data, stop_words)
# 使用分词器生成嵌入
tokenizer = Tokenizer(num_words=500, split=' ')
tokenizer.fit_on_texts(data_cleaned['verified_reviews'].values)
X = tokenizer.texts_to_sequences(data_cleaned['verified_reviews'].values)
X = pad_sequences(X)
# 模型构建
model = Sequential()
model.add(Embedding(500, 120, input_length = X.shape[1]))
model.add(SpatialDropout1D(0.4))
model.add(LSTM(704, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(352, activation='LeakyReLU'))
model.add(Dense(3, activation='softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer='adam', metrics = ['accuracy'])
print(model.summary())
# 模型训练
model.fit(X_train, y_train, epochs = 20, batch_size=32, verbose =1)
# 模型测试
model.evaluate(X_test,y_test)
使用基于Transformer的模型
Transformer-based models 是最先进的自然语言处理技术之一。它们遵循基于编码器-解码器的架构,并采用自注意力的概念来产生令人印象深刻的结果。虽然可以从头构建一个 Transformer 模型,但这是一项相当繁琐的任务。因此,我们可以使用在 Hugging Face 上可用的预训练 Transformer 模型。Hugging Face 是一个开源 AI 社区,提供了多种用于 NLP 应用的预训练模型。您可以按原样使用这些模型或对其进行微调以用于特定任务。
第一步:安装
pip install transformers
第2步:从Vader导入SentimentIntensityAnalyzer类
import transformers
第3步:使用基于Transformer的模型进行情感分析代码
要使用transformers执行任何任务,我们首先需要从transformers导入pipeline函数。然后,创建pipeline函数的一个对象,并将要执行的任务作为参数传递(即在我们的例子中是情感分析)。我们还可以指定需要用来执行该任务的模型。在这里,由于我们没有提到要使用的模型,因此默认使用
distillery-base-uncased-finetuned-sst-2-English模型进行情感分析。您可以在这里查看可用任务和模型的列表。
from transformers import pipeline
sentiment_pipeline = pipeline("情感分析")
data = ["这是最好的时代。", "这是最糟糕的时代。"]
sentiment_pipeline(data)
输出
[{'label': '积极', 'score': 0.999457061290741}, {'label': '消极', 'score': 0.9987301230430603}]
最适合情感分析的Python库是什么?
在Python中没有单一最佳的情感分析库,这取决于你的需求。以下是一个快速比较:
NLTK: 强大、多功能,适用于多种NLP任务,但对于情感分析较为复杂。\ TextBlob: 初学者友好,简单的情感分析接口(极性、主观性)。\ Pattern: 更全面的分析(比较级、最高级、事实/观点),学习曲线较陡。\ Polyglot: 快速,支持多种语言(136+种语言),非常适合多语言使用。
结论
在Python中的情感分析提供了强大的工具和方法论,以便从各种应用中的文本数据中提取洞察。通过本文,我们探索了多种情感分析的方法,例如Text Blob、VADER和基于机器学习的模型。我们学习了如何预处理文本数据、提取特征,并训练模型将情感分类为积极、消极或中立。此外,我们还深入探讨了包括LSTM和基于变换器的模型在内的高级技术,强调了它们在处理复杂语言模式方面的能力。
这些方法使组织能够监控品牌感知、分析客户反馈,甚至根据情感预测市场趋势。随着自然语言处理的进步,情感分析持续发展。在当今数字时代,精通这些Python技术对于数据驱动决策将显得无比重要。希望你喜欢这篇文章,并对Python中的情感分析及其使用方法有清晰的了解,同时提供了在Python中进行情感分析的代码。
我希望你现在更好地理解情感分析。情感分析模型会查看文本,以判断它是否表现出积极、消极或中立的情感。例如,它可以检查客户评论,以找出人们是否喜欢或不喜欢某个产品。
主要收获
- Python 提供了一个多功能的环境来执行情感分析任务,这得益于其丰富的库和框架生态系统。
- 我们探索了多种方法,包括Text Blob、VADER、词袋模型、LSTM和基于Transformer的模型,以分析文本数据中的情感。
- 该过程涉及文本预处理、标记化、特征提取,以及应用机器学习或深度学习模型来分类情感。
- 我们将这些方法应用于现实世界的例子,例如客户评论和社交媒体数据,以将情感分类为积极、消极或中立。
- 情感分析帮助组织监测品牌认知、分析客户反馈,并做出数据驱动的决策。
- 随着自然语言处理技术的进步,Python中的情感分析不断发展,提供了更准确和更复杂的方法来理解文本情感。