在做一个比较复杂的项目中需要使用到搜索引擎技术,平时对他了解不多,这几天认真读了一下W.Bruce Croft的《搜索引擎-信息检索实践》收获不少,不过还是有一些问题不太明白,这里对所读内容做一个整理。
一、信息源
书中主要针对页面这样的信息源进行说明,与我想要做的不太一致,不过有几点引起了我的注意:
A. 时新性,需要维持爬虫采集回来页面的时新性,如果页面变化了则时新性就降低了。
B. 深层网络,私人站点、表单结果、脚本页面这些都属于深层网络挖掘的内容。
C. 转换问题,当把文档转化为纯文本进行处理,而不是HTML、XML这样的半结构化数据会丢失标题,字体等信息,这些信息在对数据进行加权,排序等具有重要作用。
二、文本处理
A. 齐普夫法则(Zipf`s Law)
第r高频的词的出现次数与r成反比,或则说,一个词在词频统计表中的排名乘以它的词频f约等于一个常数k r*f = k
事实上,齐普夫法则通常对排名靠前和排名靠后(高频词和低频词)的预测不准确。
B. Heaps法则,预测词表的增长
语料规模与词表大小的关系。 其中v为词汇量大小,语料中共有n个词,k和 是随不同语料变化的参数。根据Heaps法则以及相关实验发现在词数超过3000万词表时,词表仍然继续稳步增长。这个很重要,
C. 词素切分、停用词去除、词干提取 缺少中文方面的描述需要在看资料
D. 信息抽取
对于搜索应用而言,信息抽取主要用来识别搜索引擎用来提高排序效果的文本特征。识别和标注这些特殊的特征有时称为语义标注。现在通常能识别出一些命名实体,如药品名称,产品名,型号。
建立命名实体识别器的主要方法:基于规则方法和基于统计方法。
基于规则的方法如<number><word>streat可以用来识别街道地址。
基于统计方法,如隐马尔科夫模型(Hidden Markow Model HMM)。
一个马尔可夫模型使用状态state集合和状态间的转移transition描述一个过程。每个转移都关联一个概率。过程中的下一个状态只取决于当前状态和转移概率。
当它应用于识别句子时,给定一个句子和一个状态图,利用状态图找到一个状态图中实体类别序列,使得产生这个句子的概率最大。与序列中的实体类型相关的词将会被标记出来。
a. Viterbi算法可以在HMM模型中找到最大概率的状态序列,它属于一个动态规划算法
b. 该方法的核心是,状态图中状态间的转移概率需要从训练数据中估计出来。
三、基于索引的相关排序
A. 相关排序模型
相关排序函数 是某个特征函数,它从文档文本中获得一个数值。这个描述太过学术,我看了好几次才明白。就是说,对于一个词项,通过一定的函数计算获得一个数值,这个函数计算需要一般需要考虑所有文档,词项出现的频率,出现的位置等等。反正对于一个词项可以计算出一个数值。 是从查询的文本中获得一个词项的数值。然后两个数值进行相乘再求和,最终形成文档的分数。 这个特征函数很重要,主要目的是用来进行文档区分。
需要注意,你查询时可能只输入了一个词,但是实际上处理时Q不仅只含有一个词,搜索引擎可以通过查询扩展,扩展出多个词进行查询,这个后续再说。
B. 倒排索引,压缩编码这个部分内容网上太多了,这里就不累述了。
C. 查询处理
索引建立好后,需要处理查询,这个才是我关心的。书中给出了两中简单的查询处理算法“document-at-a-time”和“term-at-a-time”
Document-at-a-time每列表示一个不同的文档,这里简化分数是每个文档中词频的总和。(分数应该使用相关排序函数 来计算)。第一篇文档的所有词频被加起来生成文档的分数。一旦完成对第一篇文档计分,则开始第二篇文档,然后是第三篇、第四篇。
Term-at-a-time每次计算一个词的所有文档分数,这样只有所有词计算完成,所有文档的得分才能给出。
具体的优化技术这里就不说明了,书中论述很清晰。
D. 结构化查询
结构化查询时使用查询语言写的查询,容许改变查询中使用的特征以及那些特征的组合方式。书中给出了Galago结构化查询语言的例子,如#combin(#od:1(tropical fish)#od:1(aquarium fish) fish)。该查询有三个子查询组合。第一个查询是#od:1(tropical fish),#od:1操作符的意思是,其中的项在匹配的文档中需要一次出现,并且依照查询中的顺序。每个查询类似一个文档特征,使用#combin操作符组合起来。这里可以参考Lucene的结构化查询语言。
四、N