L-SWA 算法:语义扩张映射与多维加权模型技术
最近更新日期:2026-02-02 00:12:15
1. 算法导论 (Introduction)
L-SWA (Lightweight Semantic Weighted Algorithm) 是一种基于稀疏特征向量模拟的轻量级检索方案。其核心逻辑在于通过词簇扩张(Query Expansion)解决字面匹配的局限性,并利用多维度启发式评分函数(Heuristic Scoring)实现结果重排。
2. 语义扩张映射逻辑 (Query Expansion)
2.1 权值衰减数学模型
算法通过构建搜索意图字典 queryExpandMap 将单一搜索词转换为加权词簇。 定义原词为 ,其近义词集合为 ,则对应权值 分配如下:
- (衰减系数):默认取值为
0.8。该系数确保了语义关联的召回能力,同时在排序上给予精确匹配更高的置信度。
2.2 冲突处理策略
在多词输入场景下,若某个近义词同时指向多个原词,算法采用 Max-Priority 原则,即仅保留最高的权重分量,防止因词义重叠导致的得分虚高。
3. 多维评分函数 (Scoring Mechanism)
检索评分由**强特征(Triggers)与弱特征(Content)**线性加权而成:
3.1 强特征维度:Triggers
- 权重 :固定值为
15.0。 - 定义:代表元数据(Metadata)或人工标记。
- 逻辑:标签匹配被视为最高优先级意图。即使内容相关性较低,只要标签命中了搜索意图,该条目也会获得显著的排名提升。
3.2 弱特征维度:Content
- 特征降维:通过 Jieba 的 TF-IDF 提取算法,将长文本转化为 的特征向量。
- 动态权值: 反映了该词在当前文本块中的信息熵贡献,结合 系数实现细粒度的相关性拟合。
4. 开发者调优指南 (Tuning Parameters)
| 参数变量 | 类型 | 默认值 | 工程建议 |
|---|---|---|---|
Synonym_Alpha | double | 0.8 | 提高至 0.9 可增强模糊搜索感;降低至 0.5 可增强精确度。 |
Trigger_Weight | double | 15.0 | 若系统依赖标签分类,建议调高此值以实现“强过滤”效果。 |
TopK_Features | int | 20 | 长文本建议设为 50;短句记忆建议设为 5-10。 |
StringComparison | Enum | OrdinalIgnoreCase | 默认忽略大小写。代码检索场景建议设为 Ordinal。 |
5. 核心方法实现 (Code Implementation)
csharp
public static List<tb_db_MemoryPalace_Content> GetFilteredMemory(
List<tb_db_MemoryPalace_Content> allContents,
List<string> userKeywords,
int topN)
{
// 1. 预处理:构建意图映射字典 (O(M) 复杂度,M为关键词及其近义词总数)
var queryExpandMap = BuildQueryIntentMap(userKeywords);
// 2. 遍历打分 (O(N * K) 复杂度,N为数据总量,K为特征提取数)
var scoredList = allContents.Select(item =>
{
double score = 0;
// 强特征匹配 (Triggers)
if (item.triggers != null)
{
foreach (var trig in item.triggers)
if (queryExpandMap.TryGetValue(trig, out double scale))
score += 15.0 * scale;
}
// 弱特征匹配 (Content TF-IDF)
if (!string.IsNullOrEmpty(item.content))
{
var contentTags = Utils_SegmentText.ExtractKeywordsWithWeight(item.content, 20);
foreach (var tag in contentTags)
if (queryExpandMap.TryGetValue(tag.Word, out double scale))
score += tag.Weight * scale;
}
return new { Data = item, Score = score };
}).ToList();
// 3. 结果重排与保底策略
return [.. scoredList
.OrderByDescending(x => x.Score)
.ThenByDescending(x => x.Data.weight)
.Take(topN)
.Select(x => x.Data)];
}6. 工程边界与约束 (Constraints)
- 无序性敏感度:算法基于词袋模型(Bag of Words),无法识别词序逻辑(如“苹果吃我”与“我吃苹果”得分一致)。
- 词库依赖:检索质量高度依赖 syno_from_cwn.txt 的覆盖率。
- 计算性能:在单机 级数据量下性能表现优异。若数据量突破 ,建议引入前置的 倒排索引(Inverted Index) 进行初筛。