【发布时间】:2010-10-25 01:30:21
【问题描述】:
如今,Microsoft 和 Google 将对您硬盘上的文件编制索引,以便您快速搜索其内容。
我想知道他们是如何做到这一点的?你能描述一下算法吗?
【问题讨论】:
如今,Microsoft 和 Google 将对您硬盘上的文件编制索引,以便您快速搜索其内容。
我想知道他们是如何做到这一点的?你能描述一下算法吗?
【问题讨论】:
简单的情况是倒排索引。
最基本的算法很简单:
细节是事情变得棘手的地方,但基本原理是一样的。
通过“规范化和过滤”单词,我的意思是将所有内容转换为小写,删除常见的“停用词”(the、if、in、a 等),可能是“词干”(删除动词的常见后缀和复数等)。
之后,您将获得文件的唯一单词列表,您可以以此为基础构建索引。
有用于减少存储的优化,用于检查单词位置的技术(例如,文档中的“this”是否靠近“that”)。
但是,这是它完成的基本方式。
【讨论】:
这是一个非常基本的描述;更多详情,您可以阅读这本教科书(免费在线):http://informationretrieval.org/¹
1)。对于所有文件,创建一个索引。该索引包含数据集中出现的所有唯一词(称为“语料库”)。对于每个单词,都会关联一个文档 ID 列表;每个文档 id 指的是包含该单词的文档。
变体:有时当您生成索引时,您想忽略停用词(“a”、“the”等)。不过,您必须小心(“to be or not to be”是一个由停用词组成的真实查询)。
有时你也会阻止单词。这对使用后缀和前缀的非英语语言的搜索质量影响更大。
2) 当用户输入查询时,查找相应的列表,并将它们合并。如果是严格的布尔查询,则该过程非常简单——对于 AND,docid 必须出现在所有单词列表中,对于 OR,必须出现在至少一个单词列表中,等等。
3) 如果您想对结果进行排名,有多种方法可以做到这一点,但基本思想是使用一个单词在文档中出现的频率,与您期望的频率相比出现在语料库中的任何文档中,作为该文档或多或少相关的信号。见教科书。
4) 还可以存储词位来推断词组等
其中大部分与桌面搜索无关,因为您对召回(包含该术语的所有文档)比排名更感兴趣。
¹以前在http://www-csli.stanford.edu/~hinrich/information-retrieval-book.html,可通过回程机器访问
【讨论】:
您可以随时查看 Apache Lucene 之类的内容。
Apache Lucene 是一个完全用 Java 编写的高性能、功能齐全的文本搜索引擎库。它是一种适用于几乎所有需要全文搜索的应用程序的技术,尤其是跨平台的应用程序。
【讨论】: