zoukankan      html  css  js  c++  java
  • 《信息检索导论》第二章总结

    建立倒排记录表之前


    一、文件的编码


    一般一个文件都是以字节的方式存储的,如果想要让其可读,就必须要通过正确的编码方式转换成字符;就像Java IO一样,如果没有通过正确的编码方式打开一个文件,会出现乱码。因此在一系列处理步骤之前,知道文档的编码是重要的。一般在文档的meta data部分都会保存编码方式。


    二、索引粒度


    索引粒度的选取也是很重要的。因为如果把索引粒度选的太大,比如你想找Information Retrieval,如果索引粒度为整本书,则只要出现Information和Retrieval的书都会被选中,这非常不精确。


    三、Tokenization


    词条化:这个方法就像Java中StringTokenizer的用法,将一个文档(长的字符串)切分成一个个小单词。

    Token:词条化后的一个个单词;

    Type:将词条化的单词放入集合后的结果。

    Term:将Type进行归一化后的结果,即dictionary中能找到的词。

    比如 a apple and a banana  ;有5个token,4个type(a合并),2个Term(去除停用词);


    四、Stop words


    停用词就是一些很常用的词,比如the , a 等;这些词因为出现的次数很多,每篇文档都会出现,所以如果要让他也在倒排索引中,则会引起posting过大的情况。

    注意:

    (1)有时去除停用词的方法也会有问题,比如:to be or not to be,to be 都是停用词,那么查询变成了 or not,则意义完全不一致。

    (2)去除停用词是应用于文档和查询的,在文档中,不对停用词构建倒排索引,而在查询中,也去除停用词,只将其他词做索引。

    去除停用词缺点:会使表达的语义不一致,比如from Shanghai to BeiJing;变成Shanghai Beijing 则语义会不一致;


    五、等价类


    如果有一个等价类:{A,B,C,D};如果需要查询A,则等同于查询A,B,C,D;

    而Normalization就是利用等价类,常用的方法是:大小写转换(case folding);

    注意:

    (1)大小写转换也会有缺点:比如C.A.T,会转换成cat ,偏离了原本意义。

    (2)等价类也是同时应用于查询和文档的。


    六、stemming和lemmatization


    Stemming:简单的通过截取的方式去除前缀和后缀。比如solution,变成 solu;

    词干还原能够提高查全率,降低查准率;因为比如respective和respectability都转换成respect,但是意义却不一样,因此在查询respectability时,会通过stemming转换成respect,并且查询到respective。

    stemming能够降低dictionary的大小;

    Porter算法:一种针对英文,有效的词干分析的算法。

    Porter预先会给出一些mapping:

    tion--->空

    IES---->I

    等等;

    规则1:去除后缀后长度大于1;

    规则2:当多条匹配时,则取最长的。

    Lemmatization:通过词典的分析来进行合理地去除词缀,比如men,变成man;

    lemma:词形分析后得到的单词;

    注意:词干还原和词形分析是对文档和查询词使用的,因此在建立索引是就会把respective和respectability解析成一个respect,即dictionary中是respect,posting是这两个词的docID的并集。而在查询时如果查询的词是respective,则会进行词干还原,并变成respect后在倒排索引中寻找。

    倒排记录表的结构


    1.含有Skip pointer的inverted index 


    原本的倒排记录表合并算法需要O(m+n),但是如果使用了跳表,则可以达到次线性时间。

    在posting中包含skip pointer,可以跳过那些肯定不在结果中的docID,并且只适用于AND操作

    通常:每(根号p)处放一个倒排指针,p为倒排记录表的长度;

    比如:有16个docID,如下:


    则每四个放置一个跳表,即1-->5,5-->9,9-->13,13-->17;

    注意:这种方法适用于倒排索引稳定的前提;


    2.positional inverted index


    在posting的每个docID后面跟上单词出现的位置,比如:apple  ----->     1(2,3,4) ;2(4,5,6);    

    注意:positional index可以进行邻近搜索,而二元词不能。

    缺点:倒排记录表的posting太大。

    应用:处理邻近查询

    采用positional index进行合并需要的复杂度是O(T);   T是文档集中词条数目;


    3.biword inverted index


    将两个词看成一个item,即在dictionary中都是两个词为一组。

    比如invert and revert,则会变成invert and和and revert;但是这种做法使得倒排记录表迅速变大。

    这种方法的缺点很多:

    (1)不适用于单词查询。

    (2)倒排记录表太大。

    (3)查询有时还不正确。需要进行后过滤(即在查询词组中过滤一遍)


    折中策略:


    (1)对于单个单词出现次数非常多,而组成一个词组后出现次数大大减少的词组,用biword index;

    (2)对于那些经常被用户查询的词组,使用biword index;

    (3)其余使用positional index;

    作者:xiazdong
    出处:http://blog.xiazdong.info
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
  • 相关阅读:
    scrapy 项目搭建
    linux mysql -- ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.localdomain.pid)
    linux 安装python 和pip
    转 Pycharm及python安装详细教程
    mysql在linux下的安装
    easyui datagrid动态修改editor时动态绑定combobox的数据
    easyui combobox 在datagrid中动态加载数据
    linux 安装tomcat
    CUBRID学习笔记23 关键字列表
    CUBRID学习笔记 22 插入数据
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058358.html
Copyright © 2011-2022 走看看