介绍
NLP(自然语言处理)可以帮助我们理解大量的文本数据。不需要手动阅读大量文档,我们可以利用这些技术加快理解速度,快速获得主要信息。在这篇博文中,我们将深入探讨如何使用Python中的pandas数据框和NLP工具,通过使用Elicit,对在阿富汗进行性别平等研究时人们的写作内容有一个了解。这些见解可能有助于我们理解在过去几十年中,在一个被认为是对女性或女孩来说最困难的地方之一的国家,为促进性别平等所做的工作和未能取得的成果(世界经济论坛,2023年)。
学习目标
- 掌握处理CSV文件中的文本分析。
- 了解如何在Python中进行自然语言处理。
- 开发有效数据可视化的沟通技巧。
- 深入了解阿富汗性别平等研究的演变。
本文是数据科学博文马拉松的一部分。
使用Elicit进行文献综述
为了生成底层数据,我使用了Elicit,一款用于文献综述的AI工具(Elicit)。我让这个工具生成与问题“为什么阿富汗的性别平等失败了?”相关的论文列表。然后,我以CSV格式下载了结果列表(我考虑了150多篇论文的随机数量)。这些数据是什么样的?让我们来看一看!
在Python中分析来自Elicit的CSV数据
我们首先将CSV文件读入pandas数据框中:
import pandas as pd
#识别路径和CSV文件
file_path = './elicit.csv'
#读入CSV文件
df = pd.read_csv(file_path)
#CSV的形状
df.shape
#输出:(168, 15)
#显示数据框的前几行
df.head()
df.head()命令显示了生成的pandas数据框的前几行。数据框由15列和168行组成。我们使用df.shape命令生成这些信息。现在,让我们首先探索这些研究中大多数是在哪一年发表的。在Python中有几种工具可以生成图形,但在这里我们将依赖于seaborn和matplotlib库。为了分析论文大多数是在哪一年发表的,我们可以利用一个称为countplot的工具,并自定义轴标签和轴刻度以使其看起来好看:
分析论文发表的时序分布
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
#设置图形大小
plt.figure(figsize=(10,5))
#生成一个countplot
chart = sns.countplot(x=df["Year"], color='blue')
#设置标签
chart.set_xlabel('年份')
chart.set_ylabel('发表论文的数量')
#更改x轴刻度的大小
#获取标签文本
_, xlabels = plt.xticks()
#设置x轴标签
chart.set_xticklabels(xlabels, size=5)
plt.show()
数据显示,论文数量随着时间的推移而增加,这可能是由于在塔利班于2001年执政后,在阿富汗进行研究的数据可用性更大,研究可能性更好。
分析论文内容
写作的字数
虽然这给我们提供了对阿富汗性别平等研究的第一印象,但我们更感兴趣的是研究人员实际写了什么。为了了解这些论文的内容,我们可以利用Elicit在为我们生成的CSV文件中包含的摘要。为此,我们可以遵循文本分析的标准程序,例如Jan Kirenz在他的博文中概述的方法。我们首先通过使用lambda方法简单地计算每个摘要中的单词数来开始:
#将摘要的文本拆分成单词列表并计算列表的长度
df["单词数量"] = df["摘要"].apply(lambda n: len(n.split()))
#打印前几行
print(df[["摘要", "单词数量"]].head())
#输出:
摘要 单词数量
0 作为一个传统社会,阿富汗一直以来都存在性别平等的问题。性别不平等指数... 122
1 阿富汗性别不平等指数显示,性别不平等问题在阿富汗是一个重要问题。这个指数包括了四个维度:教育、... 203
2 文化和宗教习俗对于阿富汗妇女的生活至关重要。这些习俗和社会规范限制了妇女的自由,阻碍了她们参与... 142
3 摘要 性别平等可能是一个被忽视的问题。然而,性别平等对于社会的可持续发展至关重要。本研究旨在分析... 193
4 塔利班政权的垮台促使阿富汗女性获得了更多的权益和机会。然而,尽管取得了一些进展,但在阿富汗,... 357
#描述单词数量列
df["单词数量"].describe()
count 168.000000
mean 213.654762
std 178.254746
min 15.000000
25% 126.000000
50% 168.000000
75% 230.000000
max 1541.000000
很好。大多数摘要似乎都富含词汇。平均每个摘要有213.7个单词。然而,最少的摘要只有15个单词,而最多的摘要有1,541个单词。
研究人员写什么?
既然我们知道大多数摘要都富含信息,我们可以问一下它们主要写什么。我们可以通过对每个单词进行频率分布来了解。然而,我们对某些词不感兴趣,比如停用词。因此,我们需要进行一些文本处理:
#首先,将所有单词转换为小写
df['摘要小写'] = df['摘要'].astype(str).str.lower()
df.head(3)#import csv
#让我们对该列进行标记化
from nltk.tokenize import RegexpTokenizer
regexp = RegexpTokenizer('\w+')
df['文本标记']=df['摘要小写'].apply(regexp.tokenize)
#显示新数据集的前几行
df.head(3)
#去除停用词
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
#创建一个英文停用词列表
stopwords = nltk.corpus.stopwords.words("english")
#将列表与自定义的停用词扩展
my_stopwords = ['https']
stopwords.extend(my_stopwords)
#使用lambda函数去除停用词
df['文本标记'] = df['文本标记'].apply(lambda x: [item for item in x if item not in stopwords])
#显示数据框的前几行
df.head(3)
#去除不常见的单词(长度小于或等于两个字母的单词)
df['文本字符串'] = df['文本标记'].apply(lambda x: ' '.join([item for item in x if len(item)>2]))
#显示数据框的前几行
df[['摘要小写', '文本标记', '文本字符串']].head()
我们在这里的第一步是将所有单词转换为小写,并通过自然语言处理工具对它们进行标记化。单词标记化是自然语言处理中的关键步骤,意味着将文本分割为单独的单词(令牌)。我们使用RegexpTokenizer,并基于字母数字特征(用’\\w+’表示)对摘要的文本进行标记化。将结果标记存储在text_token列中。然后,我们使用nltk库的自然语言处理工具包的词典删除这个标记列表中的停用词。删除长度小于两个字母的单词。这种类型的文本处理帮助我们将分析重点放在更有意义的术语上。
生成词云
为了对结果单词列表进行视觉分析,我们从处理的文本中生成一个字符串列表,并对该列表进行标记化,然后生成一个词云:
from wordcloud import WordCloud
#创建一个单词列表
all_words = ' '.join([word for word in df['文本字符串']])
#词云
wordcloud = WordCloud(width=600,
height=400,
random_state=2,
max_font_size=100).generate(all_words)
plt.figure(figsize=(10, 7))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off');
词云显示,最常提到的词与我们的搜索词也是相关的:阿富汗、性别、性别平等。然而,一些其他的替代词也出现在最常提到的词列表中:女性和男性。这些词本身并不是非常信息丰富的,但其他一些词是:在阿富汗性别平等的研究中,研究人员似乎非常关注教育、人权、社会和国家。令人惊讶的是,巴基斯坦也出现在列表中。这可能意味着生成的与搜索查询相关的结果是不准确的,也包括了关于阿富汗性别平等的研究,尽管我们并没有要求。或者,这可能意味着阿富汗妇女的性别平等也是巴基斯坦一个重要的研究课题,可能是因为许多阿富汗人在巴基斯坦定居,这是因为他们在家乡的困境。
分析作者的情感
理想情况下,研究应该是中立的,不带情感或意见。然而,作为人类,我们不可避免地有自己的观点和情感。为了调查研究人员在写作中反映自己情感的程度,我们可以进行情感分析。情感分析是一种分析一段文本是积极的、中立的还是消极的方法。在我们的例子中,我们将使用VADER情感分析工具。VADER代表Valence Aware Dictionary and Sentiment Reasoner,它是一个基于词典和规则的情感分析工具。
VADER情感分析工具的工作原理是使用一个预构建的情感词典,其中包含大量具有相关情感的词汇。它还考虑语法规则来检测短文本的情感极性(积极、中立和消极)。该工具根据文本中每个单词的情感和语法规则得出一个情感得分(也称为综合得分)。该得分的范围从-1到1。大于零的值为积极,小于零的值为消极。由于该工具依赖于预构建的情感词典,因此不需要复杂的机器学习模型或大量的数据。
# 访问包含单词情感得分的词典
nltk.download('vader_lexicon')
# 初始化情感分析器对象
from nltk.sentiment import SentimentIntensityAnalyzer
# 使用分析器计算情感极性得分
analyzer = SentimentIntensityAnalyzer()
# 情感极性得分方法 - 将结果分配给极性列
df['polarity'] = df['text_string'].apply(lambda x: analyzer.polarity_scores(x))
df.tail(3)
# 更改数据结构 - 将原始数据集与新列连接起来
df = pd.concat(
[df,
df['polarity'].apply(pd.Series)], axis=1)
# 显示新列的结构
df.head(3)
# 计算综合得分的平均值
df.compound.mean()
# 输出: 0.20964702380952382
上面的代码为每篇摘要生成了一个从-1到1的极性得分,这里称为综合得分。平均值大于零,所以大部分研究具有积极的含义。随时间的推移,情感如何变化呢?我们可以简单地按年份绘制情感图:
# 折线图
g = sns.lineplot(x='Year', y='compound', data=df)
# 调整标签和标题
g.set(title='摘要情感')
g.set(xlabel="年份")
g.set(ylabel="情感")
# 添加一条灰色线来表示零(中性得分),将积极和消极得分分开
g.axhline(0, ls='--', c = 'grey')
有趣的是,从2003年开始,大部分研究都是积极的。在此之前,情感波动更为显著,平均而言更为消极,可能是由于阿富汗妇女的困境所致。
结论
自然语言处理可以帮助我们从大量文本中生成有价值的见解。从Elicit收集的近170篇论文中,我们了解到教育和人权是最重要的研究主题,并且研究人员从2003年开始在阿富汗的性别平等问题上写得更加积极,这是在塔利班在2001年停止执政之后不久发生的。
要点
- 我们可以使用自然语言处理工具快速了解某一研究领域中的主要研究主题。
- 词云是一种很好的可视化工具,可以了解文本中最常用的单词。
- 情感分析显示研究可能没有我们预期的那么中立。
希望您会发现本文有用。欢迎通过LinkedIn与我联系。让我们一起努力利用数据造福社会!
常见问题
参考资料
- 世界经济论坛。《全球性别差距报告2023》。
- Elicit。链接:为什么在阿富汗性别平等未能成功 | 搜索 | Elicit
- Jan Kirenz。使用NLTK和pandas进行文本挖掘和情感分析。
- Hutto, C.J. & Gilbert, E.E.(2014年)。VADER:一种简约的基于规则的社交媒体文本情感分析模型。第八届国际博客和社交媒体会议(ICWSM-14)。密歇根州安娜堡,2014年6月。
本文中显示的媒体不属于Analytics Vidhya所有,仅由作者自行决定使用。