Danbooru模糊查找
Danbooru 模糊查找
本项目提供一种模糊查找 Danbooru 标签的方法。用户可以凭借模糊的语言描述,查找 Danbooru 数据集中对应的标签。
目前,仅支持使用汉语和英语进行查找。
⚠查找结果中可能包含NSFW内容。
🔗项目链接:https://huggingface.co/spaces/SAkizuki/DanbooruSearch

使用说明
本程序有三个查找参数:
top_k:每个词取前top_k个相关的标签。结果上限:对于整个查找,展示综合得分的前N名热度权重:0~1,这个数值越高,标签频数在综合得分中的权重越大。推荐设为0.15
设置完查找参数后,用户可以在「画面描述」中输入汉语或英语的词语或自然语言,点击「开始搜索」后,程序将进行查找。
工作模式
完整画面查找
你可以输入对画面的完整描述,程序将生成匹配的danbooru标签集。
示例输入
1 | |
建议参数
top_k:较小,例如5结果上限:一般的SDXL系生图模型支持70-80个标签,设为80热度权重:0.15
示例输出
1 | |
同时,程序输出一份详细的查询结果表格,用户也可以在表格中选择合适的标签
关键词精准查找
你或许对某个词有模糊的印象,但不知道它对应的danbooru标签具体是什么。此时,你可以使用此程序精确查找。
示例输入
1 | |
建议参数
top_k:较小,例如5结果上限:较小,例如10热度权重:0.15
示例输出
1 | |
概念模糊查找
你可能像搜索关于某一个概念的关键词。此时,你可以使用此程序进行概念模糊查找。
示例输入
1 | |
建议参数
top_k:较大,例如40结果上限:较大,例如80热度权重:0.15
示例输出
1 | |
技术说明
本项目实现了一个基于 Web 的语义检索工具。它解决了传统基于关键词匹配在检索绘画标签时,难以处理模糊描述、同义词或自然语言描述的痛点。系统利用预训练的向量模型将用户输入的自然语言描述映射到高维向量空间,并与预先构建的标签向量库进行相似度匹配,最终结合标签热度进行混合排序推荐。
系统在首次启动或缓存缺失时,执行以下 ETL 流程:
- 数据清洗:
- 读取标签列表,处理字符编码(UTF-8/GBK)。这是一个保存Danbooru的所有标签的表格文件,其中必须有
name(标签名)、cn_name(标签中文含义)、post_count(标签频数)三个字段 - 对
post_count进行对数变换,计算max_log_count,用于归一化处理,实现热度加权搜索的同时,防止热门标签权重过大淹没语义相关性。
- 读取标签列表,处理字符编码(UTF-8/GBK)。这是一个保存Danbooru的所有标签的表格文件,其中必须有
- 双语向量化 (Dual-Embedding):
- 利用
SentenceTransformer(BAAI/bge-m3模型) 分别对 中文含义 (cn_name) 和 英文标签名 (name) 进行 Embedding 编码。 - 生成两个独立的向量矩阵:
emb_cn(中文向量库) 和emb_en(英文向量库)。
- 利用
- 分词优化:
- 提取所有中文标签名,生成自定义词典,供
jieba分词器加载,确保专业术语被正确切分。
- 提取所有中文标签名,生成自定义词典,供
- 序列化缓存:
- 将 DataFrame、向量矩阵、统计元数据打包为
danbooru_vectors_dual.pkl,大幅缩短后续启动时间。
- 将 DataFrame、向量矩阵、统计元数据打包为
检索过程采用 语义相似度 + 热度加权 的混合策略:
查询预处理:
- 使用
jieba对用户输入进行分词。 - 去除无含义的停用词,保留关键词。
- 构建查询列表:
[原始完整查询句, 关键词1, 关键词2, ...]。
- 使用
向量检索:
- 将查询列表转换为向量。
- 并行计算查询向量与
emb_cn和emb_en的余弦相似度。 - 获取 前K 个候选项。
混合重排序
根据评分公式:
\[ FinalScore = Score_{semantic} \times (1 - w) + Score_{popularity} \times w \]
- \(Score_{semantic}\): 向量余弦相似度。
- \(Score_{popularity}\): 归一化后的热度分数 (\(\frac{\ln(1+count)}{max\_log\_count}\))。
- \(w\): 用户可调节的热度权重参数。
去重与过滤:
- 合并中英文检索结果,去除重复标签。
- 应用阈值过滤。
- 截断结果列表。
本站的运行成本约为每个月5元人民币,如果您觉得本站有用,欢迎打赏,或者给本博客的GitHub项目点一颗星

