文本分析是一种从非结构化文本数据中提取有价值见解的重要技术,是自然语言处理 (NLP) 应用程序等的根本组成部分。在这篇博文中,我们将探索一种激动人心的新方法,使用 Python 在熟悉的 Microsoft Excel 环境中执行文本分析,这得益于功能强大的 Python Anaconda 发行版。这种尖端功能将 Python 的数据分析能力与 Excel 的用户友好界面相结合,为高效、有效的文本分析开辟了全新的机会。
注意:要重现本文中的示例,请安装Python 在 Excel 中试用版。
读取数据
文本分析的第一步是将文本数据导入到我们的 Python 环境中。我们可以使用熟悉的库(如 pandas)直接从 Excel 读取数据。在本例中,我们拥有 20 个课程评论的集合,存储在“data”工作簿中。在单独的电子表格中,我们可以通过简单地输入“=py”来开始编写 Python 代码。这使我们能够使用 df=xl(“data!A1:A20”,headers=True)访问数据,这将生成一个 Python DataFrame 对象。
接下来,为了验证我们是否正确加载了数据,我们可以使用“=py”启动另一个 Python 环境,并使用“df.head()”检查前五行数据。此快速简单的步骤使我们能够确保数据已成功导入,并提供对初始记录的了解,以便进行进一步分析。
定义停用词
在文本分析过程中,通常的做法是过滤掉停用词,停用词是指在句子中频繁出现的词语,但缺乏实质性的上下文意义(例如,“a”、“the”、“and”、“but”等)。通过消除这些无关紧要的词语,我们可以专注于更相关的内容,并从文本数据中获得更有意义的见解。我们通常使用自然语言工具包 (NLTK) 库下载停用词列表
from nltk.corpus import stopwords
stopwords_list = stopwords.words('english')
但是,当前版本的 Python 在 Excel 中不允许您下载 NLTK 通常需要的 datasets。在等待解决问题的同时,我们可以在代码中直接定义自己的停用词列表。在下面的代码中,我们只是简单地复制并粘贴了 NLTK 中的所有停用词。请随时自行定义停用词列表,以进行实验并查看它们如何影响结果。
N 元语法分析
N 元语法是给定文本样本中连续出现的单词序列。N 元语法分析有助于理解单词之间的关系,并识别频繁出现的短语。在本节中,我们将研究两个词和三个词的组合,即二元语法和三元语法。
我们将使用 CountVectorizer 函数,该函数使我们能够将文本文档集合转换为标记计数矩阵。ngram_range 参数定义了要提取的不同 N 元语法 N 值范围的下限和上限。在本例中,我们对二元语法和三元语法感兴趣。以下代码片段说明了如何获取所有二元语法和三元语法、按其各自的频率对它们进行排序,并返回前 10 个二元语法/三元语法
from sklearn.feature_extraction.text import CountVectorizer
# Create CountVectorizer object
# CountVectorizer converts a collection of text documents to a matrix of token counts
c_vec = CountVectorizer(stop_words=stopwords_list, ngram_range=(2,3))
# Fit the CountVectorizer to the reviews data to get a matrix of ngrams
ngrams = c_vec.fit_transform(df['reviews'])
# Count the frequency of ngrams
count_values = ngrams.toarray().sum(axis=0)
# Get a list of ngrams
vocab = c_vec.vocabulary_
# Create a DataFrame to store the frequency and n-gram, sorted in descending order of frequency
df_ngram = pd.DataFrame(sorted([(count_values[i],k) for k,i in vocab.items()], reverse=True)
).rename(columns={0: 'frequency', 1:'bigram/trigram'})
# Display the top 10 n-grams by frequency
df_ngram.head(n=10)
分析表明,短语“textbook great”出现了六次,而“assignments hard”在文本数据中出现了四次。这些特定词语组合的频繁出现为分析文本中的模式提供了宝贵的见解。
主题建模
主题建模是一种用于发现文档集合中的主要主题或主题的技术。它有助于组织文本数据,并提供对底层信息的简洁表示。主题建模主要有两种模型:非负矩阵分解 (NMF) 模型和潜在狄利克雷分配 (LDA) 模型。在本例中,我们将使用 NMF 方法。
NMF 是一种无监督技术,可以减少输入数据的维数。更具体地说,它是一种强大的矩阵分解过程,它将矩阵分解为两个非负矩阵的乘积:W 和 H。默认情况下,NMF 会优化原始矩阵和 WH 之间的距离。下面是一个说明性示例,我们在其中应用 NMF 来生成三个主题,并展示每个主题中的五个重要二元语法/三元语法。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import NMF
from sklearn.pipeline import make_pipeline
# Create a TF-IDF vectorizer object
# TF-IDF (Term Frequency-Inverse Document Frequency) is a technique used to quantify a word in documents
# It is used to reflect how important a word is to a document in a collection or corpus
# The stop_words parameter is used to ignore common words in English such as 'this', 'is', etc.
# The ngram_range parameter is used to specify the size of word chunks to consider as features
tfidf_vectorizer = TfidfVectorizer(stop_words=stopwords_list, ngram_range=(2,3))
# Create an NMF (Non-Negative Matrix Factorization) object
# The n_components parameter is used to specify the number of topics to extract
nmf = NMF(n_components=3)
# Create a pipeline object that sequentially applies the TF-IDF vectorizer and NMF
pipe = make_pipeline(tfidf_vectorizer, nmf)
# Fit the pipeline to the reviews data
pipe.fit(df['reviews'])
def plot_top_words(model, feature_names, n_top_words, title):
"""
Plot top words in topics
source: https://scikit-learn.cn/stable/auto_examples/applications/plot_topics_extraction_with_nmf_lda.html#sphx-glr-auto-examples-applications-plot-topics-extraction-with-nmf-lda-py
"""
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 3, figsize=(30, 15), sharex=True)
axes = axes.flatten()
for topic_idx, topic in enumerate(model.components_):
top_features_ind = topic.argsort()[: -n_top_words - 1 : -1]
top_features = [feature_names[i] for i in top_features_ind]
weights = topic[top_features_ind]
ax = axes[topic_idx]
ax.barh(top_features, weights, height=0.7)
ax.set_title(f"Topic {topic_idx +1}", fontdict={"fontsize": 30})
ax.invert_yaxis()
ax.tick_params(axis="both", which="major", labelsize=20)
for i in "top right left".split():
ax.spines[i].set_visible(False)
fig.suptitle(title, fontsize=40)
plt.subplots_adjust(top=0.90, bottom=0.05, wspace=0.90, hspace=0.3)
plt.show()
# Plot the top words in the topics identified by the NMF model
plot_top_words(
nmf, tfidf_vectorizer.get_feature_names_out(), 5, "Topics in NMF model"
)
分析得出以下见解
- 主题 1:侧重于“很棒的教科书”的主题
- 主题 2:重点介绍了“困难的作业”带来的挑战
- 主题 3:强调了“努力工作”的重要性
这些发现为课程评论中的主要主题提供了宝贵的清晰度。
结论
文本分析是一种有价值的工具,可以从非结构化文本数据中提供有意义的见解。在这篇博文中,我们介绍了文本分析的基础知识,包括使用 Python 在 Excel 中进行 N 元语法分析和主题建模。通过利用 Python 库与 Excel 的这种新集成,您可以执行以前在熟悉的 Excel 界面中无法执行的分析。此外,您还可以轻松地将有价值的结果直接与利益相关者共享到 Excel 中,他们在 Excel 中已经习惯工作。
免责声明:截至本文发表,Microsoft Excel 中的 Python 集成处于 Beta 测试阶段。功能和功能可能会发生变化。如果您发现此页面有任何错误,请随时与我们联系。
个人简介
Sophia Yang 是 Anaconda 的高级数据科学家和开发者倡导者。她热衷于数据科学社区和 Python 开源社区。她是多个 Python 开源库的作者,例如 condastats、cranlogs、PyPowerUp、intake-stripe 和 intake-salesforce。她担任 Python 开源可视化系统 HoloViz 的指导委员会和行为准则委员会成员。她还在 NumFOCUS、PyData 和 SciPy 会议上担任志愿者。她拥有德克萨斯大学奥斯汀分校的计算机科学硕士学位、统计学硕士学位和教育心理学博士学位。