全文索引---新手入门(三)
来源:互联网 发布:modbus tcp c编程实例 编辑:程序博客网 时间:2024/05/01 23:58
如何创建索引
全文检索的索引创建过程一般有以下几步:
第一步:一些药索引的原文档(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)创建一个字典。
在我们的例子中字典如下:
TermDocumentIDstudent1allow1go1their1friend1allow1drink1beer1my2friend2jerry2go2school2see2his2student2find2them2drink2allow2
2.对字典按字母进行排序
Term DocumentId allow1allow1allow2beer1drink1drink2find2friend1friend2go1friend2his2jerry2my2school2see2student2their1them2
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一样,在成千上万的搜索结果中,找到和查询语句最相关的呢?
如何判断搜索出的文档和查询语句的相关性呢?
- 全文索引---新手入门(三)
- 全文索引------新手入门(二)
- 全文索引一二三
- Sql2005 全文索引(三)
- Sql2005 全文索引(三)
- Sql2005 全文索引(三)
- 全文检索----新手入门(一)
- 全文检索----新手入门(四)
- oracle模糊查询:全文索引方式(三)
- oracle模糊查询:全文索引方式(三)
- 全文索引(三)lucene 分词器 Analyzer
- Pomelo 新手入门(三)
- NodeJs新手入门(三)
- python新手入门(三)
- Oracle B-tree、位图、全文索引三大索引性能比较及优缺点汇总(引用)
- Oracle全文索引之三 检索
- lucene全文搜索之三:生成索引字段,创建索引文档(给索引字段加权)基于lucene5.5.3
- 索引服务器(全文索引)的使用
- diff between Context.getResources().getString() and Context.getString()
- org.springframework.dao.InvalidDataAccessResourceUsageException: Could not execute JDBC batch
- sort 排序类类型对象。。
- 【Android】Activity 的 Title 中加入进度条
- Java多线程之同步与死锁
- 全文索引---新手入门(三)
- D3D或OpenGL GDI+的双缓冲技术
- 绘制条形码
- XHTML声明
- voiceXML voiceglue install
- 暴露无知
- 使用json-lib JSONObject JSONArray
- rpm用法
- int型在内存中的存储方式与高低字节(大小端)