文本摘要是从一个或多个源中提取最重要的信息以生成特定用户(或多个用户)和任务(或多个)的删节版本的过程。
——第1页,《自动文本摘要进展》,1999年。
人类通常非常擅长这项任务,因为我们有能力理解文本文档的含义,并提取显着特征以使用我们自己的话来总结文档。然而,在当今世界,文本摘要的自动方法至关重要,因为当今世界数据过多,缺乏人力和时间来解释数据。自动文本摘要有用的原因有很多:
文本摘要方法可以分为不同的类型。
文本摘要方法的类型
基于输入类型:
基于目的:
基于输出类型:
任务是使用 Python 对英语、丹麦语、法语等语言的电子邮件执行文本摘要。大多数公开可用的文本摘要数据集适用于长文档和文章。由于长文档和文章的结构与短电子邮件的结构明显不同,因此使用监督方法训练的模型可能会受到域适应性不佳的影响。因此,我选择探索无监督的方法来无偏见地预测摘要。
现在,让我们尝试了解构成模型管道的各个步骤。
我采用的文本摘要方法受到本文的启发。让我们将其分解为几个步骤:
为了激励这一步,让我们首先看看一些典型的电子邮件是什么样的:
英文电子邮件示例:
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 | [email protected]
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.
完成预处理步骤后,我们可以继续探索摘要管道的其余部分。
由于要汇总的电子邮件可以是任何语言,因此需要做的第一件事是确定电子邮件使用哪种语言。许多Python库都可用,它们使用机器学习技术来识别一段文本的编写语言。一些例子是多语言,语言检测和textblob。我使用语言检测来达到我的目的,它支持 55 种不同的语言。语言检测只需一个简单的函数调用即可执行:
对每封电子邮件执行语言识别后,我们可以使用此信息将每封电子邮件拆分为其组成句子,使用每种语言的句子分隔符的特定规则。NLTK的句子分词器将为我们完成这项工作:
我们需要一种方法来为电子邮件中的每个句子生成固定长度的向量表示。这些表示形式应编码相应句子的固有语义和含义。用于生成单词嵌入的众所周知的 Skip-Gram Word2Vec 方法可以为我们模型词汇表中存在的单个单词提供词嵌入(一些更高级的方法也可以使用子词信息为不在模型词汇表中的单词生成嵌入)。
对于句子嵌入,一种简单的方法是对句子中包含的单词获取单词向量的加权和。我们采用加权总和,因为经常出现的单词,如“和”、“到”和“the”,很少或根本没有关于句子的信息。一些很少出现的单词,是少数句子所独有的,具有更多的代表性。因此,我们认为权重与单词出现的频率成反比。本文详细描述了这种方法。
但是,这些无监督方法不考虑句子中的单词顺序。这可能会对模型性能造成不良损失。为了克服这个问题,我选择使用维基百科转储作为训练数据,以监督方式训练Skip-Thought句子编码器。跳过思想模型由两部分组成:
给定一个包含一系列句子的数据集,解码器应逐字生成上一个和下一个句子。编码器-解码器网络被训练以最小化句子重建损失,在此过程中,编码器学习生成矢量表示,为解码器编码足够的信息,以便它可以生成相邻的句子。这些学习的表示使得语义相似的句子的嵌入在向量空间中彼此更接近,因此适合聚类。我们电子邮件中的句子作为编码器网络的输入给出,以获得所需的矢量表示。本文详细介绍了这种用于获取句子嵌入的跳过思维方法。
给定一个句子(灰点),模型尝试预测前一个句子(红点)和下一句(绿点)。图片来源:https://arxiv.org/pdf/1506.06726.pdf
为了实现,我使用了由skip-thoughts论文的作者开源的代码。它是用Theano写的,可以在这里找到。获取电子邮件中每个句子的嵌入的任务可以通过几行代码完成:
跳思编码器-解码器架构
在为电子邮件中的每个句子生成句子嵌入后,方法是将这些嵌入聚类到高维向量空间中,以达到预定义的簇数。聚类数将等于摘要中所需的句子数。我选择摘要中的句子数等于电子邮件中句子总数的平方根。人们也可以认为它等于句子总数的 30%。下面是可以为你执行群集的代码:
每个句子嵌入簇都可以解释为一组语义相似的句子,其含义只能由摘要中的一个候选句子表达。候选句子被选为其向量表示最接近聚类中心的句子。然后对对应于每个集群的候选句子进行排序,以形成电子邮件的摘要。摘要中候选句子的顺序由句子在原始电子邮件中相应集群中的位置决定。例如,如果候选句子簇中的大多数句子都出现在电子邮件的开头,则选择候选句子作为摘要的第一行。以下代码行实现了这一点:
由于这种方法本质上是从文本中提取一些候选句子以形成摘要,因此称为抽取总结。
为上述电子邮件获得的示例摘要如下:
对于英文电子邮件:
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 存储库中,供您参考。随意分叉和修改代码!
成本与否迭代图
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?
从上面可以明显看出,该模型的效果出奇地好,即使句子的长度大不相同,使用的词汇也完全不同,也可以标记相似的句子。
这里介绍的方法效果很好,但并不完美。通过增加模型复杂性,可以进行许多改进:
上述所有实验都是在n1-highmem-8 Google Cloud实例上进行的,该实例具有八核Intel(R)Xeon(R)CPU和具有80 GB RAM的Nvidia Tesla K52 GPU。
特别感谢我的导师拉胡尔·库马尔(Rahul Kumar)一路走来的建议和有用的建议,没有他,这是不可能的。我还要感谢 Jatana.ai 给我这个绝佳的机会和必要的资源来完成同样的工作。