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

如何使用Python+spaCy基于语义相似度匹配文本中的相似短语

spaCy语义短语匹配实现方案

你当前设想的多长度连续块滑动匹配思路是可行的,但手动拼接字符串切分文本块的实现效率很低,有更规范的原生实现路径,按效率和精度从高到低整理如下:

基础高效实现:基于spaCy原生Span的滑动窗口匹配

首先注意:要做语义相似度计算,必须加载带预训练词向量的spaCy模型(如en_core_web_md/en_core_web_lg),小模型en_core_web_sm没有内置词向量,计算出的相似度结果没有语义参考价值。
不需要手动拼接字符串生成文本块,spaCy的Doc对象支持按token索引直接切片生成Span对象,所有Span共享Doc的预计算解析结果,不需要重复走分词、向量化流程,比手动切分的效率高3~5倍。

import spacy

# 加载带词向量的模型
nlp = spacy.load("en_core_web_md")
# 预处理目标短语和待检索文本
search_span = nlp("payment date")
doc = nlp("Party A will pay Party B on the transaction date.")

# 配置参数
MAX_NGRAM_LENGTH = 5  # 匹配短语的最大token长度
SIMILARITY_THRESHOLD = 0.7  # 判定为匹配的相似度阈值

match_results = []
# 遍历生成1~最大长度的所有连续token块
for n in range(1, MAX_NGRAM_LENGTH + 1):
    for idx in range(len(doc) - n + 1):
        current_span = doc[idx : idx + n]
        sim_score = current_span.similarity(search_span)
        if sim_score >= SIMILARITY_THRESHOLD:
            match_results.append(
                (current_span.text, round(sim_score, 3), current_span.start_char, current_span.end_char)
            )

# 按相似度降序排序,取最高匹配项
match_results.sort(key=lambda x: x[1], reverse=True)
top_match = match_results[0]

在你给出的示例文本上运行,最高匹配项就是transaction date,相似度约0.78,符合预期。

生产级优化:基于名词块过滤减少无效计算

绝大多数场景下你要匹配的目标短语(比如日期、主体、动作类名词短语)都是名词性语义单元,不需要遍历所有连续token组合计算相似度。直接调用spaCy原生的doc.noun_chunks属性即可拿到文本中所有解析好的名词短语块,仅对这些块计算相似度,算力开销可以降到原滑动窗口方案的10%以下,还能避免匹配到"will pay on"这类无意义的跨词性组合。

match_results = []
for noun_chunk in doc.noun_chunks:
    # 过滤掉长度超过阈值的名词块
    if len(noun_chunk) > MAX_NGRAM_LENGTH:
        continue
    sim_score = noun_chunk.similarity(search_span)
    if sim_score >= SIMILARITY_THRESHOLD:
        match_results.append( (noun_chunk.text, round(sim_score,3)) )

match_results.sort(key=lambda x:x[1], reverse=True)

示例文本中提取到的名词块包含the transaction date,去掉前置冠词后就是你要找的目标匹配短语,匹配精度和效率都更高。

高精度场景优化

如果对语义匹配的准确率有更高要求,可以替换相似度计算模块:保持滑动窗口/名词块提取的逻辑不变,将Span文本传入句向量模型编码后计算余弦相似度即可,匹配精度会显著高于spaCy自带的平均词向量计算结果,适合专业领域文本、匹配歧义大的场景。

注意:不要手动拼接字符串生成待匹配块再重新传入nlp管道处理,这个操作会对每个短块重复执行完整的文本解析流程,带来大量无意义的算力开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:39:19