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
相关产品推荐
相关产品推荐

