跳转至

GifExplorer 搜索召回率测试报告

召回率

根据搜索的不同模式,分为 perfect/partial/regex/related/filter 五种模式进行测试,由于 filter 可以与前面四种不同模式组合使用,简洁起见将 filter 单独测试。

为避免给 secoder 带来压力,我们基于 elastic search 内的索引数据库进行测试,召回率(即检出率)计算方式如下:根据 id 通过遍历 es 数据库获得所有 应被检出的目标total 条),根据搜索 API 逻辑获得 搜索结果hit 条),其中属于应被检出的目标有(valid hit 条),召回率定义为 valid hittotal 的比值。

理想状态下,搜索召回率应该接近 "1"

Perfect

测试方式

遍历数据库,如果 title/uploader == keyword 认为应该被检出,与搜索 API 逻辑相同,召回率测试结果理论上应为 "1" 。

测试结果

title/uploader total hit valid hit recall
title Trump 37 37 37 1.00
title gif with tags: anime 188 188 188 1.00
uploader Chengsx21 17 17 17 1.00

Partial

测试方式

设搜索输入为 keyword ,根据 whitespace/comma 对结果分词,结果为 tokens,遍历数据库,如果 title/uploader 包含 tokens 中所有元素,则认为应该被检出。

在本测试中,搜索模块给出的结果与测试脚本(遍历数据库的每一条目进行检查)完全相同,召回率为 100%。

但是,由于测试脚本在分词时没有进行谓词的省略、也没有规定 tokens 元素的顺序关系,实际可能会检出一些不合逻辑的结果,而搜索 API 则进行了更准确的分词以及更合理的匹配,出于对比我们将前者作为检出条件,测试搜索的召回率,可能部分结果比 1 偏低。但本次测试时,数据库中大约有 7000-8000 张图,尚未扩展到数万张图的规模;当图片数据库规模更大、标题等信息更丰富时,可能出现上述情况。

测试结果

keyword total hit valid hit recall
title Trump 183 183 183 1.00
title food, lunch 20 20 20 1.00
uploader Chengsx21 17 17 17 1.00

Regex

在本项目的实现中,正则表达式搜索在 Django 后端直接采用数据库中的正则表达式搜索,没有借助 ElasticSearch 搜索模块,因此本部分不再进行重复的测试。

测试方式

设搜索输入为 keyword ,使用外部库进行词义关联,可以比较 keyword 和指定句子的关联度,设置关联度阈值,根据 id 遍历数据库,所有 title/uploaderkeyword 关联度 超过阈值的目标被认为应当检出,搜索 API 使用另一套关联词表进行语义关联根据召回率测试结果对搜索的关联程度进行评估。

因为“关联”没有明确的标准,所以关联搜索的召回率测试结果仅供参考。关联搜索的召回率会因所使用的关联词表的不同而不同。

测试结果

keyword total hit valid hit recall
title food 2838 1468 1468 0.517
title delicious 5029 1468 858 0.170

Filter

测试方式

perfect 完全类似,不过增加了搜索限制范围,注意对于 tag 检出的要求,针对用户输入的 tags ,遍历图库时,只有 完全包含 用户输入的所有 tags 的图片才应被检出,也即用户输入 tags 应是检出图片真实 tag 的子集,理论上由于判断标准完全固定,搜索 API 采用相同逻辑, 召回率测试结果理论为 "1" 。

测试结果

width height duration tags total hit valid hit recall
[0, 400] [0, 400] [1, 2] - 1539 1539 1539 1.00
[300, 1000] [300, 1000] [0, 2] - 1429 1429 1429 1.00
- - - ['dog', 'pet'] 4 4 4 1.00