基于15k+食材字符串构建加权图实现相似食谱检索的算法咨询
食谱食材相似性检索的加权图构建与检索方案
一、先搞定食材标准化预处理
原始食材字符串格式杂乱,第一步必须把每个食材拆解并提取核心实体,才能区分易混淆食材、合并同食材的不同处理版本:
- 剥离冗余信息:用正则去掉括号内的处理描述(比如把
(diced)、(peeled and sliced)这类内容删除),剥离数量和单位(匹配数字、分数、cup/stalks/kg/ml等单位,只保留食材本身) - 核心实体归一:将同食材的不同表述统一,比如
small-medium onion和onion都归一为onion;精准区分易混淆食材,比如boneless chicken thighs归为boneless chicken thigh,chicken stock归为chicken stock,避免鸡肉和鸡汤被误判为同一类 - 同义词统一:如果有食材的不同叫法(比如
celery stalks和celery),手动维护同义词表或用预训练词向量做同义词映射
二、构建加权食谱关联图
以每个食谱作为图的节点,节点间的边权重代表两个食谱的食材相似程度,权重计算要兼顾食材的稀有性:
- 计算食材的逆食谱频率(IRF):
IRF = log(总食谱数 / 包含该食材的食谱数),稀有食材(比如松露)IRF值高,常见食材(比如洋葱、大蒜)IRF值低 - 计算两个食谱的加权相似度:取两者共同食材的IRF之和,除以两个食谱所有食材的IRF总和,结果作为边的权重(值越高,食材相似度越高)
三、适合的检索算法
1. 基于图遍历的精准检索
- 加权优先队列遍历:从目标食谱节点出发,用优先队列按边权重从高到低遍历邻接节点,返回Top N相似度最高的食谱。适合需要精确结果的场景,但15k节点规模下,遍历效率一般,适合小规模检索。
2. 近似最近邻(ANN)算法(推荐大规模场景)
- 局部敏感哈希(LSH):把每个食谱转化为食材TF-IDF向量,通过哈希函数将相似向量映射到同一哈希桶,快速召回候选食谱后,再计算精确相似度排序。实现简单,召回效率高。
- HNSW(分层导航小世界):构建多层稀疏图,通过逐层筛选快速定位近似最近邻节点,检索速度极快,适合15k+规模的食谱库,能支持实时检索需求。
3. 嵌入向量检索
- 食谱嵌入模型:把食材当作“词”,食谱当作“句子”,用FastText或BERT类模型训练食谱的低维嵌入向量,向量间的余弦相似度即为食谱的食材相似度。这种方法能自动捕捉食材的关联规律(比如土豆和胡萝卜常一起出现,对应的食谱向量会更相似),检索时直接用向量相似度排序即可。
四、优化细节
- 食材实体精准识别:如果遇到歧义食材(比如
chicken可能指整鸡或鸡肉块),可以用微调后的NER模型专门识别食材实体,提升核心食材提取的准确率 - 动态维护图结构:新增食谱时,实时计算它与现有食谱的相似度,更新图的节点和边;定期重新计算IRF值,保证权重的时效性
- 过滤低权重边:设置相似度阈值,只保留权重高于阈值的边,减少图的复杂度,提升检索速度
内容的提问来源于stack exchange,提问作者Omar Alhussani
相关产品推荐
相关产品推荐

