A. 如何用python玩转TF-IDF之寻找相似文章并生成摘要
应用1:关键词自动生成
核心思想是对于某个文档中的某个词,计算其在这个文档中的标准化TF值,然后计算这个词在整个语料库中的标准化IDF值。在这里,标准化是说对原始的计算公式进行了一些变换以取得更好的衡量效果,并避免某些极端情况的出现。这个词的TF-IDF值便等于TF*IDF。对于这个文档中的所有词计算它们的TF-IDF值,并按照由高到低的顺序进行排序,由此我们便可以提取我们想要的数量的关键词。
TF-IDF的优点是快捷迅速,结果相对来说比较符合实际情况。缺点是当一篇文档中的两个词的IDF值相同的时候,出现次数少的那个词有可能更为重要。再者,TF-IDF算法无法体现我词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。存在的解决办法是对文章的第一段和每段的第一句话给予比较大的权重。
应用2:计算文本相似度
明白了对于每个词,如何计算它的TF-IDF值。那么计算文本相似度也轻而易举。我们已经计算了文章中每个词的TF-IDF值,那么我们便可以将文章表征为词的TF-IDF数值向量。要计算两个文本的相似度,只需要计算余弦即可,余弦值越大,两个文本便越相似。
应用3:自动摘要
2007年,美国学者的论文<A Survey on Automatic Text Summarization>总结了目前的自动摘要算法,其中很重要的一种就是词频统计。这种方法最早出自1958年IBM公司一位科学家的论文<The Automatic Creation of Literature Abstracts>。这位科学家认为,文章的信息都包含在句子中,有的句子包含的信息多,有的句子包含的信息少。自动摘要就是找出那些包含信息最多的句子。那么句子的信息量怎么衡量呢?论文中采用了关键词来衡量。如果包含的关键词越多,就说明这个句子越重要,这位科学家提出用Cluster的来表示关键词的聚集。所谓簇,就是包含多个关键词的句子片段。
以第一个图为例,其中的cluster一共有7个词,其中4个是关键词。因此它的重要性分值就等于(4*4)/7=2.3。然后,找出包含cluster重要性分值最高的句子(比如5句),把它们合在一起,就构成了这篇文章的自动摘要。具体实现可以参见<Mining the Social Web: Analyzing Data from Facebook, Twitter, LinkedIn, and Other Social Media Sites>(O'Reilly, 2011)一书的第8章,Python代码见github。这种算法后来被简化,不再区分cluster,只考虑句子包含的关键词。伪代码如下。
Summarizer(originalText,maxSummarySize):
//计算文本的词频,生成一个列表,比如[(10,'the'),(3,'language'),(8,'code')...]
wordFrequences=getWordCounts(originalText)
//过滤掉停用词,列表变成[(3,'language'),(8,'code')...]
contentWordFrequences=filtStopWords(wordFrequences)
//按照词频的大小进行排序,形成的列表为['code','language'...]
contentWordsSortbyFreq=sortByFreqThenDropFreq(contentWordFrequences)
//将文章分成句子
sentences=getSentences(originalText)
//选择关键词首先出现的句子
setSummarySentences={}
:
firstMatchingSentence=search(sentences,word)
setSummarySentences.add(firstMatchingSentence)
ifsetSummarySentences.size()=maxSummarySize:
break
//将选中的句子按照出现顺序,组成摘要
summary=""
foreachsentenceinsentences:
:
summary=summary+""+sentence
returnsummary
类似的算法已经被写成了工具,比如基于Java的Classifier4J库的SimpleSummariser模块、基于C语言的OTS库、以及基于classifier4J的C#实现和python实现。
B. 文本相似度算法-Jaro distance
给定两个灶指衡文本串 , ,他们的Joro距离定义为:
求 match 的字符数:
分别来自 , 的字符,当他们相同或者距离小于 ,则被认为是 match 的。
比如: =“DIXON”, =“DICKSONX”
中的逗滑每一个字符都会与 中距离 内的字符进行比较。将所有 match 的字符隐做串,需要替调换顺序才能匹配的总数除以二就是transpositions的大小 。这里两个字符串中匹配的分别是:"DION",“DION",所以 。
另外 =4, =8,
则:
参考:
https://rosettacode.org/wiki/Jaro_distance#Java
C. JAVA实现如何比较两个文档之间的异同点
楼上回答驴唇不对马嘴。
这个文件比较功能,我做过比较txt简单文本文件的。office文件没比过,说下想法,希望能对你有帮助
打开要读取的两份文件,依次读取A所有行数,将每一行的数据以字符串的形式存储在一个字符串数组里,假如是 StringA[] ,同时也一样处理 B文件
分别从开始遍历两个 字符串数组,比较 相似(相同) 字符百分比。当然有时候可能A文件第10行是一个空行,但是其下面的所有数据都和B文件一样,所以这个遍历对比不是门当户对的 行行相比,而是 一次遍历多对多的比较(但是仍要考虑顺序,比如A第10行和B第15行相同,但是A第12行又和B第10行相同,那么这一个范围段都是不匹配片断),找出相似度最高的。
希望能对你有帮助吧