【资源聚合平台进度总结】Word2Vec+TextRank实现摘要生成技术

前言

在本系统中,由于自动获取的网络上的资源参差不齐,即使通过了机器的审核,仍然可能会给用户的检索带来很大困难。另一方面,现在大多主流的博客所谓自动生成摘要,其实都是自动截取前100个字符,这实在是辜负了现在人工智能和NLP技术的发展。
因此在我们的项目中,我们计划引入摘要生成技术,一是方便用户的检索查看,二是想看看能否利用其作为质量控制系统的一部分。

1958年,Luhn便提出了“词频”的方法,通过计算文章中“keywords”的出现频率找到文章的中心句子以此来生成文章摘要,这被当做文章摘要的鼻祖。在此基础上,Edmundson通过选取标题词、句子位置、线索词和关键词四种特征表示句子计算句子权重,通过句子的分数(权重)排序比较句子的重要性来生成摘要。后来,Mihalcea在google的算法pagerank的基础上提出了计算文章内在结构,主观上评价句子重要性的textrank算法,该算法意义重大极大的推动了自动文摘的发展。后来,更大的方法被发表出来包括比较著名的tf*idf算法。

以上的生成方式被称为“抽取式”,因为他们的主要工作都是找到可以最大限度概括全文的原文中的句子。他们大多采用的是统计的方式,并没有真正地去“理解”文章的内容。于是便出现了另一种文本摘要的方法,被称之为“生成式”方法,机器通过阅读文章然后来概括文章的大意。无疑这种方法难度较大,与传统的人工摘要一样,机器必须自己读懂文章才能生成摘要。

搜索网上的资料,有关生成式摘要的尝试,最具代表性的就是google在2016年发布的开源项目“TextSum”。在google的textsum项目中,用到了seq2seq+attention的深度学习模型,它是google翻译模型。简单的说这种模型是文章的content生成title的模型,RNN神经网络(循环神经网络)将content即文章的内容通过encoder(编码)生成一种sequence,然后另外一个RNN神经网络用来decoder(解码)生成文章的title。这个模型对训练数据的要求极为苛刻,如果不是专门清洗过的数据集,生成的句子语义都不通顺更别说组合成为摘要了,在stackoverflow论坛上,很多跑过这个程序都说其效果不佳。google自己也承认该项目有待优化。

后来终于发现了一个目前来说比较成熟的抽取式文本摘要方法,通word2vec生成词向量,再利用textrank的方法寻找文本的中心句形成摘要。这种方法被多个学术研究所发表,很多人都提出了各种改进的算法,例如

顾益军, 夏天. 融合 LDA 与 TextRank 的关键词抽取研究[J]. 现代图书情报技术, 2014(7-8): 41-47.
(Gu Yijun, XiaTian. Study on Keyword Extraction with LDA and
TextRankCombination [J]. New Technology of Library and
InformationService, 2014(7-8): 41-47.)

融合 Word2vec 与 TextRank 的关键词抽取研究宁建飞 刘降珍(罗定职业技术学院电子信息系 罗定 527200)


Word2Vec

word2vec也叫word embeddings,中文名“词向量”,作用就是将自然语言中的字词转为计算机可以理解的稠密向量(Dense Vector)。在word2vec出现之前,自然语言处理经常把字词转为离散的单独的符号,也就是One-Hot Encoder。

杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]
上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]
宁波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0]
北京 [0,0,0,0,0,0,0,0,0,……,1,0,0,0,0,0,0]

比如上面的这个例子,在语料库中,杭州、上海、宁波、北京各对应一个向量,向量中只有一个值为1,其余都为0。但是使用One-Hot Encoder有以下问题。一方面,城市编码是随机的,向量之间相互独立,看不出城市之间可能存在的关联关系。其次,向量维度的大小取决于语料库中字词的多少。如果将世界所有城市名称对应的向量合为一个矩阵的话,那这个矩阵过于稀疏,并且会造成维度灾难,即词的数量达到了一定程度,以亿计的单词用这种表示方法那肯定是极大的臃肿与恐怖。 word2vec在此基础上用低维的向量来表示单词,一般为50维或100维,这种向量被表示成这个样子:

[0.11212,0.116545,0.878789,0.5644659,……]

而Word2Vec实际上就是对上面的词向量做降维操作,将“每个词一个维度”这种尴尬的情况转换为在有限的维度中表示更多的单词。

word2vec模型其实就是简单化的神经网络。
这里写图片描述
输入是One-Hot Vector,也就是刚才提到的最基础的词向量形式,Hidden Layer没有激活函数,也就是线性的单元。输出层神经元的个数可以自己设定,也就是最终得到的词向量的维度。
这里写图片描述
可以看出,word2vec实际做的工作实际上就是通过矩阵操作进行降维处理。更好的一个特性是,经过训练之后,我们可以得到,含义相近的单词,他们的词向量也是比较临近的,这就给我们进行自然语言处理提供了很好的基础。

word2vec的训练和使用现在已经有比较完善的python库:gensim

from gensim.models import word2vec
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.LineSentence(u'./cut_std.txt')
model = word2vec.Word2Vec(sentences,size=
  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值