zoukankan      html  css  js  c++  java
  • 10分钟理解全文检索

    学习全文检索后的一些记录。

    1:全文检索要解决的问题

    我们遇到的数据总体分为两种:结构化数据非结构化数据

    • 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
    • 非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。

    对结构化的数据,我们可以用数据库等方式进行检索(效率差)。对于非结构化数据进行检索,利用windows系统的搜索也可以搜索文件内容,Linux下的grep命令等命令来实现。然而,使用这种顺序扫描的方式是相当费时的,于是便有了全文检索系统。

    2:全文检索原理

        将非结构化数据转为结构化数据(索引的过程),然后从索引中查找。

    3:索引里究竟存什么,为什么检索这么快?

        假如有3亿条产品标题存在数据库中,需要通过全文检索系统根据关键词来查找出相关的信息。

        例如前5条产品标题分别是:

        1:破碎机,挖掘机价格,破碎机图片,破碎机行业介绍

        2:破碎机销售,价格、磨石机价格、磨刀机价格

        3:电视机价格

        4:冰箱价格

        5:风扇价格  

    索引过程:遍历每条产品标题,分词,创建倒排链表。

        第一条数据分词: 破碎 机 挖掘 机 价格 破碎 机 图片 破碎 机 行业 介绍

        统计出现次数: 

                    破碎 3

                    机  4

                    挖掘 1

                    价格 1

                    图片 1

                    行业 1

                    介绍 1

        第二条数据分词:    破碎 机 销售 价格 磨石 机 价格 磨刀 机 价格

        统计每个词出现次数:

                        破碎 1

                        机  3

                        销售 1

                        价格 3

                        磨石 1

                        磨刀 1

        遍历所有的数据,生成倒排链表格式如下:

           破碎: 1=》  2 =>  3  => N   (数字代表文档编号)

           机 :  1 =》 2 =>  4

           价格: 1 =》 2

           挖掘: 1 =>  4 =>  5 =》 N

           图片: 1 => N

           行业: 1 => N

           介绍: 1 => 8 => 10 =》 N-1

           销售: 2 => N

           磨石: 2 => N

           磨刀: 2 => N

        此时倒排表已经建立好。文档多的时候,倒排链表会特别大,不过不用担心,倒排表是格式化后存硬盘的。

    检索过程:

        输入关键词”破碎机价格”,全文检索系统首先对传入的字符串分词为"破碎 机 价格",然后取出这3个词对应的倒排表。这时候cpu该上场,cpu会计算出哪些文档同时出现在3个倒排表中。计算之后会得到包含“破碎 机 价格”的所有文档编号(1和2),最后根据这些编号从数据库中查出对应的详细信息并展示给用户。

    4:检索结果排序

        如上例,搜索“破碎机价格”,文档1和文档2都会出现,那么哪条数据排前面是需要经过一个评分过程。

       1:对每个匹配到的文档计算权重(根据搜索的关键词”破碎 机 价格“来计算),使用如下公式:

    • Term Frequency (tf):词频,在此文档中出现了多少次。
    • Document Frequency (df):文档频次,表示总共有多少文档包含此词。

    公式最直白解释:df 越大说明越不重要,tf 越大说明越重要。

    依照此公式依次对上一步得到的所有文档计算权重,最后求和(复杂的算法,这里是简化的说法),得到这个文档的得分。最终按照得分来排序。
    上例中:“破碎” 在2个文档中出现,文档频次(df)就是2
                 “机” 在3个文档中出现,文档频次是3
                “价格” 在5个文档中出现,文档频次是5
    此时,得出“破碎”的文档频次(df)最小,”破碎“这个词最重要。再查“破碎“在文档1中出现3次(tf),在文档2中出现1次。此时文档1已经得到一个较大的评分。依次算出所有文档的得分。
    继续对“机“、”价格“在所有文档上求出评分,最终会得出文档1评分最高。全文检索系统评分之后,会将文档1排在首位,文档2排在第2位。

    5:词组匹配的实现(完全匹配)
    待续
    6: 属性过滤的实现
    待续

  • 相关阅读:
    文本挖掘预处理之TF-IDF
    文本挖掘预处理之向量化与Hash Trick
    文本挖掘的分词原理
    MCMC(四)Gibbs采样
    MCMC(三)MCMC采样和M-H采样
    编译c时提示“dereferencing type-punned pointer will break strict-aliasing rules”如何处理?
    ubuntu下添加新的ppa软件源后出现"Error: retrieving gpg key timed out"如何处理?
    如何创建离线网页?
    ubuntu下如何安装wpantund?
    tmux如何调节窗口大小?
  • 原文地址:https://www.cnblogs.com/dormscript/p/4787641.html
Copyright © 2011-2022 走看看