如何用语义相似度为文本分配5个关键词的代表性得分

老强吖_6730

老强吖_6730

2026-08-18

588人浏览

原创

如何用语义相似度为文本分配5个关键词的代表性得分

本文介绍如何利用预训练句子嵌入模型(如sentence transformers)计算每条文本与指定5个关键词之间的语义相似度,并将0–1范围内的相似分批量注入dataframe新列,实现高效、可解释的关键词代表性量化。

本文介绍如何利用预训练句子嵌入模型(如sentence transformers)计算每条文本与指定5个关键词之间的语义相似度,并将0–1范围内的相似分批量注入dataframe新列,实现高效、可解释的关键词代表性量化。

在自然语言处理任务中,常需评估若干关键词对一段文本的“语义代表性”——即该词是否在语义空间中贴近文本整体含义,而非简单依赖词频或共现。例如,文本 "I want to eat" 与词 food 的语义关联远强于 house,这种关系无法通过传统关键词匹配捕获,而需基于上下文感知的向量表示进行建模。

推荐使用 sentence-transformers 库中的轻量级预训练模型(如 all-MiniLM-L6-v2),它能将文本和单词统一映射到同一高维语义空间,再通过余弦相似度量化语义距离(值域 [0, 1],越接近1表示语义越相近)。

以下是一个完整、可复用的实现方案:

import pandas as pd
from sentence_transformers import SentenceTransformer, util

class SemanticSimilarityCalculator:
    def __init__(self, model_name: str = 'all-MiniLM-L6-v2') -> None:
        self.model = SentenceTransformer(model_name)
        self.word_embeddings = None
        self.words = None

    def encode_words(self, words: list[str]) -> None:
        """预先编码关键词,提升后续批量计算效率"""
        self.word_embeddings = self.model.encode(words, convert_to_tensor=True)
        self.words = words

    def calculate_similarity(self, text: str) -> list[float]:
        if self.word_embeddings is None:
            raise ValueError("请先调用 encode_words() 编码关键词")
        text_embedding = self.model.encode(text, convert_to_tensor=True)
        # 计算文本向量与所有词向量的余弦相似度
        similarities = util.cos_sim(text_embedding, self.word_embeddings)[0].tolist()
        return similarities

    def add_similarity_scores_to_df(
        self, df: pd.DataFrame, text_column: str, prefix: str = "word_"
    ) -> pd.DataFrame:
        if self.words is None:
            raise ValueError("请先调用 encode_words() 编码关键词")
        # 生成列名:如 word_food、word_house
        score_columns = [f"{prefix}{word}" for word in self.words]
        # 批量应用相似度计算,返回多列
        df[score_columns] = df[text_column].apply(
            lambda x: pd.Series(self.calculate_similarity(x))
        )
        return df

# ✅ 使用示例
if __name__ == "__main__":
    # 构造示例数据
    df = pd.DataFrame({
        "text": ["I want to eat", "The house is big", "I need to sleep"]
    })
    target_words = ["food", "house", "sleep", "drink", "run"]

    # 初始化计算器并编码关键词
    calc = SemanticSimilarityCalculator()
    calc.encode_words(target_words)

    # 注入相似度得分(自动创建 word_food, word_house 等列)
    df_result = calc.add_similarity_scores_to_df(df, text_column="text")
    print(df_result.round(4))

输出示例:

               text  word_food  word_house  word_sleep  word_drink  word_run
0     I want to eat     0.5924      0.2150      0.2541      0.3703    0.2594
1  The house is big     0.2433      0.6721      0.1708      0.2138    0.1197
2   I need to sleep     0.2537      0.2225      0.7251      0.3584    0.3038

关键优势与注意事项:

  • 语义驱动:模型理解“eat”与“food”的深层关联,而非仅匹配字面;
  • 高效批量:关键词仅编码一次,后续文本逐行推理,适合千级规模数据;
  • 可扩展性强:支持任意数量关键词,列名前缀 prefix 可自定义(如 "score_");
  • 模型选择建议all-MiniLM-L6-v2 平衡速度与精度;若需更高精度,可换用 all-mpnet-base-v2(稍慢但更准);
  • 注意歧义词:如 “apple” 在科技/水果语境下语义不同,本方法默认取通用嵌入;如需领域适配,建议微调模型或使用领域专用模型。

该方法已广泛应用于内容标签打分、搜索相关性排序、智能问卷分析等场景,是构建可解释语义评分系统的可靠基础。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1531

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3564

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1549

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

20317

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2527

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2587

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1063

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

576

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2003

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133万人学习