当前位置: 首页 > 科技观察

TextRank算法自动文本摘要_1

时间:2023-03-15 09:54:32 科技观察

【.com快译】1.引言文本摘要是自然语言处理(NLP)领域的应用之一,它必将对我们的生活产生巨大的影响。随着数字媒体和出版业的不断发展,谁有时间查看整篇文章/文档/书籍来决定它们是否有用?谢天谢地——我们已经有了文本摘要技术。你有没有用过一个叫inshorts的移动应用程序?这是一个非常有创意的新闻应用程序,可以将新闻文章转换为60字的摘要。这正是我们将在本文中学习的内容——自动文本摘要。自动文本摘要是自然语言处理(NLP)领域中最具挑战性和最有趣的问题之一。它是从各种文本源(如书籍、新闻文章、博客文章、研究论文、电子邮件和推文)生成简洁而有意义的文本摘要的过程。由于我们面临着大量的文本数据,最近对自动文本摘要系统的需求是惊人的。在本文中,我们将探索文本摘要领域,了解TextRank算法的工作原理,并在Python中实现它。2.文本摘要方法自动文本摘要早在20世纪50年代就引起了人们的关注。汉斯·彼得·卢恩(HansPeterLuhn)在1950年代后期发表的一篇题??为“自动创建文学摘要”的研究论文,利用词频和词频等特征从文本中提取重要句子来总结文章。HaroldPEdmundson在1960年代后期进行的另一项重要研究,利用句子是否包含关键词、标题中包含的词是否出现在文本中、句子在文本中的位置等方法提取重要句子生成文本总结。从那时起,许多重要且令人兴奋的研究已经发表,以解决自动文本摘要领域的挑战。文本摘要大致可以分为两类——提取摘要和抽象摘要。提取摘要:这些方法依赖于从一段文本中提取多个部分,例如短语和句子,并将它们堆叠在一起以创建摘要。因此,识别正确的摘要句子在提取方法中至关重要。摘要摘要:这些方法使用先进的NLP技术来生成全新的摘要。这些摘要的某些部分甚至可能不会出现在原文中。在本文中,我们将重点关注提取式摘要技术。3、了解TextRank算法在开始使用TextRank算法之前,我们应该了解另一种算法——PageRank算法。事实上,TextRank算法就是在它之上开发的!PageRank主要用于在网络搜索结果中对网页进行排名。让我们借助示例快速了解该算法的基础知识。3.1.PageRank算法假设我们有4个网页-w1、w2、w3和w4。这些网页包含指向其他网页的链接。但是其中一些页面可能没有指向其他页面的链接——这些页面称为悬挂页面。页面w1有指向页面w2和w4的链接页面w2有指向页面w3和w1的链接页面w4有指向页面w1的链接页面w3没有指向其他页面的链接,因此它是一个悬挂页面要对页面进行排名,我们必须计算一个分数,称为PageRank分数。这个分数是用户访问该页面的概率。为了获得用户从一个页面跳转到另一个页面的概率,我们创建了一个n行n列的方阵M,其中n是网页的数量。该矩阵的每个元素代表用户从一个网页跳转到另一个网页的概率。比如下图中高亮的单元格代表从网页w1跳转到网页w2的概率。网页跳转概率的初始化方法如下:从第i页跳转到第j页的概率,即M[i][j],初始化为1/(网页唯一链接总数wi)如果页面i和j之间没有链接,则概率会被初始化为0。如果用户访问一个悬空页面,则假设他跳转到任何其他页面的概率是相等的。因此,M[i][j]将被初始化为1/(网页总数)因此,在我们的例子中,矩阵M将被初始化如下:该矩阵中的值将迭代更新以获得最佳页面排名。4、TextRank算法掌握了PageRank算法的基本思想之后,现在让我们来了解一下TextRank算法。我把这两种算法的关系罗列如下:我们要研究的是句子,不是网页。两个句子之间的相似度可以理解为网页之间的跳转概率。存储句子之间的相似度得分。在方阵中,类似于PageRank算法中的方阵,MTextRank算法是一种基于抽取的、无监督的文本摘要技术。我们来看看TextRank算法的流程:第一步,获取文章中包含的所有文本。然后将文本拆分成单独的句子。下一步是找到每个句子的向量表示。然后计算句子向量之间的相似度并将其存储在矩阵中。5.然后将相似度矩阵转化为图,图中的顶点代表句子,图中的边代表句子之间的相似度,用于后续句子排序的计算。***,最终摘要包含排名最好的句子。因此,事不宜迟,让我们启动JupyterNotebook并开始编码吧!注意:如果您想了解有关图论的更多信息,那么我建议您查看这篇文章。5.问题描述作为一名网球迷,我总是通过阅读尽可能多的关于网球的在线文章来了解网球的最新动态。然而,事实证明这是一项非常困难的工作!因为网上资源太多,而我的时间又很有限。所以我决定设计一个可以扫描多篇文章并为我提供文章摘要的系统。怎么做?这就是我将在本教程中向您展示的内容。我们将在网球文本数据集上应用TextRank算法,目的是创建这些文本的简明摘要。请注意,这实际上是一个单域、多文档摘要任务,即我们将多篇文章作为输入并为单个目标主题生成摘要。本文不涉及多领域文本摘要,大家可以自行了解。您可以从此处下载我们将使用的数据集。6.TextRank算法的实现让我们打开JupyterNotebooks并实现我们刚刚学到的东西。6.1.导入必要的库首先我们需要导入一些将要使用的库:importnumpyasnpimportpandasasspdimportnltknltk.download('punkt')#onetimeexecutionimportre6.2。读入数据现在我们需要读入数据集,我在上一节中提供了下载链接(如果您没有看到)df=pd.read_csv("tennis_articles_v4.csv")6.3。查看数据让我们快速看一下数据的样子。df.head()数据集包含3列:“article_id”、“article_text”和“source”。Wearemostinterestedinthe'article_text'columnasitcontainsthetextofthearticle.Wecanprintoutsomevalues??ofvariablestoseewhattheylooklike.df['article_text'][0]输出:"MariaSharapovahasbasicallynofriendsastennisplayersontheWTATour.TheRussianplayerhasnoproblemsinopenlyspeakingaboutitandinarecentinterviewshesaid:'Idon'treallyhideanyfeelingstoomuch.Ithinkeveryoneknowsthisismyjobhere.WhenI'monthecourtsorwhenI'monthecourtplaying,I'macompetitorandIwanttobeateverysinglepersonwhetherthey'reinthelockerroomoracrossthenet...df['article_text'][1]输出:BASEL,Switzerland(AP),RogerFedereradvancedtothe14thSwissIndoorsfinalofhiscareerbybeatingseventh-seededDaniilMedvedev6-1,6-4onSaturday.Seekinganinthtitleathishometownevent,anda99thoverall,Federerwillplay93th-rankedMariusCopilonSunday.Federerdominatedthe20th-rankedMedvedevandhadhisfirstmatch-pointchancetobreakserveagainat5-1...现在我们有两个选择:我们可以单独为每篇文章生成一个摘要,itisalsopossibletogenerateasummaryforallarticles.Consideringourproblemrequirements,wewilldothelatter.6.4.SplitthetextintosentencesThenextstepistosplitthetextintoindividualsentences,wecanusesent_tokenize()fromthenltklibraryfunction.fromnltk.tokenizeimportsent_tokenizesentences=[]forsindf['article_text']:sentences.append(sent_tokenize(s))sentences=[yforxinsentencesforyinx]#flattenlist我们打印出句子列表的一些元素:sentences[:5]output:['MariaSharapovahasbasicallynofriendsstennisplay,"TheRussianplayerhasnoproblemsinopenlyspeakingaboutitandinarecentinterviewshesaid:'Idon'treallyhideanyfeelingstoomuch.",'Ithinkeveryoneknowsthisismyjobhere.',"WhenI'monthecourtsorwhenI'monthecourtplaying,I'macompetitorandIwanttobeateverysinglepersonwhetherthey'reinthelockerroomoracrossthenet.SoI'mnottheonetostrikeupaconversationabouttheweatherandknowthatinthenextfewminutesIhavetogoandtrytowinatennismatch.","I'maprettycompetitivegirl."]6.5.下载GloVe词向量GloVe词一个向量是一个词的向量表示。稍后将使用这些词向量来创建句子向量。我们也可以使用Bag-of-Words或TF-IDF方法为我们的句子创建特征,但这些方法忽略了单词的顺序(并且特征的数量通常非常多)。我们将使用此处提供的预训练Wikipedia2014+Gigaword5GloVe向量。请注意,这些词向量的大小为822MB。!wgethttp://nlp.stanford.edu/data/glove.6B.zip!unzipglove*.zip我们需要提取词向量:#Extractwordvectorsword_embeddings={}f=open('glove.6B.100d.txt',encoding='utf-8')forlineinf:values=line.split()word=values[0]coefs=np.asarray(values[1:],dtype='float32')word_embeddings[word]=coefsf.close()len(word_embeddings)output:400000我们现在有了字典中包含的400000个词的词向量。6.6.文本预处理使文本数据尽可能无噪声始终是一种很好的做法。所以,让我们做一些基本的文本清理。#removepunctuations,numbersandspecialcharactersclean_sentences=pd.Series(sentences).str.replace("[^a-zA-Z]","")#makealphabetslowercaseclean_sentences=[s.lower()forsinclean_sentences]去除停用词(停用词是一些一种语言中最常用的词,如英语中的am、the、of、in等)。如果您还没有下载nltkstopwords,请执行以下代码:nltk.download('stopwords')现在导入停用词列表:fromnltk.corpusimportstopwordsstop_words=stopwords.words('english')定义一个函数以从我们的数据集中删除停止字。#functiontoremovestopwordsdefremove_stopwords(sen):sen_new="".join([iforiinsenifinotinstop_words])returnsen_new#removestopwordsfromthesentencesclean_sentences=[remove_stopwords(r.split())forrinclean_sentences]借助rinclean_sentences的GloVe词向量中的句子,我们将使用clean_创建向量。6.7.句向量表示#Extractwordvectorsword_embeddings={}f=open('glove.6B.100d.txt',encoding='utf-8')forlineinf:values=line.split()word=values[0]coefs=np.asarray(values[1:],dtype='float32')word_embeddings[word]=coefsf.close()现在,让我们为句子创建一个向量表示。我们会先得到构成句子的所有单词的向量(每个向量都是100维),然后对这些向量取平均值得到句子向量。sentence_vectors=[]foriinclean_sentences:iflen(i)!=0:v=sum([word_embeddings.get(w,np.zeros((100,)))forwini.split()])/(len(i.split())+0.001)else:v=np.zeros((100,))sentence_vectors.append(v)6.8。准备相似度矩阵下一步是计算句子之间的相似度,我们将使用余弦相似度(cosinesimilarity)方法来计算句子向量之间的相似度。让我们首先定义一个维度为(n*n)的零矩阵。然后用句子的余弦相似度分数初始化这个矩阵。这里,n是句子的数量。#similaritymatrixsim_mat=np.zeros([len(句子),len(句子)])fromsklearn.metrics.pairwiseimportcosine_similarityforiinrange(len(句子)):forjinrange(len(句子)):ifi!=j:sim_mat[i][j]=cosine_similarity(sentence_vectors[i].reshape(1,100),sentence_vectors[j].reshape(1,100))[0,0]6.9.应用PageRank算法在继续下一步之前,需要将相似度矩阵转化为图,图中的顶点代表句子,边代表句子之间的相似度分数。我们将在此图上应用PageRank算法对句子进行排名。importnetworkxasnxnx_graph=nx.from_numpy_array(sim_mat)scores=nx.pagerank(nx_graph)6.10。Summaryextraction***,从生成的summary中提取前N个句子。ranked_sentences=sorted(((scores[i],s)fori,sinenumerate(sentences)),reverse=True)#Extracttop10sentencesasthesummaryforiinrange(10):print(ranked_sentences[i][1])输出:WhenI'monthecourtsorwhenI'monthecourtplaying,I'macompetitorandIwanttobeateverysinglepersonwhetherthey'reinthelockerroomoracrossthenet.SoI'mnottheonetostrikeupaconversationabouttheweatherandknowthatinthenextfewminutesIhavetogoandtrytowinatennismatch.MajorplayersfeelthatabigeventinlateNovembercombinedwithoneinJanuarybeforetheAustralianOpenwillmeantoomuchtennisandtoolittlerest.SpeakingattheSwissIndoorstournamentwherehewillplayinSundaysfinalagainstRomanianqualifierMariusCopil,theworldnumberthreesaidthatgiventheimpossiblyshorttimeframetomakeadecision,heoptedoutofanycommitment."IfeltlikethebestweeksthatIhadtogettoknowplayerswhenIwasplayingweretheFedCupweeksortheOlympicweeks,notnecessarilyduringthetournaments.Currentlyinninthplace,Nishikoriwithawincouldmovetowithin125pointsofthecutfortheeight-maneventinLondonnextmonth.Heusedhisfirstbreakpointtocloseoutthefirstsetbeforegoingup3-0inthesecondandwrappingupthewinonhisfirstmatchpoint.TheSpaniardbrokeAndersontwiceinthesecondbutdidn'tgetanotherchanceontheSouthAfrican'sserveinthefinalset."Wealsohadtheimpressionthatatthisstageitmightbebettertoplaymatchesthantotrain.Thecompetitionissettofeature18countriesintheNovember18-24finalsinMadridnextyear,andwillreplacetheclassichome-and-awaytiesplayedfourtimesperyearfordecades.FederersaidearlierthismonthinShanghaiinthathischancesofplayingtheDavisCupwereallbutnon-existent.这样,我们就得到了想要的文本摘要的结果7.What'sNext?自动文本摘要是研究的热点,本文只讨论了冰山一角,接下来我们将探索深度学习发挥重要作用的抽象文本摘要技术。此外,我们还可以研究以下摘要任务:1.SpecificProblem-basedsummarizationtasksMulti-domaintextsummarizationSingle-documentsummarizationCross-languagetextsummarization(输入是一种语言,生成另一种语言的摘要)2.Algorithm-specificsummarizationtasks:TextsummarizationusingRNNandLSTMnetworksUsingreinforcementlearningTextSummarizationTextSummarizationUsingGenerativeAdversarialNetworks(GAN)8.结论我希望这篇文章能帮助您理解自动文本摘要的概念。它有各种用例,并已被人们非常成功地使用程序。NLP爱好者应该熟悉文本摘要技术,无论是出于商业原因还是仅仅是为了学习。我将在以后的文章中尝试介绍使用高级技术的抽象文本摘要技术。上面的代码可以在这个Github中找到。【翻译稿件,合作网站转载请注明原译者和出处.com】