全文索引---新手入门(三)

本文详细介绍了全文检索系统的索引创建过程,包括文档预处理、分词、语言处理及索引建立等关键步骤,并解释了如何通过这些步骤提高搜索效率和准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何创建索引

 

全文检索的索引创建过程一般有以下几步:

 

第一步:一些药索引的原文档(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)就是一种语言中最普通的一些单词,由于没有特别的意义,因而大多数情况下不能称为搜索的关键词,因而创建索

 

引时,这种词被去掉而减少索引的大小。英语中停词(Stop  word)如:“the”,“a”,“this” 等。

 

经过分词(Tokenizer)后得到的结果称为词元(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)一般做以下几点:

 

1.变为小写(Lowercase)。

 

2.将单词缩减为词根形式,如“cars”到“car”等。这种操作称为:stemming。

 

3.将单词转变为词根形式,如“drove”到“drive”等。这种操作称为:lemmatization。

 

Stemming和lemmatization的异同

 

相同之处:Stemming和lemmatization  都要使词汇成为词根形式。

 

两者的方式不同:

 

stemming采用的是“缩减”的方式:“cars”到“car”,“driving”到“drive”。

 

Lemmatization采用的是“转变的方式”:“drove”到“drive”,“driving”到“drive”。

 

两者的算法不同

 

Stemming主要是采取某种固定的算法来做这种缩减,如去除“s”,去除“ing”加“e”,将“ational”变为“ate”,将“tional”变为

 

“tion”。

 

Lemmatization 主要是采用保存某种字典的方式做这种转变。比如字典中有“driving”到“drive”,“drove”到“drive”,“am,is,

 

are”到“be”的映射,做转变时,只要查字典就可以了。

 

Stemmi和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)创建一个字典。

 

在我们的例子中字典如下:

 

TermDocumentID
student1
allow1
go1
their1
friend1
allow1
drink1
beer1
my2
friend2
jerry2
go2
school2
see2
his2
student2
find2
them2
drink2
allow2

 

2.对字典按字母进行排序

Term DocumentId
allow1
allow1
allow2
beer1
drink1
drink2
find2
friend1
friend2
go1
friend2
his2
jerry2
my2
school2
see2
student2
their1
them2

 

 3.合并相同的词(Term)称为文档倒排(Posting List)链表。

 

 

 在此表中,有几个定义:

 

Document Frequency 即文档频次,表示总共有多少文件包含此词(Term)。

 

Frequency 即词频率,表示此文件中包含了几个此词(Term)。

 

所以对词(Term)“allow”来讲,总共有两篇文档包含此词(Term),从而(Term)后面的文档链表总共有两项,第一项表示包含

 

“allow”的第一篇文档,即1号文档,此文档中,“allow”出现了2次,第二项表示包含“allow”的第二个文档,是2号文档,

 

此文档中,“allow”出现了1次。

 

到此文职,索引已经创建好了,我们可以通过它很快的找到我们想要的文档。

 

而且在此过程中,我们惊喜地发现,搜索“drive”,“driving”,“drove”,“driven”也能够被搜到。

 

因为在我们的索引中,“driving”,“drove”,“driven”都会经过语言处理而变成“driven”,在搜索时,如果您输入“driving”,输入的

 

查询语句同样经过我们这里的一到三步,从而变为查询“drive”,从而可以搜索到想要的文档。

 

4.如何对索引进行搜索?

 

到这里似乎我们可以宣布我们找到想要的文档了。

 

然而事情并没有结束,找到了仅仅是全文检索的一个方面。如果仅仅只有一个或十个文档包含我们查询的字符产,我们的确找到了。

 

然而如果结果又一千个,甚至成千上万个呢?那个又是您最想要的文件呢?

 

这种情况大家应该都遇到过,比如说Google和百度,返回的结果之大,让你不可能在短时间内查看全部的网页。然而它们做的很好

 

把最相关的内容放在最前面。

 

如何像Google一样,在成千上万的搜索结果中,找到和查询语句最相关的呢?

 

如何判断搜索出的文档和查询语句的相关性呢?

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值