zoukankan      html  css  js  c++  java
  • 自然语言处理3-5:文本处理之倒排表

    还记得之前的基于匹配的问答系统吗?系统中有许多的问答对,可能是数百万条,千万条之类的。当用户提出一个问题,系统首先将该问题和问答库中的所有问题求文本相似度,然后选择相似度最高的那个问题,其对应的答案就是系统需要输出的答案。

    但是,这样做的问题就是复杂度太高了。对于每个问题,系统需要进行百万次或者千万次的求相似度的操作,这样会造成很大的延迟的。一个可以考虑的思路是,在求相似度之前,先把很明显无关的问题给过滤掉,然后对剩下的问题求相似度。剩下的问题可能还有一百个或者一千个,这样,时间复杂度大大缩短了。

    那么,怎么过滤掉无关的问题呢,可以使用接下来需要介绍的倒排表技术。

    还是先举例,如下图所示,假设我们有四个文本,文本1中有“我们,今天,运动”这三个词,文本2中有“我们,昨天,运动”这三个词,文本3中有“你们,上,课”这三个词,文本4中有“你们,上,什么,课”这四个词。那么,我们可以统计四个文本中每个单词各出现在了哪些文本中并记录下来。例如,“我们”这个词出现在了文本1和文本2中,“今天”这个词出现在了文本1中,“运动”这个词出现在了文本1和文本2中。对每个词进行统计后,就形成了下图中间一列的结果,这就是倒排表。

    这个时候,如果有人输入了一个句子“我们上数学课”,那么,首先可以根据倒排表查抄含有“我们,上,数学,课”的文本,然后其他的文本由于不含有这些词汇,就说明和输入的句子的相似度非常小,就给过滤掉了。这个查找倒排表可以根据并集也可以根据交集,也就是说,可以是只要包含“我们,上,数学,课”这四个单词中的任意一个单词的文本就保留下来,也可以是必须同时包含这4个单词的文本才能被保留下来。当然,还可以制定规则,将同时含有四个单词中两个以上的文本给保留下来。这个规则是可以自己灵活制定的,但是都得利用倒排表来过滤。

  • 相关阅读:
    Java基础(十四)——API(Calendar类、System类、StringBuilder类、包装类)
    异常
    Java基础(十三)——权限修饰符和内部类
    知识点总结
    Java基础(十二)— —多态
    Java基础(十一)— —继承、抽象类和接口
    java基础(十)——继承
    小程序外部向组件内部传递externalClasses -- 传入样式wxss
    小程序组件交互 -- 传入js
    promise封装小程序的请求类(request,清爽易懂)
  • 原文地址:https://www.cnblogs.com/loubin/p/13704578.html
Copyright © 2011-2022 走看看