• 基于Java实现的图片搜索系统


    图片搜索实现

    一、BM25算法的实现

    BM25算法的实现较为简单,但是此处修改了simpleScorer的构造函数,传入了indexReader,以便获得doc中 abstractString的长度,具体实现见如下代码:

    assert doc != ‐1;
        try
        {
            Document currentDoc = reader.document(doc);
            String absStr = currentDoc.get("abstract");
            int docLen = absStr.length();
            float denominator = K1 * (1 ‐ b + b * (float)docLen / avgLength) + termDocs.freq();
            float numerator = (K1 + 1) * termDocs.freq();
            float tf = numerator / denominator;
            return tf * idf;
        }
        catch (IOException e)
        {
            System.out.println(e);
            return idf * this.termDocs.freq();
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    二、VSM模型与BM25的对比

    VSM模型则直接使用了lucene自带的term query 对爆笑这个词进行了搜索,VSM与BM25对比的结果如下: vsm:

    在这里插入图片描述

    bm25:

    在这里插入图片描述

    可见VSM中爆笑出现的频率更高,但是BM25中爆笑出现的频率并不一定是最高的,这与它们各自的计算方式相关。

    三、用html扩充语料库

    首先用python写了一个脚本将各个html中的title抽取出来,并处理了编码问题,随后生成了一个新的xml文件供

    ImageIndexer生成新的index,下面对比了是否扩充语料库的搜索结果:

    美女(扩充语料库)

    在这里插入图片描述

    美女(未扩充语料库)

    在这里插入图片描述

    可见扩充语料库后,搜索结果比扩充前更加丰富。

    四、查询词分词

    对查询词同样适用了IKAnalyzer进行分词,随后每个term都生成一个termQuery,并将termQuery add到

    BooleanQuery中,add的方式为occur.SHOULD。这样即使当搜索词与索引不是完美匹配时,也可以利用分词有一个较好的搜索结果。下面给出一个对比:

    分词前

    在这里插入图片描述

    分词后

    在这里插入图片描述

    可见一些分词前无法搜到的图片在分词后可以搜到一些折中的结果。

  • 相关阅读:
    Spring Boot官方推荐的Docker镜像编译方式-分层jar包
    Java代码审计sql注入基础
    温故 Spring5 特性
    java(通过反射操作对象)
    外汇天眼:加拿大8月通胀率放缓幅度大于预期!加拿大10月份大幅加息可能性变小
    [Machine Learning] 稀疏编码和矩阵分解
    Vite的安装与使用
    redis实现点赞功能。
    外包干了五年,废了...
    Unity IL2CPP 游戏分析入门
  • 原文地址:https://blog.csdn.net/newlw/article/details/126815294