相关度计算和信吵比、【最短路径】【SN搜索算法】【SN索引】【SN关系的更新】

你知道google和百度两个关键词的相关度是多少么?
--最后我将来回答这个问题

通常我们对于文本信息之间得相关性得计算都是采用向量的办法,我在以前的PPT里曾经提到过。然而对于文本信息更深层次的分析不能单纯从字面上分析一篇文章的关键词,更重要的是它隐含的扩展的意义。

传统的关于计算文本相关度和【网页和查询的相关性】的计算都是采用匹配的方式进行的,然而这只能是基于字面意义上的统计计算。这里介绍的做法是采用关键词相关性扩展的做法从而得到更加精确的相关度计算。

例子:
文章 A: 谈论的是大学教育,最高频的关键词是:学生[3],学习[2],大学[2]
文章 B: 谈论的是普通教育,最高频的关键词是:教育[5],教师[1],进修[1]
[]里是相对的权重,可以理解成 TF*IDF

根据传统的相关性计算,我们会得到如下的结果:

1. 文章A 与 文章B 不相关
2. 查询 学生,学习,大学只能返回文章A,不能返回文章B
3. 查询 教育,教师,进修只能返回文章B,不能返回文章A

分析:
这个显然是有一定的问题的,问题的出现在于我们通常将“字面”的意思做为分析的来源而且依靠和仅仅依靠这些“字面”的关键词做为文章相关性和查询相关性判断的唯一要素。

如何避免?
我在以前的文章中提到过【关键词相关度】的概念,举例说明:
当出现:{学习}这个词汇的时候,真实的表达的意义往往是这样的:
{W1*学习,W2*教育,W3*教师,W4*大学。。。。。。}
其中W1,W2...是学习和相关词汇的相关权重。

基于这样一个矩阵,我们就能够将一个词扩展成为一组词汇,因而也同时可以将文章所对应的向量扩展成一个更多词汇的集合。

这里的计算需要一个完整的相关度矩阵:M

M(i,j) = {关键词i,j的相关度}
而两篇文章的相关度的计算,也由简单的
R= Sigma Vi*Vi
变为
R= Sigma Vi*M(i,j)*Vj

查询关键词和文章的相关度也由简单的
R(i)=TF(i)*IDF(i)
变为
R(i)=Sigma TF(j)*IDF(j)*M(i,j)


下面碰到一个核心问题就是:关键词之间的相关度如何计算?
例如:学校和学生的相关度是多少?
计算方法:
假设一个文章集合 {C},总文章数目为N,其中含有单词A的文章总数为Na,含有单词B的文章总数是Nb,含有{A+B}的文章总数是 Nab,那么相关性这么计算

CorrAB= Nab/(Na+Nb-Nab)-(Na*Nb)/(N*N)

本计算中可能会得到负相关,如果考虑到Na,Nb都是小量,可以忽略,那么

CorrAB= Nab/(Na+Nb-Nab)

至此,要计算相关度之间的全部要素都获得了。

思考,那么到底 学校 和学生 之间的相关度是多少呢?
我们利用google来回答这个问题吧:

约有91,700,000项符合学校的查询结果
约有88,200,000项符合学生的查询结果
约有48,900,000项符合学生 学校的查询结果

Corr{学校,学生}=48,900,000/(91,700,000+88,200,000-48,900,000)=0.37

这个原理我以前应用在了计算【网页信噪比】上,和网页信噪比一起成为衡量一个网页的关键词的核心算法。
这也就是为什么6e的网页信噪比能够不依靠网页上现有的关键词而准确的判断网页的分类和相关度,是因为除了TF和IDF之外,我们能够从已有的文本集合里学到更多的“知识”。

那么百度和google的相关度应该不难计算了:

利用 google计算得到:2,950,000/(61,800,000+6,370,000-2,950,000)=0.03

利用 baidu计算得到:2,760,000/(21,700,000+12,200,000-2,760,000)=0.08

看来基本上相关度小于10%。

 

 

【最短路径】

圆明园的北部有一个迷宫,据说古时候每次有庆典在圆明园的时候,皇帝会派一些宫女走迷宫,看谁最先走到迷宫内的亭子,会有不错的奖赏。

迷宫问题对数学家们来讲虽然是小儿科但在计算机课程上却非常重要,因为不同的求解会涉及到递归,广度优先和深度优先等算法。

迷宫毕竟是一个放置在2维空间的有限联系的网络,也就是说,迷宫里的每一个点,最多只和周围的4个点(上下左右)发生关系,而且这些点的位置是固定的。

六度分割通常用来描述一个广阔的社会网路(SN),现在大部分的社会网路服务都提供了搜索功能,即搜索出一个用户到达另外一个用户的最短路径,也就是找出这两个用户之间通过最少的用户的链接。

一般的SN提供的搜索都是4度的,也就是例如A-B-C-D-E 称为4度的分隔。提供5度搜索和6度搜索的几乎寥寥无几,当然一方面是5,6度分隔的用户很少,大部分的用户都应该在4度内,另外一个方面是5,6度分隔的搜索在实际计算上也涉及非常大的运算量。

 

 

 

 

【SN搜索算法】

如果说寻找两个人之间的最小分隔的路径和寻找最短路径可以类比,那么唯一不同的是SN上每个节点的联系可以非常的广阔,不只是上下左右,而是十个甚至上百个联系。这是是一个多维空间内的最短路径的寻找。假设一个用户平均有n个好友,那么粗略估计一个用户的4度好友大约有n×n×n×n+n×n×n+n×n+n ~ n^4,无疑是一个非常恐怖的数目。因此采用传统的递归的方法显然是不大现实的。

当然,事情并非这么麻烦,有简洁的方法可以加快找到用户之间的最小分隔:不单是从一个用户搜索,而是从两个用户同时搜索,而看两个用户的2度之内的用户是否有相同:
A-B-C
E-D-C
A和E的处在在两度分隔的用户基本上数目估计都在n的平方。问题变成了比较n^2和n^2之间有没有相同,这个计算的时间等同于2×n^2的排序所需要的时间。

【SN索引】

那么能否继续加快速度?
当然可以,可以提前对用户的好友进行索引,对好友的好友进行索引,这样在未来进行关系的搜索时会大大加快:

A: {A1} {A2} A1为A的好友的集合,A2为A的好友的好友的集合
E: {E1} {E2}

那么
1度分隔为: A 属于{E1},等同于E属于 {A1}
2度分隔为: A 属于{E2},等同于E属于 {A2},{A1}{E1}有共同项。
3度分隔为: {A1} {E2}有共同项,等同于A属于 {E2}
4度分隔为: {A2} {E2}有共同项


【SN关系的更新】

当然,发现是一个核心问题,另外一个问题就是更新,因为SN的关系不会是一成不变的,在一个活跃的SN社区里,每天用户之间的关系的更新更是可观。这里只考虑关系添加的例子:

A: {A1} {A2}
E: {E1} {E2}

当A 与 E 直接建立了好友关系后,应该说整合系统的关系全都变化了,因为这个新的关系一定会导致一些关系的短路,从而导致很多现有的关系的调整。但是因为我们只存储2度分隔以内的关系,也只关心两度分隔以内的关系,因此当发生了一个新的关系后,2度内关系的变化一定是A和E本身或者他们的一度关系的用户,再远的用户将不受这个关系的影响。

因此首先 所有{A1}的元素的二度分隔集合里要加上E,所有{E1}的元素的二度分隔集合里要加上A。

然后是二度的修正。分别加上对方的1度。
{A2} = {A2 + E1}
{E2} = {E2 + A1}

最后是一度的修正:A, E 的 一度{A1}{E1}需要加入E,A:
{A1} = {A1 + E}
{E1} = {E1 + A}

整体操作的量大约在2n次操作,比我们通常认为的要小的多 :) 。

你可能感兴趣的:(搜索引擎)