自动文摘系统实现总结

自动文摘系统实现总结
应用场景

利用Ai系统帮助人把不同分类的大量文档自动做总结,重要点总结,比较典型公司美国alphasense公司主要做这块终端抽取重要信息,大量节省人力成本和时间成本

自动文摘有两种方式
基于抽取关键信息方式
看文章中哪个句子或单词那个是重要的,并抽取出来,文档内容意思不变,不能保证生成的,而自动抽取摘要是很难得, 目前未解决问题,关键词句子提取出来,不能保证生成摘要很优秀,目前常用方式

基于关键信息抽取的方法来源于谷歌page rank,主要用于搜索引擎,假设每个节点看过一个句子,page rank场景关注与那些场景最重要,计算出那个节点重要并抽取拼接成句子就是摘要。

Page算法讲解:

描述:假设每个网站有多个超链接,每个节点一个网页,适合图算法模拟

Page rank就是一个节点在图里的重要性。 例如A的page rank值很高,说明它很重要,适合seo常用应用

B节点很多指向它 它的关注点最高 D page rank 最小的 只关注别人 没人关注 c的触动比e多,所以c的page rank比e大,因为c有一个指向自己,自己指向2个节点 而e没有人指向自己

Page rank 计算详解:(d类似于平衡两个项的数,设置越大受到周围网络影响大 基本设置0.7-0.9之间的数值)

随着时间的增加,P(A) P(B) P© 会慢慢随时间推移趋向于同一个数字,到那时就会到一个停止点,这个过程叫收敛

为什么收敛呢,因为这种特殊过程符合于马尔科夫链。

马尔科夫链为什么收敛,达到平稳状态 每列值相加等于1

具体流程

把原始文档转换成字符串的形式,然后切分成句子,转换成向量的形式 计算每个句子之间的相似度(利用余弦相似度),并把相似度数据保存成100*100的矩阵中,然后转化为graph图(具体为两两相似度的值),通过page rank算法计算重要性并进行排序,把重要性最高的拼接成语句展示

第一步:把文章切分成句子(中文以句号切分)或是抽取单词

分词工具我接触的有2种工具:

第一个工具: jieba分词,针对于中文的比较好的分词工具,其中包括三种模式: 1. 精确模式, 将句子最精确地切开,适合文本分析;2. 全模式,把句子中所有的可以成词的词语都扫描出来,速度快,不能解决歧义;3. 搜索引擎模式,在精确模式的基础上,对长词再词切分,提高召回率,适合用于搜索引擎分词。常用的模式是精确匹配 举个例子:

import jieba

#全模式

seg_list = jieba.cut(“我来到北京工作”, cut_all=True)

print("全模式: " + " ".join(seg_list))

精确模式

seg_list = jieba.cut(“我来到北京工作”, cut_all=False)

print("精确模式(默认模式): " + " ".join(seg_list))

搜索引擎模式

seg_list = jieba.cut_for_search(“小明硕士毕业于保定学院,后在北京深造”)

print("搜索模式: " + " ".join(seg_list))


全模式: 我 来到 北京 工作
精确模式(默认模式): 我 来到 北京 工作
搜索模式: 小明 硕士 毕业 于 保定 学院 , 后 在 北京 深造

第二个工具:nftk分词可以对词语 与子进行分词,简单举个分词的例子:
sent1 = “I love sky, I love sea.”

sent2 = “I like running, I love reading.”

from nltk import word_tokenize

sents = [sent1, sent2]

texts = [[word for word in word_tokenize(sent)] for sent in sents]

print(texts)

[[‘I’, ‘love’, ‘sky’, ‘,’, ‘I’, ‘love’, ‘sea’, ‘.’], [‘I’, ‘like’, ‘running’, ‘,’, ‘I’, ‘love’, ‘reading’, ‘.’]]

第二步:把每个句子转换成向量 方式有:1. If-idf (搜索引擎常用) 2.Word2vec 先算出词向量 然后在拼接成句子 3.深度学习模型lcn 4.charater-based 根据字母转换

第三步:计算相似度矩阵 余弦相似度计算没两个句子之间相似度 需要优化 相似度没有方向,理解成双向的 可以抽取多个临近节点的相似度,存储为稀疏矩阵,不重要的抛弃掉

相似度的计算大致有以下几种计算方式:

第一种欧式距离 它的计算方式是把对比的词的向量相减计算得出的值,值越小表明两个词的相似度越高,值越大两个词相似度越低,具体计算公式为

第二种:余弦相似度,计算方式是内积除以向量长度,计算值余弦相似度大夹角越小 反之,夹角越小说明余弦相似度越大,具体计算公式为

第四步:把矩阵形式转换成图形式(每个节点有关系 按相似度)通过page rank算法得到权重,page rank有很多变种算法 需要优化 排名前三的不一定是最好的,提取具有多样性的句子

Demo:

目录结构:

需要的包:

句子相似度:

创建矩阵

具体流程

具体结果:

基于生成新的摘要方式
先要阅读理解文章,并用自己的话做总结 机器先理解文章(NLU) 根据自己理解生成文章摘要 (NLG)

Seq2seq模型技术流程:

第一阶段主要采用rnn模型:

生成式文本摘要主要依靠深度神经网络结构实现,2014年由GoogleBrain团队提出的Sequence-to-Sequence序列,一个序列到另一个序列并输出序列,Sequence-to-Sequence又称为编、解码器(Encoder、Decoder)架构。编码器简单解释为把人类的语言编码成机器语言矩阵的方式,解码器就是把机器语言矩阵翻译成人类语言;其中Encoder、Decoder均由数层RNN/LSTM构成,Encoder负责把原文编码为一个向量;Decoder负责从这个向量中提取信息,获取语义,生成文本摘要。

用户把原始文档通过rnn模型进行时序的输入实现了NLU过程得到机器可以理解的语言意思,然后继续通过rnn模型把机器理解的意思总结成人类看得懂的摘要返回给用户

Rnn模型:

RNN循环神经网络

简单来讲,x代表每次的输入 A代表运算过程,整体流程就是不同时刻把每一次的运算输出都会被当做下一次的输入进行循环计算 第一次输入基本上是单词加上随机初始化状态信息两部分输出为新的状态包括对前一个单词的记忆和理解,第二次输入就是第一次输出的状态和第二个词,输出为更新上次的状态,记忆了前两个单词的状态,这样单个的输入可以保存了语言的语序性,具体每一步计算公式为:假设h为隐层 词向量为x w1 w2 b为参数 f为线性函数 得到f(w1h+W2h+b)----- 得到新的输入层隐层h

缺点:通过上述得出的最后记忆状态不全面,会丢失一部分状态,导致信息不准确,由于“长距离依赖”问题的存在,RNN到最后一个时间步输入单词的时候,已经丢失了相当一部分的信息。这时候编码生成的语义向量同样也丢失了大量信息,就导致生成的摘要不够准确。rnn流程图:

第二阶段主要增加attention机制+rnn模型(网络资料更新):

Bahdanau等人在14年发表的论文《Neural Machine Translation by JointlyLearning to Align and Translate》中,第一次将Attention机制应用于NLP中。Attention机制是一种注意力(资源)分配机制,在某个特定时刻,总是重点关注跟它相关的内容,其他内容则进行选择性忽视,加入attention机制后流程图:

attention具体详细过程

第一步拿到多个隐藏状态,第二步 对多个隐藏状态进行划重点,并进行打分,第三步 把所得的分数进行softmax 并进行权重生成 ,第四步多个隐藏状态权重相乘得到新的状态 三个矩阵加权求和得到一个新的向量 这个向量包括之前的所有记忆状态和划重点后的权重信息

seq2seq整个过程;Encoder和Encoder都是采用rnn模型,遇到终止符号就终止编码和解码过程

这个权重分布是得到方式:函数F(hj,Hi-1)来获得目标单词yi和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法;传统的统计机器翻译一般在做的过程中会专门有一个短语对齐的步骤,而注意力模型其实起的是相同的作用

RNN/LSTM单元,由于每个词是按顺序输入网络的,所以会记录文章的序列信息。因此,大部分的NLP任务,都是采用的RNN架构。但是这也限制了网络训练及摘要生成的速度,因为RNN必须一个个输入,一个个生成,无法并行计算。2016年Facebook AI Research(FAIR)发表了《A Convolutional Encoder Model forNeural Machine Translation》,对Encoder部分采用似乎不擅长处理序列信息的卷积网络(CNN)来实现,结果在翻译、摘要任务中,也达到了当年的最高水准。

第三阶段改进多跳机制利用cnn和rnn单元结合(来源于网络改进):

2017年5月,还是FAIR,发布了《ConvolutionalSequence to Sequence Learning》,第一次实现了Encoder、Decoder都采用CNN单元,使得网络在训练阶段,可以并行计算,效率进一步提升。同时引入了Multi-step Attention(多跳注意),相比之前只在最后一层生成翻译时往回看,多跳注意使得Decoder阶段生成每一层的语义向量时都往回看,进一步提升了准确度。同时还有一些其他的Trick:引入单词的位置信息,残差网络,计算Attention时候对高层语义信息和低层细节信息,兼收并取等。最后在生成翻译和摘要时,速度相比之前最快的网络,提升了近9倍。

第四阶段更新使用Self-Attention和Encoder-Decoder Attention把rnn和cnn模型全部去掉(来源于网络改进):

2017年6月,Google团队发布了名为《Attention Is All You Need》的文章,即不用CNN和RNN单元,只用Self-Attention和Encoder-Decoder Attention,就完全实现了端到端的翻译任务。因为同样可以并行计算,模型的训练及生成速度也有所提升。Self-Attention相比于之前的模型更加关注句子的内部结构,也就是word-pairs的信息,论文中Attention可视化的结果,可以发现仅在源文端,模型便学习到了“making more difficult”的word-pairs信息。

同理对目标端,模型也会单独学习句子的内部结构信息。之后利用Encoder-Decoder Attention建立源文和目标词组、句子的对应关系。相比于FAIR的卷积模型到很高层才能看到句子的完整信息,Self-Attention在第一层便巧妙地建立了每个词和整个句子的联系,同时位置编码采用三角函数的相对位置法表示,理论上可以泛化到训练中未见过的更长长度句子的翻译中。目前Self-Attention仅用在了翻译任务中,但这样的思想,在文本摘要自动生成的任务中,也是可以参照的。

原文来自本人知乎:https://zhuanlan.zhihu.com/p/53306789

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值