You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python语义匹配项目中如何生成文本反标准化形式?

解决方案:从标准化文本生成名词的反标准化形式

核心需求是基于现有原始文本列与标准化文本列,构建标准化名词到所有原始(反标准化)变体的映射,以此提升搜索栏的检索覆盖度。以下是具体实现方案:

核心思路

利用已有文本对建立标准化名词→原始变体的关联映射,通过NLP工具提取名词、配对关联、优化过滤三个步骤完成,最终服务于搜索场景。

步骤1:提取文本中的名词

使用NLP工具精准提取文本中的名词,避免无效词汇干扰。以中文场景为例:

import spacy

# 加载中文模型,英文场景替换为en_core_web_sm
nlp = spacy.load("zh_core_web_sm")

def extract_nouns(text):
    doc = nlp(text)
    # 仅提取名词词性的词汇
    return [token.text for token in doc if token.pos_ == "NOUN"]

步骤2:构建标准化与原始词汇的映射

遍历数据集,将每行的标准化名词与对应原始文本中的名词做关联,用字典存储一对多的映射关系:

from collections import defaultdict

# 初始化映射容器,键为标准化名词,值为去重后的原始变体集合
norm_to_raw_map = defaultdict(set)

# 遍历数据集行(假设数据集为df)
for _, row in df.iterrows():
    raw_nouns = extract_nouns(row["原始文本列"])
    norm_nouns = extract_nouns(row["标准化文本列"])
    
    # 将当前行的原始名词与标准化名词做关联
    for norm_noun in norm_nouns:
        for raw_noun in raw_nouns:
            norm_to_raw_map[norm_noun].add(raw_noun)

# 转换为列表格式方便后续使用
norm_to_raw_map = {k: list(v) for k, v in norm_to_raw_map.items()}

步骤3:优化映射精准度(可选)

若原始与标准化名词的对应关系模糊,可加入语义相似度过滤,仅保留高相似度的配对:

from sentence_transformers import SentenceTransformer, util

# 加载轻量语义模型
model = SentenceTransformer("all-MiniLM-L6-v2")

def filter_similar_terms(norm_noun, raw_terms, threshold=0.7):
    # 生成词汇嵌入向量
    norm_emb = model.encode(norm_noun, convert_to_tensor=True)
    raw_embs = model.encode(raw_terms, convert_to_tensor=True)
    # 计算余弦相似度
    cos_scores = util.cos_sim(norm_emb, raw_embs)[0]
    # 返回相似度达标原始变体
    return [raw_terms[i] for i, score in enumerate(cos_scores) if score >= threshold]

# 更新映射表,过滤低相似度配对
for norm_noun, raw_terms in norm_to_raw_map.items():
    norm_to_raw_map[norm_noun] = filter_similar_terms(norm_noun, raw_terms)

步骤4:应用到搜索功能

用户输入搜索词后,先匹配标准化名词,再将所有关联的反标准化变体纳入检索范围:

def search_target_terms(query, norm_to_raw_map, df):
    # 假设已有标准化函数处理用户输入的查询词
    standardized_query = standardize_user_query(query)
    # 获取所有相关检索词(含标准化名词本身)
    related_terms = norm_to_raw_map.get(standardized_query, []) + [standardized_query]
    # 检索包含任一相关术语的行
    return df[df["原始文本列"].str.contains('|'.join(related_terms), case=False)]

注意事项

  • 中文场景建议结合jieba分词提升名词提取的准确性;英文场景可直接使用spaCy或nltk
  • 若数据集存在大量模糊对应关系,可标注少量样本训练简单的映射分类模型
  • 数据集更新后需重新生成映射表,保证变体覆盖的时效性

内容的提问来源于stack exchange,提问作者Lefloch Had

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:25:13