来自知乎:
在全文检索的实现机制里面,主要关心以下3个方面。
1. 索引里面究竟存些什么?(Index)
2. 如何创建索引?(Indexing)
3. 如何对索引进行搜索?(Search)
如何创建索引?(Indexing) 第一步:一些要索引的原文档(Document)。
第二步:将原文档传给分次组件(Tokenizer)。
第三步:将得到的词元(Token)传给语言处理组件(Linguistic Processor)
第四步:将得到的词(Term)传给索引组件(Indexer)。
第一步:一些要索引的原文档(Document)。为了方便说明索引创建过程,用两个文件为例:
文件一:Students should be allowed to go out with their friends, but not allowed to drink beer.
文件二:My friend Jerry went to school to see his students but found them drunk which is not allowed.
第二步:将原文档传给分次组件(Tokenizer)。分词组件(Tokenizer)会做以下几件事情( 此过程称为Tokenize) :
1. 将文档分成一个一个单独的单词。
2. 去除标点符号。
3. 去除停词(Stop word) 。
经过分词(Tokenizer) 后得到的结果称为词元(Token) 。
在我们的例子中,便得到以下词元(Token):
“Students”,“allowed”,“go”,“their”,“friends”,“allowed”,“drink”,“beer”,“My”,“friend”,“Jerry”,“went”,“school”,“see”,“his”,“students”,“found”,“them”,“drunk”,“allowed”。
第三步:将得到的词元(Token)传给语言处理组件(Linguistic Processor)语言处理组件(linguistic processor)主要是对得到的词元(Token)做一些同语言相关的处理。
对于英语,语言处理组件(Linguistic Processor) 一般做以下几点:
1. 变为小写(Lowercase) 。
2. 将单词缩减为词根形式,如“cars ”到“car ”等。这种操作称为:stemming 。
3. 将单词转变为词根形式,如“drove ”到“drive ”等。这种操作称为:lemmatization 。
语言处理组件(linguistic processor)的结果称为词(Term) 。
在我们的例子中,经过语言处理,得到的词(Term)如下:
“student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,“student”,“find”,“them”,“drink”,“allow”。
也正是因为有语言处理的步骤,才能使搜索drove,而drive也能被搜索出来。
第四步:将得到的词(Term)传给索引组件(Indexer)索引组件(Indexer)主要做以下几件事情:
1. 利用得到的词(Term)创建一个字典。
2. 对字典按字母顺序进行排序。
3. 合并相同的词(Term) 成为文档倒排(Posting List) 链表。
* Document Frequency 即文档频次,表示总共有多少文件包含此词(Term)。
* Frequency 即词频率,表示此文件中包含了几个此词(Term)。
综上,这个只是搜索引擎的简单实现,真正的肯定比这个复杂,特别是中文处理方面。
阅读(1006) | 评论(0) | 转发(0) |