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

news2024/10/6 5:54:19

一、说明

        这是一个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 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的句子分词器将为我们完成这项工作:

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.coloradmin.cn/o/899113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为ENSP网络设备配置实战4(OSPF+BGP+VPN+单臂路由)

题目要求 1、loopback口通过OSPF连通,合理规划OSPF开销,通过设置AR1->AR2->AR4链路,来消除负载链路。 2、AR3、AR4分别与AR1、AR2建立BGP邻居 3、AR3、AR4作为PC机网关设备 4、PC1、PC3由VPN-spi承载,PC2、PC4由VPN-spims承…

【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字

611. 有效三角形的个数 611. 有效三角形的个数https://leetcode.cn/problems/valid-triangle-number/ 题目描述: 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 解题思路: 本题是一个关于三角形是否能成立…

通过爬虫抓取上市企业利润表并在睿思BI中展示

睿思BI从v5.3开始支持网络爬虫,可以从指定URL抓取表格数据,本示例实现从网络上抓取上市企业招商银行的利润表数据,并在睿思BI中进行展现。 首先:从搜狐财经抓取招商银行利润表数据,操作过程如下: 1.在睿思…

提示词4大经典框架;将AI融入动画工作流的案例和实践经验;构建基于LLM的系统和产品的模式;提示工程的艺术 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 高效提示词的4大经典框架:ICIO、CRISPE、BROKE、RASCEF ICIO 框架 Intruction (任务) :你希望AI去做的任务&am…

软件测试中如何测试算法?

广义的算法是指解决问题的方案,小到求解数学题,大到制定商业策略,都可以叫做算法。而我们 今天讨论的软件测试中的算法,对应的英文单词为Algorithm ,专指计算机处理复杂问题的程序或 指令。 随着最近几年人工智能等领域的快速发展,算法受到前所未有的重视,算法测试也随之兴起。…

异步电机IM-改进的电压模型磁链观测器学习

导读:本期文章主要介绍异步电机的改进型电压模型磁链观测器。传统纯积分形式的积分器在低速区域存在初始值问题和直流偏置问题,所以在实际应用中必须对电压模型进行改进。本期文章中的对电压模型改进是借鉴一篇IEEE中的方法。 如果需要文章中对应的仿真…

gcc make cmake ninja的区别

理清C编译过程用到的工具概念 ref: 知乎 早先学C的时候,因为只需要点击IDE的运行按钮,程序就可以跑起来,写过最复杂的只不过是几个文件的学生管理系统。 现在要重新拾起C,看的项目和之前的不可同日而语,构建系统也复…

最优化方法Python计算:牛顿算法

设函数 f ( x ) f(\boldsymbol{x}) f(x), x ∈ R n \boldsymbol{x}\in\text{ℝ}^n x∈Rn二阶连续可微,记 g ( x ) ∇ f ( x ) \boldsymbol{g}(\boldsymbol{x})\nabla f(\boldsymbol{x}) g(x)∇f(x), H ( x ) ∇ 2 f ( x ) \boldsymbol{H}(\…

【数据结构OJ题】用栈实现队列

原题链接:https://leetcode.cn/problems/implement-queue-using-stacks/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 用两个栈实现,一个栈进行入队操作,另一个栈进行出队操作。 出队操作: 当出队的栈…

ARFoundation避坑记录

网上很多人说这个要改成可选的,否则如果没有安装arcore就会自动弹窗,但是如果关闭了,确实不会弹窗了,但是检测设备的代码也不能完美执行了,如果设备安装了arcore还好,如果没有安装测无法检测。 如果不想有…

常见的CRM系统报价

一个CRM系统大概多少钱?CRM系统的价格因为不同的厂商、功能、部署方式、用户数等因素而有很大的差异,没有一个固定的标准。但是,我们可以根据一些常见的CRM软件的报价,对CRM价格有一个大致的了解。 一、CRM的部署方式 CRM系统的…

填充柄功能

单元格右下角十字符号 顺序式填充 输入1,2,直接拉取即可实现顺序1到10. 复制式填充 CtrlD或者拉取,选择右下角复制单元格。 规律式填充 输入星期一,星期二,下拉一直可以到星期日 自定义填充 选择文件-》选项-》自定义序列 输…

AI工程师招募;60+开发者AI工具清单;如何用AI工具读懂插件源码;开发者出海解读;斯坦福LLM课程 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 一则AI工程师招募信息:新领域需要新技能 Vision Flow (目的涌现) 是一家基于 AGI 原生技术的创业公司,是全球探…

CSGO饰品价格会一直下跌吗?市场何时止跌回升?

最后一届巴黎major终于落下帷幕,Vitality小蜜蜂2-0战胜GL成功赢下本次Major冠军,也是首次夺得Major冠军!有人欢喜有人忧啊,csgo搬砖的饰品商人们一点也高兴不起来。 4月-5月,csgo皮肤饰品已持续走低快两个月了。手里满…

OPTEE3.17+ubuntu20.04+qemu_v8搭建OPTEE开发环境

参考文章: https://blog.csdn.net/capodexi/article/details/123548850 https://blog.csdn.net/qq_42557044/article/details/130973200 https://blog.csdn.net/zhuwade/article/details/125513873 https://zhuanlan.zhihu.com/p/521196386 https://blog.csdn.net/…

wsl2 安装cuda

1 设置为清华源 首先登录wsl 直接命令 wsl 就行 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g /e…

AVL树的讲解

算法拾遗三十八AVL树 AVL树AVL树平衡性AVL树加入节点AVL删除节点AVL树代码 AVL树 AVL树具有最严苛的平衡性,(增、删、改、查)时间复杂度为O(logN),AVL树任何一个节点,左树的高度和右树的高度差…

为什么美元美债没有出现死亡螺旋?

号外:刘教链最新文章,欢迎点击阅读: 公众号「刘教链内参」8.18发表:《内参:SEC批准ETF将推高大饼至15-18w$ ?》。 公众号「刘教链Pro」8.18发表:《大饼插爆两万五》。 * * * * * * 如果我们把美…

Linux系统基础服务启动的方法

服务,其实就是运行在操作系统后台的一个或者多个应用程序,为计算机系统或用户提供某项特定的服务。Linux系统运行的绝大多数服务都是需要安装才有的,例如FTP服务、httpd服务、MySQL、redis、Zookeeper、rabbitmq、vsftpd等等,那么…

面试题 ①

1、请讲一下常见的SQL优化方法(至少10条) 1.尽量避免使用子查询 虽然在 mysql5.6 版本之后对 select 的子查询用 join关联方式 做了优化,但是update/delete子查询依然先查外表再查内表,当外表过大时查询速度会很慢;因此…