Skip to content

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 将单一搜索词转换为加权词簇。 定义原词为 w0w_0,其近义词集合为 {s1,s2,...,sn}\{s_1, s_2, ..., s_n\},则对应权值 WW 分配如下:

W(w0)=1.0W(w_0) = 1.0

W(si)=α,(0<α<1.0)W(s_i) = \alpha, \quad (0 < \alpha < 1.0)

  • α\alpha (衰减系数):默认取值为 0.8。该系数确保了语义关联的召回能力,同时在排序上给予精确匹配更高的置信度。

2.2 冲突处理策略

在多词输入场景下,若某个近义词同时指向多个原词,算法采用 Max-Priority 原则,即仅保留最高的权重分量,防止因词义重叠导致的得分虚高。

3. 多维评分函数 (Scoring Mechanism)

检索评分由**强特征(Triggers)弱特征(Content)**线性加权而成:

Stotal=i=1n(Ti×WT×αi)+j=1m(Cj×Wtfidf×αj)S_{total} = \sum_{i=1}^{n} (T_i \times W_T \times \alpha_i) + \sum_{j=1}^{m} (C_j \times W_{tfidf} \times \alpha_j)

3.1 强特征维度:Triggers

  • 权重 WTW_T:固定值为 15.0
  • 定义:代表元数据(Metadata)或人工标记。
  • 逻辑:标签匹配被视为最高优先级意图。即使内容相关性较低,只要标签命中了搜索意图,该条目也会获得显著的排名提升。

3.2 弱特征维度:Content

  • 特征降维:通过 Jieba 的 TF-IDF 提取算法,将长文本转化为 K=20K=20 的特征向量。
  • 动态权值WtfidfW_{tfidf} 反映了该词在当前文本块中的信息熵贡献,结合 α\alpha 系数实现细粒度的相关性拟合。

4. 开发者调优指南 (Tuning Parameters)

参数变量类型默认值工程建议
Synonym_Alphadouble0.8提高至 0.9 可增强模糊搜索感;降低至 0.5 可增强精确度。
Trigger_Weightdouble15.0若系统依赖标签分类,建议调高此值以实现“强过滤”效果。
TopK_Featuresint20长文本建议设为 50;短句记忆建议设为 5-10
StringComparisonEnumOrdinalIgnoreCase默认忽略大小写。代码检索场景建议设为 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)

  1. 无序性敏感度:算法基于词袋模型(Bag of Words),无法识别词序逻辑(如“苹果吃我”与“我吃苹果”得分一致)。
  2. 词库依赖:检索质量高度依赖 syno_from_cwn.txt 的覆盖率。
  3. 计算性能:在单机 10510^5 级数据量下性能表现优异。若数据量突破 10610^6,建议引入前置的 倒排索引(Inverted Index) 进行初筛。