如何用Python实现关键词与文本匹配并按相关性排序?
关键词与小说文本匹配排序实现方案
核心思路:基于词向量的文本相关性计算
你考虑的向量匹配方案完全可行,核心逻辑是把关键词和文本片段都转换成数值向量,通过计算向量间的余弦相似度衡量相关性,最终按相似度高低排序输出。下面是用Python实现的完整方案,依赖主流NLP工具包,对新手友好。
具体实现步骤
1. 安装依赖库
先在终端执行以下命令安装所需工具:
pip install numpy scikit-learn sentence-transformers
sentence-transformers:生成高质量的文本/关键词向量,无需自己训练模型scikit-learn:快速计算余弦相似度numpy:支持向量运算
2. 完整代码实现
from sentence_transformers import SentenceTransformer from sklearn.metrics.pairwise import cosine_similarity # 加载轻量预训练向量模型(平衡速度与效果) model = SentenceTransformer('all-MiniLM-L6-v2') # 准备小说文本片段数据,格式为(文本内容, 作者+书名) novel_quotes = [ ("It's so hard to forget pain, but it's even harder to remember sweetness. We have no scar to show for happiness. We learn so little from peace.", "Chuck Palahniuk, Diary"), ("The marks humans leave are too often scars.", "John Green, The Fault in Our Stars"), ("Pain is inevitable. Suffering is optional.", "Haruki Murakami, What I Talk About When I Talk About Running"), ("Scars are just stories written on your skin.", "Unknown") ] # 定义目标关键词 keywords = ["pain", "scar"] # 将关键词拼接成句子,适配模型的输入要求 keyword_text = " ".join(keywords) # 生成关键词与所有文本片段的向量 keyword_vector = model.encode([keyword_text]) quote_vectors = model.encode([item[0] for item in novel_quotes]) # 计算每个文本与关键词的相似度 similarities = cosine_similarity(keyword_vector, quote_vectors)[0] # 按相似度从高到低排序 sorted_results = sorted(zip(similarities, novel_quotes), key=lambda x: -x[0]) # 格式化输出排名结果 for rank, (sim, (quote, author)) in enumerate(sorted_results, start=1): print(f"排名第{rank}:") print(f'"{quote}"') print(f"― {author}\n")
关键细节说明
- 模型选择:
all-MiniLM-L6-v2是轻量级模型,运行速度快,适合入门;若追求更高精度,可替换为all-mpnet-base-v2,但计算耗时会增加。 - 相似度逻辑:余弦相似度取值范围为0-1,数值越接近1,说明文本与关键词的相关性越高。
- 文本预处理:如果原始文本存在冗余空格、特殊字符,可先用
strip()或正则表达式做简单清洗,不影响向量生成但能优化输出整洁度。
扩展优化方向
- 关键词加权:若部分关键词优先级更高,可对对应向量赋予权重后再计算相似度。
- 大文本分割:处理长篇小说时,可先按段落、章节分割成小片段,再执行匹配排序。
- 停用词过滤:可提前过滤"the""and"这类无意义停用词,减少对相关性计算的干扰。
内容的提问来源于stack exchange,提问作者Gene
相关产品推荐
相关产品推荐

