一种针对博文的相似度计算方法
技术领域
本发明属于电子识别技术领域,具体涉及一种针对博文的相似度计算方法。
背景技术
相似博文(微博内容,以下简称博文)在微博中的大量存在,给微博搜索应用带来了多方面的问题,如采集***反复抓取同样内容的博文给索引导致索引的重复与额外存储空间的消耗,并降低了微博搜索应用的性能和用户体验。因此,若有效的相似博文计算算法能够去除大量的相似博文,则可以大大减轻微博搜索应用的负担和提升微博搜索应用的性能与用户体验。
目前国内外还没有什么比较好的针对博文的相似度计算方法,这里介绍几个比较流行的网页相似度计算方法,有基于网页特征码的算法,基于关键词的算法,Charikar的Simhash算法和Broder的Shingle算法等。
基于网页特征码的算法,该算法的关键是对网页特征的提取,以句号为中心,在句号两边各取长度相等的一串字词作为网页的特征码,提取出特征码后可以采用B-Tree来组织这些特征码以便快速的查找是否出现了相同网页,然后计算两个网页的特征码集的重叠率作为网页的相似度。若相似度超过某个设定的临界值,则判定两个网页相似。
基于网页关键词的算法,该算法是首先通过对网页的解析,提取出网页标题的关键词,然后在网页正文中获取和标题关键词相关度高的其他关键词形成该网页的关键词集。当需要对一个网页判定是否存在重复网页的时候,可以在倒排表中查询包含该网页关键词集中的全部或部分关键词的网页,然后计算两个网页的关键词集的重叠率作为网页的相似度。若相似度超过某个设定的临界值,则判定两个网页相似。
Simhash该算法可以将一个多维向量映射成一个只需较小存储空间的指纹(Fingerprint),它是一种指纹识别技术,该技术拥有两个看似冲突的重要性质:首先,一个文档的指纹是这个文档的特征集的“哈希”;其次,相似文档有着相似的哈希,即相似文档的指纹只有少数bit不相同。当要计算两个网页的相似度的时候,可以计算两个指纹(二进制向量)之间的Hamming距离,即两个二进制向量中不相同位的个数。如果该值足够小,即Hamming距离小于某个设定的临界值时,则可以判定两个网页相似。
Shingle算法的设计思想则是通过对网页文本信息的处理,得到k个连续单词序列,这个连续单词序列构成一个Shingle,网页最后就由一个shingle的集合来表示。所有网页的shingle集合最后采用一种类似于倒排索引方式的倒排表来存储,如(Shingle,文档ID)以标示某个shingle出现在某个网页文档中。如果两个网页非常相似,则网页中很可能会有公共shingle,公共的shingle越多,网页越相似,从而判定两个网页的相似度。
Simhash和Shingle都需要对文本提取出多个hash数值才可以继续,所以它比较耗费CPU和内存资源,针对即时性要求高的微博搜索应用来说不太适用。
基于特征值的算法需要以句号为中心择取多个特征值来做相似判断,而微博这种短文本存在句号的可能性和数量都不高,所以该算法不太适合微博搜索应用。
基于关键词的算法需要网页标题,博文不存在网页标题,所以不完全适用于微博搜索引擎的应用。
发明内容
为了克服上述现有技术的不足,本发明提供一种简单高效的博文相似度计算方法,实现微博搜索引擎对及时性和高效性的要求。
为了实现上述发明目的,本发明采取如下技术方案:
一种针对博文的相似度计算方法,其特征在于,所述方法包括以下步骤:
A.预处理博文;
B.分别计算处理后的原文和转发文中所有词语的权重;
C.合并原文和转发文的权重,并将所得结果按降序排列;
D.生成指纹。
优选地,所述步骤A包括:去除博文中的无用信息,将大写字母转为小写,并对提取后的文本分词,统计各个切分词语的词频。
优选地,所述步骤B中计算原文词语的权重如下式表达:
计算转发文词语的权重如下式表达:
式中,C原为原文中切分词语的总数,C转为转发文中切分词语的总数,TF为切分词语在文中的词频,IDF为逆向文件频率,代表着该词的区分度,从已有词典中直接取得。
优选地,步骤C中,所述合并为:将原文和转发文中相同切分词语的权重相加,作为该词语在整篇博文中的权重。
优选地,所述步骤D包括以下步骤:
D-1.取出权重高的前n个词作为该微博的核心词,计算核心词的哈希值,并查找哈希表是否存在该核心词,如没有,执行步骤D-3;否则,执行步骤D-2;
D-2.遍历该核心词哈希项所有的指纹结点是否存在与当前m个二级匹配词重叠率满足阈值的,如存在,执行步骤D-4,否则,执行步骤D-3;
D-3.即之前没有过相似的博文,需生成新指纹,把该指纹、核心词语和m个二级匹配词语存储在哈希表内对应的位置上;
D-4.有相似的博文,返回重叠率符合阈值的二级匹配词所属的指纹;同时查看重叠率是否为1,如不是,则把当前的二级匹配词挂在当前指纹结点下。
优选地,所述无用信息包括:超链接、标签、表情符号。
优选地,所述二级匹配词为所有切分词语中除去核心词之后剩下的词;所述阈值为针对重叠率设定的临界值。
与现有技术相比,本发明的有益效果在于:
本发明的微博内容相似度计算方法,算法简明,效果显著;生成指纹阶段按博文的长度(词语个数)直接去对应的指纹集去查找指纹,减少了匹配次数,节省了计算时间,提升了计算相似度的效率和准确率,实现了微博搜索引擎对及时性和高效性的要求。
附图说明
图1是本发明计算方法的流程图;
图2是本发明实施例中生成指纹的具体流程图;
图3是本发明实施例中指纹集的内存结构图。
具体实施方式
下面结合附图对本发明作进一步详细说明。
博文包含原文和转发文,所以博文的相似度应该有原文和转发文共同决定,但他们又都存在一些链接、表情和@人名等与博文关系弱的垃圾信息。因此,先对原文和转发文进行预处理,去除链接、表情和@人名等垃圾信息,然后分词计算每个词的权重之后提取权重比较高的(n+m)个词来作为这篇微博的关键词。
关键词又分为两部分,权重最高前n个词作为该博文的核心词,关键词剩下的m个词作为该博文的二级匹配词。判断依据是如果两篇博文的核心词相同,且二级匹配词重叠率达到一定的阈值,我们就认为两篇博文相似,给相同指纹。反之,则不相似,给不同的指纹。
这里根据博文的切分词后词语个数C(原文和转发文的词语总数),按下表所示的规则分为三个集合,分别计算对应的指纹,这样减少了计算相似度过程中的匹配次数,提升了计算效率。
满足条件 |
核心词语数n |
二级匹配词语数m |
指纹集名称 |
C>10 |
3 |
5 |
大文本指纹集 |
5<C<=10 |
2 |
3 |
中文本指纹集 |
C<=5 |
C |
0 |
小文本指纹集 |
计算相似度的具体流程如图1所示。
具体步骤如下:
1.微博预处理,去除原文和转发文中存在的链接、标签和@人名等垃圾信息,并把拼音统一转换成小写。
2.根据TF和IDF还有其他的附属信息分别计算原文和转发文所有词语的权重。分别生成了词语对权重的一维向量。下面是计算原文词语权值的公式2-1,和计算转发文词语权重的公式2-2。
…………………………………(式2-1)
…………………………………(式2-2)
其中,TF(Term Frequency)为切分词语在文中出现的次数(词频),是在预处理阶段统计出来的。IDF(Inverse Document Frequency)为逆向文件频率,代表着该词的区分度,既该词的价值,为小数,是从已有词典中直接取得。C原为原文中的有效词语总数,既预处理之后的词语总数。同理,C转为转发文经过预处理后的词语总数。
3.把原文词语权重向量和转发文的词语权重向量合并(相同词语权重相加),以此作为整篇博文的词语权重向量。并按权重降序排序。
4.指纹集内生成指纹的过程如图2所示(图3为指纹集的内存结构图),具体如下:4.1取出权重最高的前n个词作为该微博的核心词,计算核心词语的哈希值,查找哈希表是否存在该核心词语,如没有,goto4.3。否则,goto4.2。
4.2遍历该哈希项所有的指纹结点是否存在与当前m个二级匹配词重叠率满足某个设定的临界值的,如存在,goto4.4,否则goto4.3。
4.3即之前没有过相似的博文,需生成新指纹,把该指纹、核心词语和m个二级匹配词语存储在哈希表内对应的位置上。
找到了相似的博文,返回重叠率符合阈值的二级匹配词所属的指纹。同时查看重叠率是否为1,如不是,需要把当前的二级匹配词挂在当前指纹结点下。
最后应当说明的是:以上实施例仅用以说明本发明的技术方案而非对其限制,尽管参照上述实施例对本发明进行了详细的说明,所属领域的普通技术人员应当理解:依然可以对本发明的具体实施方式进行修改或者等同替换,而未脱离本发明精神和范围的任何修改或者等同替换,其均应涵盖在本发明的权利要求范围当中。