来源 | Natural Language Processing for Beginners
作者 | AI Publishing
翻译 | 悉尼没睡醒
校对 | gongyouliu
编辑 | auroral-L
全文共2406字,预计阅读时间30分钟。
第九章 文本摘要和主题建模
1. 用 NLTK 进行文本摘要
1.1 抓取维基百科的文章
1.2 文本清洗
1.3 查找词频
1.4 查找句子分数
1.5 输出摘要
2. 使用 Genism 利用 LDA 进行主题建模
2.1 维基百科文章抓取
2.2 数据清洗
2.3 使用 LDA 进行主题建模
2.4 测试主题模型
文本摘要和主题建模是自然语言处理非常常见的应用。在本章中,你将通过示例进行文本摘要和主题建模。
1. 用NLTK进行文本摘要
text summarization,顾名思义,任务是总结一段给定的文本。有两种主要类型的文本摘要技术:
1. 提取摘要
在提取摘要中,将原文中重要的一段文本包含在摘要文本中。摘要基本上是对原文重要部分的汇总。摘要文中原文措辞不变。
2. 抽象摘要
在抽象摘要中,原文被完全理解,然后用全新的词概括,代表原文的主旨。提取摘要很容易执行,因此,大多数现有的 NLP 方法都执行提取文本摘要。让我们看一个例子。假设你有以下一段文字,并且你想对其进行总结。
你可以使用提取摘要方法来实现。我们将要使用的方法很简单。首先,我们必须将我们的文本分成句子,如下面的脚本所示:
接下来,我们必须为输入文本的所有句子中的所有单词分配一个出现频率。
让我们看看文本文档中所有单词的频率:
你可以看到climate这个词出现了两次,change出现了三次,依此类推。接下来,我们需要找到每个单词的相对频率。一个词的相对频率可以通过将一个词的频率除以出现次数最多的词的频率来计算。下面的脚本就是这样做的。
让我们输出相对频率。
最后一步是计算语料库中所有句子的频率分数。一个句子的频率得分等于该句子中所有单词的频率得分之和。以下脚本计算语料库中所有句子的频率分数。
以下输出显示了所有句子的频率分数。
总而言之,选择频率最高的 N 个句子。例如,以下脚本选择频率最高的前三个句子。
输出如下:
总结看起来很有意义。这只是一个非常粗略的例子。在下一节中,你将看到我们如何总结维基百科文章。
首先,你需要安装 beautifulsoup4 和 lxml 库。你需要这些库来抓取我们将要总结的维基百科文章。在命令终端上执行以下命令以安装这些库。
1.1 抓取维基百科的文章
以下脚本抓取了维基百科关于自然语言处理的文章。脚本解析文章,然后创建一个语料库,其中包含文章中所有段落的文本,忽略 HTML 标签。
抓取文本的前 1,000 个字符如下所示。
1.2 文本清洗
下一步是清洗数字和特殊字符的文本。
1.3 查找词频
其余过程类似。你必须首先将文本分成句子。
接下来,根据清理过的数据,创建一个词频词典,其中包含单词及其相应的出现频率。
下一步是创建单词的相对频率,如下所示:
1.4 查找句子分数
最后,可以通过将句子中所有单词的频率分数相加来计算句子的频率分数,这是在下面脚本中实现的。请记住,非常长的句子将被忽略,并且仅包含少于 25 个单词的句子包含在摘要中。你可以增加或减少此数字。
1.5 输出摘要
最后一步是按照频率分数的升序选择前N个句子。以下脚本选择前五个句子。
输出显示了维基百科关于自然语言处理的文章的摘要。
2. 使用 Genism 利用 LDA 进行主题建模
主题建模是一项常见的 NLP 任务,它试图在文本文档中找到主题。请注意,主题建模是一种无监督的方法,主题建模只能让你了解哪些词经常出现。然后由你来推断已经看到频繁和同时出现的词的主题。
我们将使用 Gensim 库来执行主题建模。此外,为了抓取维基百科文章,我们将使用 Python 维基百科模块。
在命令终端上执行以下命令以安装 Wikipedia 和 Gensim 库。
$ pip install wikipedia
$ pip install gensim
2.1 维基百科文章抓取
我们将从维基百科中抓取四篇文章。文章主题是机器学习、比萨、冠状病毒和埃菲尔铁塔。
文章抓取后,然后通过“content”对象的“page”属性检索文章的内容.
2.2 数据清洗
下一步是清理所有数据,将数据转换为单词(tokens),将单词转换为小写,删除停用词,对单词进行词形还原(lemmatize),并删除所有小于五个字符的单词。clean_text() 方法执行所有这些任务。
以下脚本通过将数据传递到 clean_text() 方法,将数据转换为经过清理和预处理的单词集合。
2.3 使用 LDA 进行主题建模
LDA(Latent Dirichlet Allocation)是最常用的主题建模算法之一。LDA 模型做出两个假设:
1. 包含相似词的文本文档具有相同的主题。
2. 包含一组经常一起出现的词的文本文档具有相同的主题。
Gensim 库包含 LDA 模型的实现。但是,在使用它之前,你需要创建一个包含输入文本中所有单词的 Gensim 语料库。Gensim 语料库是使用 Gensim 字典创建的 BOW 模型。要创建 Gensim 字典,你需要将一组格式化的单词从 Gensim 库传递给 Corpora 模块的 Dictionary 对象。创建Gensim语料库,需要将Gensim词典传递给Gensim词典的doc2bow()方法,词典返回Gensim语料库,如下脚本所示。
要使用 Gensim 创建 LDA 模型,你可以使用 gensim.models.ldamodel 模块中的 LdaModel 类。
要提取的主题数传递给 num_topics 属性,而 Gensim 语料库作为第一个属性传递。pass 属性是指你要用于训练 LDA 模型的迭代次数。看下面的脚本:
训练模型后,你可以为每个主题提取 N 个单词。以下脚本每个主题提取七个单词,即总共 28 个单词。
输出显示第一个主题中的单词,例如 Eiffel、engineer、tallest、structure、French 等,指的是法国的一些高层建筑。由于 Eiffel 这个词是明确存在的,我们可以说我们文本中的主题之一与 Eiffel Tower 相关。
属于第二个主题的词是learning、machine和algorithm。因此,我们可以得出结论,第二个主题与机器学习有关。同样,可以得出结论,第三个主题与披萨有关,而最后一个主题与冠状病毒有关。
你可以看到,尽管在某些情况下,一个主题包含混合词,例如在主题 4 中,我们有机器学习、冠状病毒,由于我们的主题模型并非 100% 正确,因此可以将其视为噪音。
2.4 测试主题模型
最后一步是测试主题模型。让我们向我们的主题模型传递一个句子,看看分配给我们的主题是什么句子。
输出显示我们的句子属于主题 1 的概率为 13.30%,属于主题 2 的概率为 12.54%,属于主题 3 的概率为 61.63%,而属于主题 4 的概率为 12.50%。所以,最高概率是我们的句子属于主题 3,即 Pizza。我们实际上在我们的句子中谈论食物。因此,我们可以说我们的主题模型做出了正确的预测。
拓展阅读 – 主题模型
如果想要了解关于主题模型更多的知识,请阅读这一篇文章:https://bit.ly/3hFhuyG