基于Python NLP的句子特定关键词提取咨询 含400万词库场景
算法逻辑
整体分三个核心环节:
- 数据预处理:加载百万行CSV文件,抽取四个字段(默认约定为
style_no/style_name/color_no/color_name,可根据实际字段名调整)的所有值,分别构建属性值到完整行数据的映射关系,避免匹配后反复检索CSV。 - 匹配器构建:使用Spacy的
PhraseMatcher构建多模式匹配规则,将四类属性的所有值分别注册为对应标签的匹配模式,PhraseMatcher针对大批量固定短语匹配做了性能优化,完全适配百万级数据的匹配需求。 - 匹配与结果输出:对输入文本做分词后运行匹配器,提取所有命中的属性,基于命中属性关联到对应的完整行数据,输出所有匹配到的字段内容,支持2-3个属性命中的场景。
实现步骤与可运行代码
首先安装所需依赖:
pip install spacy pandas python -m spacy download en_core_web_sm
完整可运行代码:
import spacy import pandas as pd from spacy.matcher import PhraseMatcher # 加载Spacy预训练模型 nlp = spacy.load("en_core_web_sm") # 1. 加载并预处理CSV数据,可根据实际情况修改字段名 df = pd.read_csv("your_data.csv", dtype=str) # 已确认行唯一可省略去重步骤 df = df.drop_duplicates() # 2. 构建映射关系与匹配规则 matcher = PhraseMatcher(nlp.vocab, attr="LOWER") # 开启大小写不敏感匹配 attr_types = ["style_no", "style_name", "color_no", "color_name"] value_to_row = {} for attr in attr_types: # 提取当前属性非空唯一值 values = df[attr].dropna().unique().tolist() # 生成匹配模式 patterns = [nlp.make_doc(val) for val in values] matcher.add(attr, patterns) # 构建属性值到完整行的映射 for val in values: row = df[df[attr] == val].iloc[0].to_dict() value_to_row[(attr, val.lower())] = row # 3. 匹配函数 def match_attributes(input_text): doc = nlp(input_text) matches = matcher(doc) hit_rows = set() result = [] for match_id, start, end in matches: attr_type = nlp.vocab.strings[match_id] match_val = doc[start:end].text.lower() row = value_to_row.get((attr_type, match_val)) # 去重避免同一行重复返回 if row and tuple(row.items()) not in hit_rows: hit_rows.add(tuple(row.items())) result.append(row) return result # 测试示例 test_input = "BLA BLA ABC44, FUNNY CAT TEST COLOR BE SAFE, STAY HOME" matches = match_attributes(test_input) for item in matches: print(f"Style_no: {item['style_no']}, Style_name: {item['style_name']}, Color_no: {item['color_no']}, Color_name: {item['color_name']}")
优化建议
- 首次运行可以用
pickle将预处理好的matcher和value_to_row序列化存储到本地,后续启动直接加载,无需重复处理百万行数据,大幅降低启动耗时。 - 若存在属性值重叠的情况,可调整
PhraseMatcher的匹配优先级,给长度更长的属性值更高权重,避免短值优先匹配导致的错误。 - 有模糊匹配需求时,可在精确匹配无结果的场景下,补充使用Spacy词向量计算输入片段与属性值的余弦相似度,取高于阈值的结果作为候选,适配拼写错误、表述差异的场景。
- 相关进阶学习可直接参考Spacy官方内置的文档与示例,覆盖匹配器全量用法。
内容的提问来源于stack exchange,提问作者ashish zarekar
相关产品推荐
相关产品推荐

