Skip to content

哪些Flash文件和里面的内容能被更好的索引

(转自CSDN)我们收到过许多期望我们改进对 Adobe Flash 文件索引问题的建议。今天,索引团队的软件工程师 Ron Adler 和 Janis Stipins ,将就我们最近在 Flash 文件索引编制上取得的改进与大家进行更深入的探讨和交流。

问:目前哪些 Flash 文件能更好地被谷歌索引到呢?
我们改善了对所有类型 SWF 文件中的文字内容的索引能力,其中包括像按钮或菜单这样的 Flash “小工具”,独立自成一体的 Flash 网站,以及所有介于两者之间的 Flash 形式。

问:这些 Flash 文件中的哪些内容能被谷歌更好地索引呢?
用户在与您的 Flash 文件互动过程中所看到的一切文本内容都将得到更好地索引。如果您的网站包含 Flash ,其中的文字内容会被 Google 用来生成您网站的摘要。同时,出现在 Flash 文件中的文字可以用来匹配用户在 Google 搜索框中输入的搜索查询。

除了索引 Flash 文件中的文本内容,我们现在也能够识别在 Flash 文件中的出现的 URL ,并且把这些链接纳入搜索引擎机器人爬行的目标队列中,就像对待那些非 Flash 网页中出现的 URL 一样。例如,如果您的 Flash 应用程序中包含指向您网站内部页面的链接,Google 现在能够更好地发现并抓取您的网站。

问:那么 Flash 文件中包含的非文本内容呢,比如图片?
目前,我们只能识别和索引 Flash 文件中的文本内容。如果您的 Flash 文件里只有图片,我们将不能识别和索引出现在这些图片中的任何文字。类似地,如果一个 Flash 按钮没有任何附属的文字的话,我们将无法对这类指向特定链接的 Flash 按钮生成任何錨文本。

还应注意到的是,我们无法索引 FLV 文件,比如在 YouTube 上播放的视频,因为这些文件没有包含任何文字元素。

问:Google 是怎样识别 Flash 文件里的内容呢?
我们开发出了一种算法,这种算法可以使 Google 机器人能够模仿人类通过点击按钮、输入内容等方式来了解 Flash 文件。我们的算法能够记住沿途它遇到的所有文字内容,其后这些内容都能被索引到。我们无法告诉您更多的保密细节,但是我们可以告诉您,通过使用 Adobe 的新型可检索性 SWF 数据库,这种算法的有效性得到了进一步提高。

问:我怎样做才能使 Google 索引到我的 Flash 文件中出现的文本呢?
基本上,您不需要做任何事情。我们已经取得的技术改进,使这项功能的实现,无需网页设计者或网站管理员做任何特别的操作。如果您的网站上有 Flash 内容,我们会在现有技术能力的基础上,尽最大能力对它们自动进行索引(详见接下来的问题)。

也就是说,您应该了解 Google 现在已经可以识别那些展现在您网站访问者面前的文字信息。如果你希望 Google 忽略一些次要内容,如“版权”或“加载”等信息,您可以考虑把那些文本替换为图片,这样它们就不会被我们抓取到了。

问:在索引 Flash 文件上,Google 遇到的主要技术难题是什么?
目前的问题主要体现在三个方面,这也正是我们在努力解决的:

1、Googlebot 不能执行某些类型的 JavaScript 程序。因此,如果您的网页通过 JavaScript 加载 Flash 文件的话,Google 可能无法识别该 Flash 文件,在这种情况下,它将不会被索引到。

2、目前,我们还无法把那些通过您的 Flash 文件加载的外来内容和您的 Flash 文件整合起来。也就是说,如果您的 Flash 文件加载了一个 HTML文件,或一个 XML 文件,或另一个 SWF 文件等等,Google 将分别索引这些资源,但是它们将不会被认为是您 Flash 文件内容的一部分。

3、虽然我们能够索引在网络上出现的几乎所有语种的 Flash ,但在识别用双向语言书写的 Flash 内容还有一定困难。在这个问题解决之前,我们将无法识别和索引 Flash 文件中的希伯来文或阿拉伯文的内容。

但是,在这些问题上我们也已经取得了相当的进展,所以,敬请期待我们进一步的改进!

Yahoo大幅开放搜索架构供开发人员使用

(转载自CSDN)作为Yahoo开放策略(Open Strategy)的一环,Yahoo于周四(7/10)大幅开放其搜索技术架构,推出新的Yahoo!Search BOSS(Build Your Own Search Service)平台,开发人员得以透过Yahoo! Search BOSS API使用Yahoo的搜索技术,包括能够重新排序及控制网页搜索的结果。

Yahoo在今年5月已发表SearchMonkey平台,让其他网站分享Yahoo的结构化数据在Yahoo搜索结果页上嵌入客制化信息,开发人员能够设计不同的SearchMonkey应用供使用者选择;而BOSS则更进一步供开发人员及企业存取Yahoo搜索的运算架构,透过与Yahoo搜索所采用的同样技术建置自己的网页搜索服务。

Yahoo BOSS团队说明,BOSS为一开发平台让开发人员可以透过API存取所有Yahoo搜索的索引,利用Yahoo的搜索架构及技术再加上企业或开发人员自有的资产,建立他们自己的搜索经验,目前Yahoo已释出网页、新闻及图片的搜索索引,预计未来会开放更多的索引类别。

采用BOSS平台的企业及开发人员可以根据他们自己的需求排序搜索结果,同时也可以设计自己的接口,不一定要使用Yahoo品牌,Yahoo并释出Python链接库与用户接口样版让开发人员可以混搭BOSS搜索结果及其他数据源,而且提供无限的每日搜索数量。

开发人员与企业可以利用Yahoo所释出的BOSS API及其他混搭架构工具以在自己的网站上部署BOSS,或是利用自助型API快速建置新的网络搜索服务。

Yahoo搜索架构长Prabhakar Raghavan指出,今日搜索市场局限于三大主要的搜索引擎,BOSS开放了这个战场让开发人员及企业得以瓦解该市场。

不过,Yahoo除了释出搜索技术平台外,也计划在几个月后推出结合Yahoo搜索广告及其他模式的BOSS营利平台,让这些采用BOSS的业者及开发人员也能透过搜索服务获利。分析师认为,Yahoo打算分享那些采用BOSS平台的广告利润。

双数组Trie树的一个实现

今天发现双数组Trie树的一个C++的实现,一个小日本实现的。

项目名称Darts: Double-ARray Trie System
地址http://chasen.org/~taku/software/darts/

双数组trie树的基本构造及简单优化

一、 基本构造

Trie树是搜索树的一种,来自英文单词”Retrieval”的简写,可以建立有效的数据检索组织结构,是中文匹配分词算法中词典的一种常见实 现。它本质上是一个确定的有限状态自动机(DFA),每个节点代表自动机的一个状态。在词典中这此状态包括"词前缀","已成词"等。

双数组Trie(Double-Array Trie)是trie树的一个简单而有效的实现,由两个整数数组构成,一个是base[],另一个是check[]。设数组下标为i ,如果base[i],check[i]均为0,表示该位置为空。如果base[i]为负值,表示该状态为词语。Check[i]表示该状态的前一状 态,t=base[i]+a, check[t]=i 。

下面举例(源自<<双数组Trie(Double-Array Trie)的数据结构与具体实现>>)来说明用双数组Trie(Double-Array Trie)构造分词算法词典的过程。假定词表中只有“啊,阿根廷,阿胶,阿拉伯,阿拉伯人,埃及”这几个词,用Trie树可以表示为:

我们首先对词表中所有出现的10个汉字进行编码:啊-1,阿-2,唉-3,根-4,胶-5,拉-6,及-7,廷-8,伯-9,人-10。。对于每一 个汉字,需要确定一个base值,使得对于所有以该汉字开头的词,在双数组中都能放下。例如,现在要确定“阿”字的base值,假设以“阿”开头的词的第 二个字序列码依次为a1,a2,a3……an,我们必须找到一个值i,使得 base[i+a1],check[i+a1],base[i+a2],check[i+a2]……base[i+an],check[i+an]均为 0。一旦找到了这个i,“阿”的base值就确定为i。用这种方法构建双数组Trie(Double-Array Trie),经过四次遍历,将所有的词语放入双数组中,然后还要遍历一遍词表,修改base值。因为我们用负的base值表示该位置为词语。如果状态i对 应某一个词,而且Base[i]=0,那么令Base[i]=(-1)*i,如果Base[i]的值不是0,那么令Base[i]= (-1)*Base[i]。得到双数组如下:

下标

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Base

-1

4

4

0

0

0

0

4

-9

4

-11

-12

-4

-14

Check

0

0

0

0

0

0

0

2

2

2

3

8

10

13

词缀

阿根

阿胶

阿拉

埃及

阿根廷

阿拉伯

阿拉伯人

用上述方法生成的双数组,将“啊”,“阿”,“埃”,“阿根”,“阿拉”,“阿胶”,“埃及”,“阿拉伯”,“阿拉伯人”,“阿根廷”均视为状 态。每个状态均对应于数组的一个下标。例如设“阿根”的下标为i=8,那么check[i]的内容是“阿”的下标,而base[i]是“阿根廷”的下标的 基值。“廷”的序列码为x=8,那么“阿根廷”的下标为base[i]+x=base[8]+8=12。

二、 基本操作与存在问题

1, 查询
trie树的查询过程其实就是一个DFA的状态转移过程,在双数组中实现起来比较简单:只需按照状态标志进行状态转移即可.例如查询“阿根廷”,先根据“ 阿”的序列码b=2,找到状态“阿”的下标2,再根据“根”的序列码d=4找到“阿根”的下标base[b]+d=8,同时根据 check[base[b]+d]=b,表明“阿根”是某个词的一部分,可以继续查询。然后再找到状态“阿根廷”。它的下标为y=12,此时 base[y]<0,check[y]=base[b]+d=8,表明“阿根廷”在词表中,查询完毕。

查询过程中我们可以看到,对于一个词语的查询时间是只与它的长度相关的,也就是说它的时间复杂度为O(1).在汉语中,词语以单字词,双字词居多,超过三字的词语少之又少.因此,用双数组构建的trie树词典查询是理论上中文机械分词中的最快实现。

2, 插入与删除
双数组的缺点在于:构造调整过程中,每个状态都依赖于其他状态,所以当在词典中插入或删除词语的时候,往往需要对双数组结构进行全局调整,灵活性能较差。

将一个词语插入原有的双数组trie树中,相当于对DFA增加一个状态。首先我们应根 据查询方法找出该状态本应所处的位置,如果该位置为空,那好办,直接插入即可。如果该位置不为空。那么我们只好按照构造时一样的方法重新扫描得出该状态已 存在的最大前缀状态的BASE值,并由此依次得出该状态后继结点的BASE值。在这其中还要注意CHECK值的相应变化。

例如说,如果"阿拉根"某一天也成为了一个词,我们要在trie树中插入这一状态。按计算它的位置应在8,但8是一个已成状态.所以我们得重新确 定"阿拉"这一最大已成前缀状态的BASE值.重新扫描得出BASE[10]=11。这样状态15为"阿拉根",且BASE[15]为负(成 词),CHECK[15]=10;状态20为"阿拉佰",且BASE[20]=-4,CHECK=10。

这样的处理其实是非常耗时间的,因为得依次对每一个可能BASE值进行扫描来进行确定最大已成前缀状态的BASE值。这个确定过程在构造时还是基本 可以忍受的,毕竟你就算用上一,两天来构造也没有问题(只要你构造完后可以在效运行即可)。但在插入比较频繁时,如果每次都需要那么长的运行时间,那确实 是无法忍受的。

双数组删除实现比较简单,只需要将删除词语的对应状态设为空即可――即BASE值,CHECK均为设0。但它存在存在一个空间效率的问题.例如,当 我们在上面删除"埃及"这一词语时,状态11被设为空。而状态10则成了一个无用结点――它不成词,而且在插入新词时也不可重用。所以,随着删除的进行, 空状态点和无用状态点不断增多,空间的利用率会不断的降低。

三、 简单优化

优化的基本思路是将双数组trie树构建为一种动态检索方法,从而解决插入和删除所存在的问题。

1, 插入优化
在插入需要确定新的BASE值时,我们是只需要遍历空状态的。非空状态的出现意味着某个BASE值尝试的打败,我们可以完全不必理会。所以,我们可以对所有的空状态构建一个序列,在确定BASE值时只需要扫描该序列即可。
对双数组中的空状态的递增结点r1,r2, …, rm,我们可以这样构建这一空序列:
CHECK[ri]=−ri+1 (1 i m−1),
CHECK[rm]=−(DA_SIZE+1)
其中r1= E_HEAD,为第一个空值状态对应的索引点。这样我们在确定BASE值时只需扫描这一序列即可。这样就省去了对非空状态的访问时间。

这种方法在空状态并不太多的情况下可以很大程度的提高插入速度。

2, 删除优化
1) 无用结点
对于删除叶结点时产生的无用结点,可以通过依次判断将它们置为空,使得可在插入新词时得以重用。例如,如果我们删除了上例中的"阿根廷",可以看到"阿根"这一状态没有子状态,因此也可将它置为空。而"阿"这一状态不能置空,因为它还有两个子状态。

2) 数组长度的压缩

在删除了一个状态后,数组末尾可能出现的连续空状态我们是可以直接删除的。另外我们还可以重新为最大非空索引点的状态重新确定BASE值,因为它有可能已经由于删除的进行而变小。这们我们可能又得以删除一些空值状态。

(本文转自http://hunteagle.javaeye.com/blog/118550)

位图索引及位图压缩

位图索引

应用范围:适合少量的分类查询以及其它适用场合。

问题引出:一个关于手机的垂直搜索引擎,有一个高级搜索选项:价格范围。用户可以选择的范围是0~1000元,1000~2000元,3000~4000元,4000元以上。如何高速的检索?

我的建议是使用位图索引

定义:字段F的一个位图索引是一个长度为n的位向量的集合。每一个位向量对应于字段F中可能出现的值。如果第i个记录的字段F的值为v,那么对应于值v的位向量在位置i上的取值为1;否则该向量的位置i上的取值为0。

例子:假设文件由包括两个字段N(手机名称),P(价格),共6条记录(编号为0~5)组成:

–N——P—
0-N83—4150
1-N95—4150
2-N6300-1230
3-N5300-1230
4-N5000-955
5-E90—4800

以P字段创建位图索引:

4150(110000) 表示第0条记录,第1条记录的P字段的值为4150;其它记录的P字段是非4150
1230(001100)
955(000010)
4800(000001)

现在考虑价格在0~2000元之间的手机有哪些?可以直接将1230和955对应的位图索引进行”或”逻辑运算,即:001110。实际为了减少运算量,在创建位图索引的时候,直接根据需要将0~2000等这些范围的位图索引创建好。即:
0~1000(000010)
1000~2000(001100)
0~2000(001110)
……

位图压缩

当位图索引很大时,压缩位图索引是很有必要的。这里介绍一种分段长度编码的压缩算法。

对一个位图索引进行适当的编码,得到一个由i个0且后跟一个1所组成的序列,这个序列表示一个段。

例如对00100000100进行压缩,首先进行分段:
001|000001|00
由于最后一段最后一位并非是1,故可将最后一段删除,即001|000001

则有:(2,5)两个段,表示第一段为2个0,后跟1个1;第二段为5个0,后跟1个1

下面讨论如何对(2,5)进行二进制编码。方法:对i进行编码,首先确定i的二进制有j位,表示成j-1个1和单个0;然后在它后面加上i的二进制数。例如:

2->1010
5->110101
(2,5)进行编码以后为:1010110101

注意有两个特殊的数字编码:1的编码为01;0的编码为00

再举一例:对0100000000001000100进行编码。

共有(1,10,3)三个段,最后的编码为01111010101011

以上的压缩率并不大,但是当位图越大,包含值为1的位向量越稀疏,这种方法压缩率就越高。实际应用中,可以根据情况适应地变换一下算法。

齐普夫(Zipf)定律

齐普夫定律是由美国学者G.K.齐普夫于本世纪40年代提出的词频分布定律。

它可以表述为:如果把一篇较长文章中每个词出现的频次统计起来,按照高频词在前、低频词在后的递减顺序排列,并用自然数个这些词编上的等级序号,即频次最高的词等级为1,频次次之的等级为 2,……,频次最小的词等级为D。若用f表示频次,r表示序号,则有fr=C(C为常数)。人们称该式为齐普夫定律。

Zipf其人
George Kingsley Zipf 1902年1月出生于一个德裔家庭(其祖父十九世纪中叶移居美国)。1924年,他以优异成绩毕业于哈佛学院。1925年在德国波恩、柏林学习。1929 年完成Relative Frequency as a Determinant of Phonetic Change,获得哈佛比较语文学博士学位。然后,他开始在哈佛教授德语。1931年与Joyce Waters Brown结婚。1932年出版Selected Studies of the Principle of Relative Frequency in Language。1935年出版The Psycho- Biology of Language:An Introduction to Dynamic Philology。1939年被聘为讲师。1949年出版Human Behavior and the Principle of Least Effort:An Introduction to Human Ecology。1950年9月因患癌症病逝。(Prün & Zipf 2002)

Zipf定律
Zipf的专业是比较语文学,但是,以其名字命名的定律却早已走出语言学,进入了信息学、计算机科学、经济学、社会学、生物学、地理学、物理学等众多研究领域 ,在学术界享有极高的声誉。

齐普夫定律是对人类语言词频分布的一个粗糙而有用的描述:

  • 非常常用的词很少
  • 中频词的数量中等
  • 大量低频词