问题
基于检索的问答系统,最大的问题就是知识库过大,如果使用输入和知识库里面的每篇文章计算相似度,然后匹配出和知识库相似度最大的文章,则时间复杂度过大,为 O ( N ) O(N) O(N)级别。所以需要有一种方法,它能够降低问题需要匹配的知识库大小,则可以降低时间复杂度。
倒排索引
符号化表示
构建倒排索引前先进行一些符号化表示,假设知识库的形式大概是这样的:
- d o c 1 : [ w 11 , w 12 , w 13 … … ] doc_1:[w_{11},w_{12},w_{13}……] doc1:[w11,w12,w13……]
- d o c 2 : [ w 21 , w 22 , w 23 … … ] doc_2:[w_{21},w_{22},w_{23}……] doc2:[w21,w22,w23……]
- ……
构建倒排索引:
将知识库的内容分词,以词作为键,以文档为值,构建倒排表:
- w i j : [ d o c i , d o c j , d o c k ] w_{ij}:[doc_i,doc_j,doc_k] wij:[doci,docj,dock]
- w p q : [ d o c x , d o c y , d o c z ] w_{pq}:[doc_x,doc_y,doc_z] wpq:[docx,docy,docz]
- …
处理流程
先将问题对应的文字分词,然后去倒排表里面查找相应的文档,我们可以设置一些规则,比如找到出现了和问题中有n个相同单词的文档,这样必定会排除掉很多和问题无关的文档,此时相当于减小了知识库,从而减少计算量。