如何用深度学习和Python做文本总结?

729 阅读7分钟

在这个博客中: 学习如何用Python做文本总结。下载文本总结Python环境,导入要总结的文本,构建、测试和运行总结文本的程序。

有没有觉得你没有足够的时间去阅读所有你想看的东西?如果你可以运行一个程序,为你总结文件,无论是你最喜欢的新闻来源、学术文章,还是与工作有关的文件,会怎么样?

文本总结是一项自然语言处理(NLP)任务,它在不丢失重要信息的情况下,对大文本中的信息进行总结,以便快速消费。你最喜欢的新闻聚合器(如谷歌新闻)利用文本总结算法,以便为你提供你需要的信息,让你知道该文章是否相关,而不必点击链接。

本教程将引导你完成一个简单的文本总结任务。我们将使用Abstractive Text Summarization和像newseper2k和PyPDF2这样的包来把文本转换成Python能理解的格式。最后,我们将使用SPaCy用深度学习对文本进行总结。一旦你了解了文本总结的工作原理,你也可以尝试对需要先转录成文本的音频文件进行同样的工作。

text summarization tutorial python

有两种主要的文本总结方法。:

  • 提取式文本总结 --试图识别重要的句子,然后将其添加到总结中,总结中会包含原文中的确切句子。
  • 抽象式文本总结 --试图识别重要的章节,解释上下文并智能地生成一个总结。

在这篇文章中,我们将对一篇新闻文章使用抽象法。这个过程很简单:

  1. 安装一个包含任务所需的所有软件包的Python环境。
  2. 导入要总结的文本。
  3. 建立、测试和运行总结文本的程序。

本文中使用的所有代码都可以在我的 GitLab仓库中找到 。都准备好了吗?我们开始吧。

第一步:安装文本总结的Python环境

为了跟上本文的代码,你可以 下载并安装我们预建的文本总结环境,其中包含Python 3.8版本和本文中使用的软件包。

activestate python environment

为了下载这个随时可用的Python环境,你需要创建一个 ActiveState Platform 账户。只要用你的GitHub凭证或你的电子邮件地址来注册。注册很简单,它可以解锁ActiveState平台的许多好处!

对于Linux用户:运行以下程序可以自动下载并安装我们的CLI,状态工具, 以及文本总结 到一个虚拟环境。

sh <(curl -q https://platform.activestate.com/dl/cli/install.sh) --activate-default Pizza-Team/Text-Summarization

第2步--为抽象化文本总结选择一个文本源

通过文本传达的信息的质量、类型和密度因来源不同而不同。教科书往往密度低但质量高,而学术文章的质量和密度都很高。另一方面,新闻文章在不同的来源上会有很大差异。

无论文本来自哪里,这里的目标是尽量减少你的阅读时间。因此,我们将建立一个可以轻松适应任何数量来源的工具。

在这个例子中,我们将使用 一篇 关于最近全球变暖研究的 新闻文章 ,从 科学日报 作为我们的文本源。请随意使用不同的文章。

为了从URL中提取文本,我们将使用 newspaper3k包

from newspaper import Article

url = 'https://www.sciencedaily.com/releases/2021/08/210811162816.htm'
article = Article(url)
article.download()
article.parse()

现在,我们将下载并解析文章以提取相关属性。从这里,我们可以查看文章的文本。

article.text

deep learning tutorial

很明显,这是一个相当长且密集的文本。这个文本将作为我们在下一步要写的总结算法的输入。

如果你的特定应用需要从pdf文档中提取文本,可以试试 PyPDF2软件包。或者,如果你有需要转录成文本的音频文件,可以尝试使用 SpeechRecognition包。一旦你有了Python可以理解的文本格式,你就可以继续对其进行总结。

第3步 - 用SpaCy总结文本

人类可能会以如下方式来完成对一份文件的总结:

  1. 阅读全文
  2. 理解所传达的概念
  3. 挑选出最重要的概念
  4. 用更简洁的方式来简化它们

对于计算机来说,要完成同样的任务,必须对文本进行语义理解。虽然目前的NLP算法可以进行语义分析,但它往往需要大量的计算能力,并且产生的结果与其他提取技术的质量相似。

与其说提取式总结是对文本的理解,不如说它依赖于从文本本身构建的定量指标,而不附加任何外在的意义。我们的方法是简单的:

  1. 查看特定词汇的使用频率
  2. 对每个句子中的频率进行求和
  3. 根据这个总和对句子进行排名

当然,我们的假设是,更高频率的词语使用意味着更 "重要 "的意义。这可能看起来过于简单,但这种方法往往会产生令人惊讶的好结果。

为了开始,我们首先需要导入不同的软件包:

import spacy
from spacy.lang.en.stop_words import STOP_WORDS
from string import punctuation
from heapq import nlargest

我们将使用 SpaCy 导入一个预先训练好的NLP管道来帮助解释文本的语法结构。这将使我们能够识别出最常见的词汇,这些词汇通常是有用的,可以过滤掉(即 STOP_WORDS)以及标点符号(即 标点符号)。我们还将使用 nlargest 函数来提取最重要句子的百分比。我们的算法将使用以下步骤。

  • 用SpaCy管道将文本标记化。这将文本分割成单词、标点符号等,使用英语语言特有的语法规则。
  • 计算一个词被使用的次数(不包括停顿词或标点符号),然后将计数标准化。一个使用频率较高的词,其归一化的次数也较高。
  • 计算每个句子的归一化计数之和。
  • 提取排名最高的句子的百分比。这些作为我们的总结。

我们可以写一个函数来执行这些步骤,如下所示:

def summarize(text, per):
    nlp = spacy.load('en_core_web_sm')
    doc= nlp(text)
    tokens=[token.text for token in doc]
    word_frequencies={}
    for word in doc:
        if word.text.lower() not in list(STOP_WORDS):
            if word.text.lower() not in punctuation:
                if word.text not in word_frequencies.keys():
                    word_frequencies[word.text] = 1
                else:
                    word_frequencies[word.text] += 1
    max_frequency=max(word_frequencies.values())
    for word in word_frequencies.keys():
        word_frequencies[word]=word_frequencies[word]/max_frequency
    sentence_tokens= [sent for sent in doc.sents]
    sentence_scores = {}
    for sent in sentence_tokens:
        for word in sent:
            if word.text.lower() in word_frequencies.keys():
                if sent not in sentence_scores.keys():                            
                    sentence_scores[sent]=word_frequencies[word.text.lower()]
                else:
                    sentence_scores[sent]+=word_frequencies[word.text.lower()]
    select_length=int(len(sentence_tokens)*per)
    summary=nlargest(select_length, sentence_scores,key=sentence_scores.get)
    final_summary=[word.text for word in summary]
    summary=''.join(final_summary)
    return summary

注意, per 是你想提取的句子的百分比(0到1)。在 ScienceDaily的 文章 上测试 一下 ,运行:

summarize(article.text, 0.05)

输出结果应该是这样的:

text summarization 2

你可以自己阅读完整的文章,以判断这对全文的反映程度。然而,作者已经在文章的顶部提供了一个摘要。它写道:"新的古气候研究发现,全球变暖会带来更多的极端变暖。研究人员观察到过去6600万年的 "变暖偏向",如果冰原消失,这种偏向可能会恢复"。

基本上一针见血,对吗?

结论--使用文本总结,用Python提高你的生产力

通过最大限度地减少阅读时间来提高你的效率,可以对生产力产生巨大的影响。无论您是阅读教科书、报告还是学术期刊,利用Python和SpaCy的自然语言处理能力可以减少您花费的时间,而不影响信息的质量。