使用句子嵌入的无监督文本摘要

一、说明

这是一个AI研究生班的作业练习, 在本文中,我将描述我用来在 Python 中执行文本摘要的方法,这是我在导师分配给我的很棒的任务列表之一。

二、什么是文本摘要?

文本摘要是从一个或多个源中提取最重要的信息以生成特定用户(或多个用户)和任务(或多个)的删节版本的过程。

——第1页,《自动文本摘要进展》,1999年。

人类通常非常擅长这项任务,因为我们有能力理解文本文档的含义,并提取显着特征以使用我们自己的话来总结文档。然而,在当今世界,文本摘要的自动方法至关重要,因为当今世界数据过多,缺乏人力和时间来解释数据。自动文本摘要有用的原因有很多:

  1. 摘要减少了阅读时间。
  2. 在研究文档时,摘要使选择过程更容易。
  3. 自动汇总提高了索引的有效性。
  4. 自动汇总算法比人工汇总器偏差更小。
  5. 个性化摘要在问答系统中很有用,因为它们提供个性化信息。
  6. 使用自动或半自动摘要系统使商业摘要服务能够增加他们能够处理的文本文档的数量。

2.1 文本摘要方法的类型:

        文本摘要方法可以分为不同的类型。

        文本摘要方法的类型

        基于输入类型:

  1. Single 文档其中输入长度较短。许多早期的摘要系统处理单个文档摘要。
  2. 多文档,其中输入可以任意长。

        基于目的:

  1. 泛型,其中模型不对要汇总的文本的领域或内容做出假设,并将所有输入视为同质。已经完成的大部分工作都围绕着通用摘要。
  2. 特定于域,其中模型使用特定于域的知识来形成更准确的摘要。例如,总结特定领域的研究论文、生物医学文件等。
  3. 基于查询,其中摘要仅包含回答有关输入文本的自然语言问题的信息。

        基于输出类型:

  1. 抽取式,从输入文本中选择重要句子以形成摘要。今天,大多数总结方法本质上都是抽取性的。
  2. 抽象的,模型形成自己的短语和句子,以提供更连贯的摘要,就像人类会生成的内容一样。这种方法绝对比抽取式总结更具吸引力,但要困难得多。

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 Support1600 Amphitheatre Parkway
Mountain View, CA
United States 

挪威电子邮件示例:

HeiGrunnet 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.noHusk å 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 SupportOne 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的句子分词器将为我们完成这项工作:

NLTK的句子分词器

        

3.4 步骤4:跳思路编码器

        我们需要一种方法来为电子邮件中的每个句子生成固定长度的向量表示。这些表示形式应编码相应句子的固有语义和含义。用于生成单词嵌入的众所周知的 Skip-Gram Word2Vec 方法可以为我们模型词汇表中存在的单个单词提供词嵌入(一些更高级的方法也可以使用子词信息为不在模型词汇表中的单词生成嵌入)。

Skip-gram Word2Vec 模型经过训练,可以预测给定输入单词的周围单词。

        对于句子嵌入,一种简单的方法是对句子中包含的单词获取单词向量的加权和。我们采用加权总和,因为经常出现的单词,如“”、“”和“the”,很少或根本没有关于句子的信息。一些很少出现的单词,是少数句子所独有的,具有更多的代表性。因此,我们认为权重与单词出现的频率成反比。本文详细描述了这种方法。

        但是,这些无监督方法不考虑句子中的单词顺序。这可能会对模型性能造成不良损失。为了克服这个问题,我选择使用维基百科转储作为训练数据,以监督方式训练Skip-Thought句子编码器。跳过思想模型由两部分组成:

  1. 编码器网络:编码器通常是一个 GRU-RNN,它为输入中的每个句子 S(i) 生成固定长度的向量表示 h(i)。编码表示 h(i) 是通过将 GRU 单元的最终隐藏状态(即在它看到整个句子之后)传递到多个密集层获得的。
  2. 解码器网络: 解码器网络将这个向量表示 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.vecwiki.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? 

从上面可以明显看出,该模型的效果出奇地好,即使句子的长度大不相同,使用的词汇也完全不同,也可以标记相似的句子。

七、可能的改进

这里介绍的方法效果很好,但并不完美。通过增加模型复杂性,可以进行许多改进:

  1. 快速思维向量是跳过思维方法的最新进展,可以显着减少训练时间和提高性能。
  2. 跳过思想编码表示的维数为 4800。由于维度的诅咒,这些高维向量不是最适合聚类目的。在使用自动编码器或 LSTM 自动编码器进行聚类之前,可以在压缩表示中传递进一步的序列信息,从而降低矢量的维数。
  3. 抽象总结可以通过训练解码器网络来实现,而不是使用抽取方法,该解码器网络可以将集群中心的编码表示转换回自然语言句子。这样的解码器可以通过跳思维编码器生成的数据进行训练。但是,如果我们希望解码器生成合理且语法正确的句子,则需要为解码器做出非常谨慎的超参数调整和架构决策。

八、基础设施设置

上述所有实验都是在n1-highmem-8 Google Cloud实例上进行的,该实例具有八核Intel(R)Xeon(R)CPU和具有80 GB RAM的Nvidia Tesla K52 GPU。

特别感谢我的导师拉胡尔·库马尔(Rahul Kumar)一路走来的建议和有用的建议,没有他,这是不可能的。我还要感谢 Jatana.ai 给我这个绝佳的机会和必要的资源来完成同样的工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/73524.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT的mysql(数据库)最佳实践和常见问题解答

涉及到数据库,首先安利一个软件Navicat Premium,用来查询数据库很方便 QMysql驱动是Qt SQL模块使用的插件,用于与MySQL数据库进行通信。要编译QMysql驱动,您需要满足以下条件: 您需要安装MySQL的客户端库和开发头文件…

JVM——类加载器

回顾一下类加载过程 类加载过程:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。 一个非数组类的加载阶段(加载阶段获取类的二进制字节流的动作)是可控性最强的阶段,这一步我们可以去完成还可以自定义…

常用curl参数及样例讲解

1 缘起 后端/后台项目开发过程中,有两个阶段的接口测试和验证,自测阶段,通过Postman构建请求, 自建一些参数,测试功能以及边界条件,这些都是可以自行掌控的,当完成功能验证与前端对接时&#x…

ForkJoinPool继承类RecursiveTask

package com.cdkj.project.syn.common;/*** author YUFEI* ClassName SearchFiles* description: TODO* date 2023年05月18日* version: 1.0*/import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ForkJoinPool; import jav…

Spring Boot(六十四):SpringBoot集成Gzip压缩数据

1 实现思路 2 实现 2.1 创建springboot项目 2.2 编写一个接口,功能很简单就是传入一个Json对象并返回 package com.example.demo.controller;import com.example.demo.entity.Advertising; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframewo…

QT处理日志文件

由于实际生产需要,软件系统的运行,会产生大量的日志文件,有时候一天就能产生超过百万条log记录,那么为了能够处理日志文件,查询并且找到我们想要的报错信息,因此不得不考虑怎么实现,打开大日志文…

C++头文件

C头文件 一般头文件特殊头文件windows.hbits/stdc.h 一般头文件 C头文件是一种包含预定义函数、类和变量声明的文件。它们通常用于在源代码文件中引入外部库或模块的功能。 头文件的作用是提供程序所需的声明信息,以便在源代码文件中使用这些声明。当你在源代码文…

【LeetCode75】第二十九题 删除链表的中间节点

目录 题目: 示例; 分析: 代码: 题目: 示例; 分析: 给我们一个链表,让我们把链表中间的节点删了。 那么最直观最基础的办法是遍历两边链表,第一遍拿到链表长度,第二次把链表中间节点删了。 这个暴力做法我没事过…

Linux/centos上如何配置管理NFS服务器?

Linux/centos上如何配置管理NFS服务器? 1 NFS基础了解1.1 NFS概述1.2 NFS工作流程 2 安装和启动NFS服务2.1 安装NFS服务器2.2 启动NFS服务 3 配置NFS服务器和客户端3.1 配置NFS服务器3.2 配置NFS客户端 4 实际示例4.1 基本要求4.2 案例实现 1 NFS基础了解 NFS&…

国产之光:讯飞星火最新大模型V2.0

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

微信小程序:函数节流与函数防抖

目录 问题引入: 定义 解决方案:函数节流 一、案例举例 1.页面展示 2.search.wxml标签展示 3.search.js展示 4.结果展示 二、函数节流解决问题 1.函数 2.实例应用 三、函数防抖解决问题 1.函数 2.原理 3.应用场景 4.应用实例 总结 问题引入…

Ceph入门到精通-Aws Iam(user,role,group,policy,resource)架构图和快速入门

-- Aws Iam(identity,user,role,group,policy,resource,)架构图和快速入门. 【官网】:Cloud Computing Services - Amazon Web Services (AWS) 应用场景 aws 云服务运维,devops过程中经常涉及各项服务,权限,角色的处理。 为了更好的使用各项…