7.4.3 跨语言情感分析的方法
在现实应用中,用于跨语言情感分析的常见方法和技术如下所示。
- 机器学习模型:使用机器学习技术,如自然语言处理(NLP)中的循环神经网络(RNN)、卷积神经网络(CNN)和递归神经网络(RNN),可以训练模型来自动分析文本中的情感。这些模型可以针对不同语言进行训练,以实现跨语言情感分析。
- 翻译和多语言字典:一种方法是首先将文本翻译成通用语言(如英语),然后在该语言上进行情感分析。这种方法可能会引入翻译错误和文化差异,但对于一些语言可能是有效的。
- 多语言情感词典:创建和维护多语言情感词典,其中包含与情感相关的词汇和短语,以帮助在多种语言中进行情感分析。这需要大量的语言资源和词汇知识。
- 跨语言预训练模型:近年来,出现了一些跨语言预训练模型,如多语言BERT(BERT-Multilingual),它们可以在多种语言中执行多任务NLP任务,包括情感分析。
请看下面的例子,功能是对酒店评论数据进行分析和可视化,以了解客户对酒店的情感评价、评论的主题特点以及不同情感类别的分布趋势。这个例子的主要功能包括:
- 数据清洗和准备:加载酒店评论数据,去除无用字符和空值,对评论进行预处理,包括情感分析。
- 词云可视化:生成词云图,展示评论中出现频率最高的单词,以了解客户关注的关键词和主题。
- 情感分析:对评论进行情感分析,将情感极性编码为正向、中性和负向,以分析不同情感类别的分布。
- 时间序列分析:分析评论情感随时间的变化趋势,了解客户对酒店的情感评价是否随时间有变化。
- 地点分析:分析不同地点的评论情感,了解哪些地点受到客户好评,哪些地点需要改进。
本项目的可视化和分析功能有助于酒店管理者或公司了解客户的情感反馈,找出客户关注的主题和趋势,以改进产品或服务,并做出战略决策。
实例7-4:某酒店用户情感分析系统(源码路径:daima\7\hotel.ipynb)
(1)导入多个用于数据分析、可视化和自然语言处理的Python库,具体实现代码如下所示。
df = pd.read_csv("/kaggle/input/hotel-reviews/Data Analyst - Test Data - US.csv")
df['Review'] = df['Review'].str.replace('\n', '')
df['Review'] = df['Review'].str.replace('Read more', '')
df['Review'] = df['Review'].str.replace('Read less', '')
(2)打开数据集文件,清理"Review"列中的文本数据,去除不需要的字符和字符串,以便进行进一步的文本分析和处理。
df = pd.read_csv("/kaggle/input/hotel-reviews/Data Analyst - Test Data - US.csv")
df['Review'] = df['Review'].str.replace('\n', '')
df['Review'] = df['Review'].str.replace('Read more', '')
df['Review'] = df['Review'].str.replace('Read less', '')
对上述代码的具体说明如下:
- 通过pd.read_csv函数从文件"/kaggle/input/hotel-reviews/Data Analyst - Test Data - US.csv"中读取了一个CSV文件,并将其加载到名为df的Pandas数据框中。
- 使用.str.replace()方法将df数据框中的"Review"列中的所有换行符(\n)替换为空字符串,从而删除了换行符。
- 使用.str.replace()方法将"Review"列中的所有出现的"Read more"字符串替换为空字符串,从而删除了"Read more"。
- 使用.str.replace()方法将"Review"列中的所有出现的"Read less"字符串替换为空字符串,从而删除了"Read less"。
(3)使用库TextBlob对给定的文本进行情感分析,具体实现代码如下所示。
TextBlob("I was very impressed with the resort. Great staff at the main resort pool bar! We had a blast with them. Clean, professional staff, great location and very reasonable!").sentiment
TextBlob通过sentiment属性返回了情感分析的结果,这个属性通常返回如下两个值:
- 极性(Polarity):表示文本的情感倾向,可以是正面、负面或中性。极性通常在-1到1之间,其中1表示积极,-1表示消极,0表示中性。
- 主观性(Subjectivity):表示文本的主观性程度,可以是非常客观到非常主观的范围。主观性通常在0到1之间,其中0表示非常客观,1表示非常主观。
执行后会输出:
Sentiment(polarity=0.5142857142857143, subjectivity=0.6304761904761905)
(4)定义一个生成词云图的函数wc(),接受三个参数:data(文本数据),bgcolor(词云的背景颜色),和title(词云图的标题)。这个函数可以用于生成词云图,用于可视化文本数据中最常见的单词,背景颜色和标题可以根据需要进行自定义。要调用这个函数,您需要传递包含文本数据的data,指定背景颜色bgcolor,并为词云图指定一个标题title。
def wc(data,bgcolor,title):
plt.figure(figsize = (50,50))
wc = WordCloud(background_color = bgcolor, max_words = 2000, random_state=42, max_font_size = 50)
wc.generate(' '.join(data))
plt.imshow(wc)
plt.axis('off')
上述函数wc()的主要功能如下:
- 创建一个大尺寸的图形窗口,以便绘制词云图。
- 使用WordCloud对象创建一个词云,设置了背景颜色、最大单词数、随机种子和最大字体大小等参数。
- 通过wc.generate(' '.join(data))生成词云,其中data是文本数据,通过' '.join(data)将文本数据连接成一个字符串。
- 使用plt.imshow(wc)显示生成的词云图。
- 使用plt.axis('off')将坐标轴关闭,以便只显示词云图而不显示坐标轴。
(5)使用df.head(5)来查看数据框(DataFrame)df的前五行数据,这将显示数据框中的前五行记录,以便我们可以快速查看数据的样本。
df.head(5)
执行后会输出:
Review date Location
0 I was very impressed with the resort. Great st... 2019/08/20 Sebastian
1 The rooms were nice the outside needs work als... 2019/08/20 Los Angeles
2 Great location! I have stayed at this hotel on... 2019/08/20 Georgia
3 The hotel was adequate for my stay. The strips... 2019/08/20 NaN
4 Great location, room was large and spacious. P... 2019/08/19 Palm Harbor
(6)对数据框 df 中的 'date' 列执行了日期时间转换操作,将其转换为 Pandas 的日期时间对象。具体来说,它使用 pd.to_datetime 函数,通过传递 format='mixed' 参数来尝试解析日期时间数据。但是 'mixed' 并不是一个有效的日期时间格式,通常需要提供实际的日期时间格式字符串。
df['date'] = pd.to_datetime(df['date'], format='mixed')
df.head(5)
执行后会输出:
Review date Location
0 I was very impressed with the resort. Great st... 2019-08-20 Sebastian
1 The rooms were nice the outside needs work als... 2019-08-20 Los Angeles
2 Great location! I have stayed at this hotel on... 2019-08-20 Georgia
3 The hotel was adequate for my stay. The strips... 2019-08-20 NaN
4 Great location, room was large and spacious. P... 2019-08-19 Palm Harbor
(7)使用df.shape返回一个包含两个元素的元组,第一个元素表示数据框的行数(记录数),第二个元素表示数据框的列数(特征数)。
df.shape
执行后会输出:
(6448, 3)
(8)使用df.isna().sum()检查数据框 df 中缺失值,具体来说,它返回一个包含每列中缺失值数量的 Pandas Series,这对于识别数据中缺失的信息非常有用。
df.isna().sum()
执行后会输出:
Review 55
date 0
Location 4737
dtype: int64
(9)使用df.dropna(subset=['Review'])删除数据框df中"Review"列中包含缺失值的行,并将删除后的数据框重新赋给了df。虽然这一操作将会移除"Review"列中包含缺失值的行,使数据会更加干净。
df = df.dropna(subset=['Review'])
df.isna().sum()
执行后会输出:
Review 0
date 0
Location 4688
dtype: int64
(10)再次使用df.shape返回数据框的行数(记录数)和列数(特征数),具体实现代码如下所示。
df.shape
执行后会输出:
(6393, 3)
(11)分别创建两个空列表polarity和subjectivity,然后遍历了数据框df中"Review"列的值。对于每个文本评论,它使用TextBlob库进行情感分析,分别计算了极性(polarity)和主观性(subjectivity)。
polarity=[]
subjectivity=[]
for i in df['Review'].values:
try:
analysis =TextBlob(i)
polarity.append(analysis.sentiment.polarity)
subjectivity.append(analysis.sentiment.subjectivity)
except:
polarity.append(0)
subjectivity.append(0)
最终,在polarity和subjectivity列表中存储了每个评论的情感分析结果,这些结果可以用于进一步的分析或可视化。极性表示评论的情感倾向(正面、负面或中性),主观性表示评论的主观性程度。这些值可以帮助我们了解评论的情感倾向和情感的主观性。
(12)将之前计算得到的情感极性(polarity)和主观性(subjectivity)的值分别添加到数据框 df 中作为新的列。
df['polarity']=polarity
df['subjectivity']=subjectivity
通过执行这两行代码,将成功将情感分析的结果与原始评论数据关联,使其成为数据框的一部分。这样,您可以进一步分析或可视化评论的情感极性和主观性。
(13)创建一个词云图,用于可视化df数据框中的评论文本。
filtered_reviews = df['Review']
text = ' '.join(filtered_reviews)
wordcloud = WordCloud(width=800, height=400, background_color='black').generate(text)
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.title("Word Cloud")
plt.axis('off')
plt.show()
对上述代码的具体说明如下:
- 从df数据框中选择了名为"Review"的列,并将其存储在名为filtered_reviews的变量中。
- 使用' '.join(filtered_reviews)将所有评论文本连接成一个单独的文本字符串,存储在名为text的变量中。
- 创建一个WordCloud对象,设置了词云的宽度、高度和背景颜色。词云的宽度为800像素,高度为400像素,背景颜色为黑色。
- 使用.generate(text)方法生成词云,其中text是包含所有评论文本的字符串。
- 创建一个绘图窗口,设置了图形的大小为(10, 5)。
- 使用plt.imshow(wordcloud, interpolation='bilinear')显示生成的词云图,其中wordcloud是词云对象,interpolation='bilinear'用于平滑图像的显示。
- 使用plt.title("Word Cloud")设置图形的标题为"Word Cloud"。
- 使用plt.axis('off')关闭坐标轴,以便只显示词云图,而不显示坐标轴。
- 最后,使用plt.show()显示词云图。
执行会将生成一个漂亮的词云图,其中包含了评论文本中最常见的单词,并以黑色背景呈现,如图7-3所示。这有助于可视化评论的主题和关键词。如果需要进一步的自定义或分析词云图,可以根据需要进行修改。
图7-3 词云图
由此可见,影响顾客情绪的最常见的词汇包括:清洁、舒适、友好、乐于助人、极好、位置、员工、房间、设施、游泳池和早餐。这表明客人通常对酒店的清洁度、舒适度和设施感到满意。他们还赞赏友好和乐于助人的员工。酒店的位置也是一个优点,游泳池和早餐同样备受好评。
(14)选择数据框 df 中满足条件 polarity > 0 的前五行数据,同时仅保留 "Review"、"date"、"Location"、"polarity" 和 "subjectivity" 列的信息。这意味着只选择具有积极情感极性的评论,并显示这些评论的相关信息。
df[['Review','date','Location','polarity','subjectivity']][df.polarity>0].head(5)
执行后会输出:
Review date Location polarity subjectivity
0 I was very impressed with the resort. Great st... 2019-08-20 Sebastian 0.514286 0.630476
1 The rooms were nice the outside needs work als... 2019-08-20 Los Angeles 0.250000 0.558333
2 Great location! I have stayed at this hotel on... 2019-08-20 Georgia 0.378788 0.423737
3 The hotel was adequate for my stay. The strips... 2019-08-20 NaN 0.102222 0.485556
4 Great location, room was large and spacious. P... 2019-08-19 Palm Harbor 0.404524 0.522381
(15)生成一个基于具有积极情感极性的评论的词云图,以可视化这些积极评论中最常见的单词。
filtered_reviews = df[df['polarity'] > 0]['Review']
text = ' '.join(filtered_reviews)
wordcloud = WordCloud(width=800, height=400, background_color='black').generate(text)
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.title("Positive")
plt.axis('off')
plt.show()
执行后会生成一个以黑色背景为基础的积极评论的词云图,如图7-4所示。
图7-4 积极评论的词云图
由此可见,高频出现的积极词汇有:房间、酒店、员工、极好、乐于助人、友好、清洁、不错、好、位置。这意味着留下这些评论的酒店游客总体上有积极的体验,一些被积极提到的酒店方面包括员工、客房、设施和位置。我们可以从词云中得出如下具体的结论:
- 酒店员工友好而乐于助人。
- 酒店客房干净且舒适。
- 酒店提供了各种设施,受到客人的赞赏,如游泳池和餐厅。
- 酒店位于便利的位置。
(16)选择数据框 df 中满足条件 polarity > 0.8 的前五行数据,并且仅保留 "Review"、"date"、"Location"、"polarity" 和 "subjectivity" 列的信息。这意味着只选择具有极高积极情感极性的评论,并显示这些评论的相关信息。
df[['Review','date','Location','polarity','subjectivity']][df.polarity>0.8].head(5)
在上述代码中,df[['Review','date','Location','polarity','subjectivity']] 选择了 "Review"、"date"、"Location"、"polarity" 和 "subjectivity" 列,然后通过 df.polarity > 0.8 这个条件进行过滤,以选择具有极高积极情感极性的评论。最后,使用 .head(5) 来获取满足条件的前五行数据,以查看具有极高积极情感的评论以及与其相关的日期、位置和情感分析信息的前五条记录。执行后会输出:
Review date Location polarity subjectivity
180 Great hotel! Room was wonderful and the pools ... 2019-08-03 Palm Island, Florida 0.833333 0.883333
188 Everything was perfect, the staff and faciliti... 2019-08-02 NaN 0.900000 0.866667
191 Excellent facilities. Great for families or co... 2019-08-01 NaN 0.900000 0.875000
195 All good! We are very happy and the joy is in ... 2019-08-01 NaN 0.958333 0.600000
265 Beautiful place, great memories, a must visit ... 2019-07-26 NaN 0.825000 0.875000
(17)生成一个基于具有极高积极情感极性的评论的词云图,以可视化这些高度积极的评论中最常见的单词。
filtered_reviews = df[df['polarity'] > 0.8]['Review']
text = ' '.join(filtered_reviews)
wordcloud = WordCloud(width=800, height=400, background_color='black').generate(text)
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.title("Highly Positive")
plt.axis('off')
plt.show()
执行后会生成一个以黑色背景为基础的高度积极评论词云图,帮助我们可视化高度积极评论中的关键词和主题。如图7-5所示。
图7-5 高度积极评论词云图
由此可见,在高度积极的评论中高频出现的词汇有:位置、酒店、员工、极好、优秀、房间、美丽、一切、令人印象深刻。这表明留下这些评论的酒店游客总体上有积极的体验,一些被积极提到的酒店方面包括员工、客房、设施和位置。
(18)选择数据框 df 中满足条件 polarity < 0 的前五行数据,并且仅保留 "Review"、"date"、"Location"、"polarity" 和 "subjectivity" 列的信息。这意味着只选择具有负面情感极性的评论,并显示这些评论的相关信息。
df[['Review','date','Location','polarity','subjectivity']][df.polarity<0].head(5)
执行后会输出:
Review date Location polarity subjectivity
18 It was great for what we needed, a place to sl... 2019-08-19 NaN -0.044444 0.554861
32 Rooms very dirty and aged. Breakfast was of po... 2019-08-17 NaN -0.337857 0.535714
46 This property is advertised as being renovated... 2019-08-14 Pennsylvania -0.226717 0.552424
56 The rooms are terribly small, almost claustrop... 2019-08-13 NaN -0.430556 0.563889
63 I liked everything except the smoking by the p... 2019-08-12 San Antonio,TX -0.155000 0.833333
(19)生成一个基于具有负面情感极性的评论的词云图,以可视化这些负面评论中最常见的单词。
filtered_reviews = df[df['polarity']<0]['Review']
filtered_reviews = filtered_reviews.astype(str)
text = ' '.join(filtered_reviews)
wordcloud = WordCloud(width=800, height=400, background_color='black').generate(text)
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.title("All Negative")
plt.axis('off')
plt.show()
对上述代码的具体说明如下:
- 通过df['polarity'] < 0条件过滤数据框df,选择具有负面情感极性的评论。这将返回一个包含满足条件的行的子数据框,其中包含 "Review" 列的评论。
- 将 filtered_reviews 的数据类型转换为字符串,以确保文本是字符串类型。
- 使用' '.join(filtered_reviews)将这些满足条件的评论连接成一个单独的文本字符串,存储在名为text的变量中。
- 创建一个WordCloud对象,设置了词云的宽度、高度和背景颜色。词云的宽度为800像素,高度为400像素,背景颜色为黑色。
- 创建一个绘图窗口,设置了图形的大小为(10, 5)。
- 使用plt.imshow(wordcloud, interpolation='bilinear')显示生成的负面评论的词云图,其中wordcloud是词云对象,interpolation='bilinear'用于平滑图像的显示。
- 使用plt.title("All Negative")设置图形的标题为"All Negative",表示这是所有负面评论的词云图。
- 使用plt.axis('off')关闭坐标轴,以便只显示词云图,而不显示坐标轴。
- 最后,使用plt.show()显示词云图。
执行上述代码后会生成一个以黑色背景为基础的所有负面评论的词云图,帮助我们可视化负面评论中的关键词和主题。如图7-6所示。
图7-6 所有负面评论的词云图
由此可见,高频出现的负面评论词汇有:房间、酒店、床、夜晚、小、肮脏、逗留、检查、员工、浴室。根据上面的词云,可以得出以下结论:
- 酒店客房状况不佳。
- 酒店客房不干净。
- 酒店客房小而拥挤。
- 酒店员工粗鲁且不乐于助人。
- 服务质量差。
(20)选择数据框 df 中满足条件 polarity < -0.5 的前五行数据,并且仅保留 "Review"、"date"、"Location"、"polarity" 和 "subjectivity" 列的信息。这意味着只选择具有极低负面情感极性的评论,并显示这些评论的相关信息。
df[['Review','date','Location','polarity','subjectivity']][df.polarity<-0.5].head(5)
在上述代码中,df[['Review','date','Location','polarity','subjectivity']] 选择了 "Review"、"date"、"Location"、"polarity" 和 "subjectivity" 列,然后通过 df.polarity < -0.5 这个条件进行过滤,以选择具有极低负面情感极性的评论。最后,使用 .head(5) 来获取满足条件的前五行数据,以查看具有极低负面情感的评论以及与其相关的日期、位置和情感分析信息的前五条记录。执行后会输出:
Review date Location polarity subjectivity
290 Very dirty! Dirty Far away Dirty Dirty Did I s... 2019-07-24 NaN -0.545833 0.866667
541 Horrible service, tight space and poor conditi... 2019-07-02 Miami -0.526190 0.628571
551 The room floor was dirty & sticky, and bath sh... 2019-07-02 NaN -0.600000 0.800000
569 I came 8 pm to chek in. It took the lady about... 2019-06-30 NaN -0.520000 0.780000
617 This property is dated and the room was worn (... 2019-06-25 NaN -0.520000 1.000000
(21)生成一个基于具有极低负面情感极性的评论的词云图,以可视化这些高度负面评论中最常见的单词。
filtered_reviews = df[df['polarity']<-0.5]['Review']
filtered_reviews = filtered_reviews.astype(str)
text = ' '.join(filtered_reviews)
wordcloud = WordCloud(width=800, height=400, background_color='black').generate(text)
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.title("Highly Negative")
plt.axis('off')
plt.show()
执行后会生成一个以黑色背景为基础的高度负面评论的词云图,帮助我们可视化高度负面评论中的关键词和主题。如图7-7所示。
图7-7 高度负面评论的词云图
由此可见,高频出现的负面评论词汇有:房间、脏、可怕、酒店、服务、差、床。根据这些词汇,可以得出以下结论:
- 酒店客房状况不佳。
- 房间不干净。
- 客人体验可怕。
- 酒店的服务质量不佳。
- 床的舒适度不好。
- 这些词汇反映了客户的不满和投诉,可能是酒店改进的方向。
(22)选择数据框 df 中满足条件 polarity == 0 的前五行数据,并且仅保留 "Review"、"date"、"Location"、"polarity" 和 "subjectivity" 列的信息。这意味着只选择情感极性为中立的评论,并显示这些评论的相关信息。
df[['Review','date','Location','polarity','subjectivity']][df.polarity==0].head(5)
执行后会输出:
Review date Location polarity subjectivity
6 Old. Musty. Motel. Bath need an update asap !... 2019-08-19 NaN 0.0 0.0
23 基本的に問題なしでした。 清潔で防音も普通な方で、水回りも清潔でシャワーの水圧も問題なしです... 2019-08-18 NaN 0.0 0.0
31 Les chambres familiales sont pratiques (nous é... 2019-08-17 Montréal 0.0 0.0
47 Vétuste mérite un sacré rafraîchissement Empl... 2019-08-14 Toulon 0.0 0.0
49 El aire acondicionado goteaba y la alfombra es... 2019-08-14 NaN 0.0 0.0
(23)生成一个基于情感中立的评论的词云图,以可视化这些中立评论中最常见的单词。
filtered_reviews = df[df['polarity']==0]['Review']
filtered_reviews = filtered_reviews.astype(str)
text = ' '.join(filtered_reviews)
wordcloud = WordCloud(width=800, height=400, background_color='black').generate(text)
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.title("Neutral")
plt.axis('off')
plt.show()
执行后会生成一个以黑色背景为基础的情感中立评论的词云图,帮助我们可视化中立评论中的关键词和主题。如图7-8所示。
图7-8 情感中立评论的词云图