问答系统的回顾
图中右侧是一个知识库,知识库需要包含两方面信息,每个数据需要包含每个问题和问题对应的答案。
假设用户问了一句话:How do you like NLPCamp?这句话经过一系列的文本预处理之后,需要和知识库的每个问题进行匹配,计算用户输入与每个问题的相似度,返回相似度最高的问题对应的答案。
这种方法有一个弊端,当知识库数据量太大时,需要计算N次相似度,对于用户的每个问题,都要和知识库的所有问题进行匹配,再返回相似度最高的。
为了避免计算知识库中的所有数据,我们使用倒排表来解决该问题。
倒排表
倒排表的核心思路是要知道某一个单词出现在哪一个文档中。
现在有一个知识库和词典库,词典库有所有出现的词,例如词典库是【我们,今天,运动,昨天,上,课】。
对于下面四个文档:
- doc1:我们今天运动;
- doc2:我们昨天运动;
- doc3:你们上课;
- doc4:你们上什么课;
对于词典中的每个词,【我们】出现在文档【doc1,doc2】,【今天】出现在【doc1】,以此类推,这样就形成了一个倒排表。
当形成一个倒排表,当用户输入运动,需要返回一些和运动相关的文档,这时候我们可以直接查询出现【我们】的文档,也就是【doc1,doc2】,这样就不用遍历整个知识库。
当用户输入【我们上班】,如果没有倒排表,需要将用户输入与整个知识库进行匹配,这样会耗费大量的时间。如果有了倒排表,可以直接查询与【我们】,【上】,【班】相关的文档。根据倒排表返回的文档和用户输入计算相似度,返回相似度最高的文档。
当用户输入【How do you like NLPCamp】,可以先选择至少包含输入句子中一个单词的所有文档,这是一次过滤。