一、说明
二、什么是文本摘要?
文本摘要是从一个或多个源中提取最重要的信息以生成特定用户(或多个用户)和任务(或多个)的删节版本的过程。
——第1页,《自动文本摘要进展》,1999年。
人类通常非常擅长这项任务,因为我们有能力理解文本文档的含义,并提取显着特征以使用我们自己的话来总结文档。然而,在当今世界,文本摘要的自动方法至关重要,因为当今世界数据过多,缺乏人力和时间来解释数据。自动文本摘要有用的原因有很多:
- 摘要减少了阅读时间。
- 在研究文档时,摘要使选择过程更容易。
- 自动汇总提高了索引的有效性。
- 自动汇总算法比人工汇总器偏差更小。
- 个性化摘要在问答系统中很有用,因为它们提供个性化信息。
- 使用自动或半自动摘要系统使商业摘要服务能够增加他们能够处理的文本文档的数量。
2.1 文本摘要方法的类型:
文本摘要方法可以分为不同的类型。
文本摘要方法的类型
基于输入类型:
- Single 文档,其中输入长度较短。许多早期的摘要系统处理单个文档摘要。
- 多文档,其中输入可以任意长。
基于目的:
- 泛型,其中模型不对要汇总的文本的领域或内容做出假设,并将所有输入视为同质。已经完成的大部分工作都围绕着通用摘要。
- 特定于域,其中模型使用特定于域的知识来形成更准确的摘要。例如,总结特定领域的研究论文、生物医学文件等。
- 基于查询,其中摘要仅包含回答有关输入文本的自然语言问题的信息。
基于输出类型:
- 抽取式,从输入文本中选择重要句子以形成摘要。今天,大多数总结方法本质上都是抽取性的。
- 抽象的,模型形成自己的短语和句子,以提供更连贯的摘要,就像人类会生成的内容一样。这种方法绝对比抽取式总结更具吸引力,但要困难得多。
2.2 我们的任务
任务是使用 Python 对英语、丹麦语、法语等语言的电子邮件执行文本摘要。大多数公开可用的文本摘要数据集适用于长文档和文章。由于长文档和文章的结构与短电子邮件的结构明显不同,因此使用监督方法训练的模型可能会受到域适应性不佳的影响。因此,我选择探索无监督的方法来无偏见地预测摘要。
现在,让我们尝试了解构成模型管道的各个步骤。
三、文本摘要模型管道
我采用的文本摘要方法受到本文的启发。让我们将其分解为几个步骤:
3.1 步骤1:电子邮件清理
为了激励这一步,让我们首先看看一些典型的电子邮件是什么样的:
英文电子邮件示例:
Hi Jane,
Thank you for keeping me updated on this issue. I'm happy to hear that the issue got resolved after all and you can now use the app in its full functionality again.
Also many thanks for your suggestions. We hope to improve this feature in the future.
In case you experience any further problems with the app, please don't hesitate to contact me again.
Best regards,
John Doe
Customer Support
1600 Amphitheatre Parkway
Mountain View, CA
United States
挪威电子邮件示例:
Hei
Grunnet manglende dekning på deres kort for månedlig trekk, blir dere nå overført til årlig fakturering.
I morgen vil dere motta faktura for hosting og drift av nettbutikk for perioden 05.03.2018-05.03.2019.
Ta gjerne kontakt om dere har spørsmål.
Med vennlig hilsen
John Doe - SomeCompany.no
04756 | johndoe@somecompany.no
Husk å sjekk vårt hjelpesenter, kanskje du finner svar der: https://support.somecompany.no/
意大利电子邮件的示例:
Ciao John,
Grazie mille per averci contattato! Apprezziamo molto che abbiate trovato il tempo per inviarci i vostri commenti e siamo lieti che vi piaccia l'App.
Sentitevi liberi di parlare di con i vostri amici o di sostenerci lasciando una recensione nell'App Store!
Cordiali saluti,
Jane Doe
Customer Support
One Infinite Loop
Cupertino
CA 95014
正如人们所看到的,电子邮件开头和结尾的称呼和签名行对摘要生成任务没有任何价值。因此,有必要从电子邮件中删除这些行,我们知道,这些行不应该有助于摘要。这使得模型可以更好地执行更简单的输入。
由于称呼和签名行可能因电子邮件和一种语言而异,因此删除它们将需要与正则表达式匹配。为了实现这个模块,我使用了在Mailgun Talon GitHub存储库中找到的稍微修改的代码版本,以便它也支持其他语言。该模块还会删除换行符。代码的较短版本如下所示:
除了修改代码来创建自己的clean(),您还可以使用:
上述电子邮件的清理版本将如下所示:
清洁的英文电子邮件:
Thank you for keeping me updated on this issue. I'm happy to hear that the issue got resolved after all and you can now use the app in its full functionality again. Also many thanks for your suggestions. We hope to improve this feature in the future. In case you experience any further problems with the app, please don't hesitate to contact me again.
清理后的挪威电子邮件:
Grunnet manglende dekning på deres kort for månedlig trekk, blir dere nå overført til årlig fakturering. I morgen vil dere motta faktura for hosting og drift av nettbutikk for perioden 05.03.2018-05.03.2019. Ta gjerne kontakt om dere har spørsmål.
清洁后的意大利电子邮件:
Grazie mille per averci contattato! Apprezziamo molto che abbiate trovato il tempo per inviarci i vostri commenti e siamo lieti che vi piaccia l'App. Sentitevi liberi di parlare di con i vostri amici o di sostenerci lasciando una recensione nell'App Store.
完成预处理步骤后,我们可以继续探索摘要管道的其余部分。
3.2 步骤2:语言检测
由于要汇总的电子邮件可以是任何语言,因此需要做的第一件事是确定电子邮件使用哪种语言。许多Python库都可用,它们使用机器学习技术来识别一段文本的编写语言。一些例子是多语言,语言检测和textblob。我使用语言检测来达到我的目的,它支持 55 种不同的语言。语言检测只需一个简单的函数调用即可执行:
3.3 步骤3 :句子标记化
对每封电子邮件执行语言识别后,我们可以使用此信息将每封电子邮件拆分为其组成句子,使用每种语言的句子分隔符的特定规则。NLTK的句子分词器将为我们完成这项工作:
3.4 步骤4:跳思路编码器
我们需要一种方法来为电子邮件中的每个句子生成固定长度的向量表示。这些表示形式应编码相应句子的固有语义和含义。用于生成单词嵌入的众所周知的 Skip-Gram Word2Vec 方法可以为我们模型词汇表中存在的单个单词提供词嵌入(一些更高级的方法也可以使用子词信息为不在模型词汇表中的单词生成嵌入)。
对于句子嵌入,一种简单的方法是对句子中包含的单词获取单词向量的加权和。我们采用加权总和,因为经常出现的单词,如“和”、“到”和“the”,很少或根本没有关于句子的信息。一些很少出现的单词,是少数句子所独有的,具有更多的代表性。因此,我们认为权重与单词出现的频率成反比。本文详细描述了这种方法。
但是,这些无监督方法不考虑句子中的单词顺序。这可能会对模型性能造成不良损失。为了克服这个问题,我选择使用维基百科转储作为训练数据,以监督方式训练Skip-Thought句子编码器。跳过思想模型由两部分组成:
- 编码器网络:编码器通常是一个 GRU-RNN,它为输入中的每个句子 S(i) 生成固定长度的向量表示 h(i)。编码表示 h(i) 是通过将 GRU 单元的最终隐藏状态(即在它看到整个句子之后)传递到多个密集层获得的。
- 解码器网络: 解码器网络将这个向量表示 h(i) 作为输入,并尝试生成两个句子 — S(i-1) 和 S(i+1),它们可能分别出现在输入句子之前和之后。实现单独的解码器用于生成上一个和下一个句子,两者都是 GRU-RNN。向量表示 h(i) 充当解码器网络的 GRU 的初始隐藏状态。
给定一个包含一系列句子的数据集,解码器应逐字生成上一个和下一个句子。编码器-解码器网络被训练以最小化句子重建损失,在此过程中,编码器学习生成矢量表示,为解码器编码足够的信息,以便它可以生成相邻的句子。这些学习的表示使得语义相似的句子的嵌入在向量空间中彼此更接近,因此适合聚类。我们电子邮件中的句子作为编码器网络的输入给出,以获得所需的矢量表示。本文详细介绍了这种用于获取句子嵌入的跳过思维方法。
给定一个句子(灰点),模型尝试预测前一个句子(红点)和下一句(绿点)。图片来源:https://arxiv.org/pdf/1506.06726.pdf
为了实现,我使用了由skip-thoughts论文的作者开源的代码。它是用Theano写的,可以在这里找到。获取电子邮件中每个句子的嵌入的任务可以通过几行代码完成:
跳思编码器-解码器架构
3.5 步骤 5:聚类
在为电子邮件中的每个句子生成句子嵌入后,方法是将这些嵌入聚类到高维向量空间中,以达到预定义的簇数。聚类数将等于摘要中所需的句子数。我选择摘要中的句子数等于电子邮件中句子总数的平方根。人们也可以认为它等于句子总数的 30%。下面是可以为你执行群集的代码:
3.6 步骤 6 :总结
每个句子嵌入簇都可以解释为一组语义相似的句子,其含义只能由摘要中的一个候选句子表达。候选句子被选为其向量表示最接近聚类中心的句子。然后对对应于每个集群的候选句子进行排序,以形成电子邮件的摘要。摘要中候选句子的顺序由句子在原始电子邮件中相应集群中的位置决定。例如,如果候选句子簇中的大多数句子都出现在电子邮件的开头,则选择候选句子作为摘要的第一行。以下代码行实现了这一点:
由于这种方法本质上是从文本中提取一些候选句子以形成摘要,因此称为抽取总结。
为上述电子邮件获得的示例摘要如下:
对于英文电子邮件:
I'm happy to hear that the issue got resolved after all and you can now use the app in its full functionality again. Also many thanks for your suggestions. In case you experience any further problems with the app, please don't hesitate to contact me again.
对于丹麦电子邮件:
Grunnet manglende dekning på deres kort for månedlig trekk, blir dere nå overført til årlig fakturering. I morgen vil dere motta faktura for hosting og drift av nettbutikk for perioden 05.03.2018-05.03.2019. Ta gjerne kontakt om dere har spørsmål.
对于意大利语电子邮件:
Apprezziamo molto che abbiate trovato il tempo per inviarci i vostri commenti e siamo lieti che vi piaccia l'App. Sentitevi liberi di parlare di con i vostri amici o di sostenerci lasciando una recensione nell'App Store.
四、训练
预先训练的模型可用于对英语句子进行编码(有关更多详细信息,请参阅存储库)。然而,对于丹麦语句子,必须训练跳过思维模型。数据取自丹麦语维基百科转储,您可以在此处获得。提取了.bz2存档,并解析了生成的.xml以剥离html,以便仅保留纯文本。有许多工具可用于解析维基百科转储,但没有一个是完美的。它们也可能需要大量时间,具体取决于用于解析的方法。我从这里使用了该工具,它不是最好的,但是免费的,可以在合理的时间内完成工作。对生成的纯文本执行简单的预处理,例如删除换行符。通过这样做,大量的训练数据可供跳过思想模型训练数天。
由此生成的训练数据包括来自维基百科条目的2,712,935个丹麦句子。训练过程还需要预先训练的Wor2Vec词向量。为此,我使用了Facebook fastText的预训练向量(只是文件而不是,因此不使用词汇扩展功能)用于丹麦语。预训练向量的词汇量为312,956个单词。由于这些词向量也是在丹麦语维基百科上训练的,因此词汇外的词非常罕见。存储库中还提供所使用的训练代码。wiki.da.vec
wiki.da.bin
五、实施详细信息
下面是该模块的简化版本,它仅支持英文电子邮件,但实现了上述所有步骤,并且效果非常好。该模块以及有关如何运行它的说明存在于此 GitHub 存储库中,供您参考。随意分叉和修改代码!
六、结果
- 正如您所注意到的,当电子邮件由几个句子组成而不是只有 2-3 个句子时,这种摘要方法的效果要好得多。对于三句话的电子邮件,摘要将由两句话组成,情况并非如此。此外,这三个句子可能传达完全不同的东西,从任何一个句子中省略信息是不可取的。正是由于这个原因,抽取方法通常不是总结短投入的首选。监督 Seq2Seq 模型更适合此任务。然而,在这种情况下,电子邮件的长度通常更长,提取方法的效果出奇地好。
- 使用跳过思想向量的一个缺点是模型可能需要很长时间才能训练。虽然在训练2-3天后获得了可接受的结果,但丹麦跳过思想模型训练了大约一周。成本在迭代期间波动很大,因为它是按句子长度规范化的。
成本与否迭代图
- 为了了解 Skip-Thoughts 模型的效果如何,我们可以查看数据集中大多数相似的句子对:
I can assure you that our developers are already aware of the issue and are trying to solve it as soon as possible.
AND
I have already forwarded your problem report to our developers and they will now investigate this issue with the login page in further detail in order to detect the source of this problem.
--------------------------------------------------------------------I am very sorry to hear that.
AND
We sincerely apologize for the inconvenience caused.
--------------------------------------------------------------------Therefore, I would kindly ask you to tell me which operating system you are using the app on.
AND
Can you specify which device you are using as well as the Android or iOS version it currently has installed?
从上面可以明显看出,该模型的效果出奇地好,即使句子的长度大不相同,使用的词汇也完全不同,也可以标记相似的句子。
七、可能的改进
这里介绍的方法效果很好,但并不完美。通过增加模型复杂性,可以进行许多改进:
- 快速思维向量是跳过思维方法的最新进展,可以显着减少训练时间和提高性能。
- 跳过思想编码表示的维数为 4800。由于维度的诅咒,这些高维向量不是最适合聚类目的。在使用自动编码器或 LSTM 自动编码器进行聚类之前,可以在压缩表示中传递进一步的序列信息,从而降低矢量的维数。
- 抽象总结可以通过训练解码器网络来实现,而不是使用抽取方法,该解码器网络可以将集群中心的编码表示转换回自然语言句子。这样的解码器可以通过跳思维编码器生成的数据进行训练。但是,如果我们希望解码器生成合理且语法正确的句子,则需要为解码器做出非常谨慎的超参数调整和架构决策。
八、基础设施设置
上述所有实验都是在n1-highmem-8 Google Cloud实例上进行的,该实例具有八核Intel(R)Xeon(R)CPU和具有80 GB RAM的Nvidia Tesla K52 GPU。
特别感谢我的导师拉胡尔·库马尔(Rahul Kumar)一路走来的建议和有用的建议,没有他,这是不可能的。我还要感谢 Jatana.ai 给我这个绝佳的机会和必要的资源来完成同样的工作。