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

如何为DataFrame文本列计算与指定单词的语义相似度得分

如何为DataFrame文本列计算与指定单词的语义相似度得分

嗨,根据你的需求,我推荐用Sentence-BERT来解决这个问题——它是专门优化过的BERT变体,特别适合计算文本片段之间的语义相似度,而且输出的得分很容易归一化到0-1的范围。下面是具体的实现步骤和代码示例:

方法一:用Sentence-BERT(推荐,语义理解更精准)

Sentence-BERT会把整个文本和目标单词转换成语义嵌入向量,再通过余弦相似度计算关联度,最后可以把得分映射到0-1区间,完全符合你的需求。

步骤1:安装依赖库

首先需要安装处理模型和数据的工具包:

pip install sentence-transformers pandas

步骤2:完整代码实现

import pandas as pd
from sentence_transformers import SentenceTransformer, util

# 加载轻量高效的预训练模型,适合处理1000行数据
model = SentenceTransformer('all-MiniLM-L6-v2')

# 模拟你的DataFrame(替换成你自己的真实数据)
df = pd.DataFrame({
    'text': ["i want to eat", "i need to clean my room", "i love hiking mountains"]
})

# 定义你要计算的目标单词列表(替换成你的5个单词)
target_words = ["food", "house", "nature"]

# 定义计算单条文本相似度的函数
def get_similarity_scores(text):
    # 把文本和目标单词转换成语义向量
    text_embedding = model.encode(text, convert_to_tensor=True)
    word_embeddings = model.encode(target_words, convert_to_tensor=True)
    
    # 计算余弦相似度(原始范围是[-1,1])
    cosine_scores = util.cos_sim(text_embedding, word_embeddings)[0].tolist()
    
    # 把得分转换到0-1的区间
    normalized_scores = [(score + 1) / 2 for score in cosine_scores]
    
    # 返回和目标单词对应的得分字典
    return dict(zip(target_words, normalized_scores))

# 把函数应用到整个text列,拆分结果为新列
similarity_results = df['text'].apply(get_similarity_scores)
df = pd.concat([df, pd.DataFrame(similarity_results.tolist())], axis=1)

# 查看结果
print(df)

运行这段代码后,你会看到像i want to eat这样的文本,food列的得分会远高于house和nature,完全符合你举的例子预期。

方法二:用spaCy(适合快速实现)

如果你想要更轻量的实现,也可以用spaCy的预训练词向量模型,它直接返回0-1之间的相似度得分:

步骤1:安装并下载模型

pip install spacy
python -m spacy download en_core_web_md

步骤2:代码实现

import pandas as pd
import spacy

# 加载spaCy的中等规模预训练模型
nlp = spacy.load("en_core_web_md")

# 同样用之前的示例DataFrame
df = pd.DataFrame({
    'text': ["i want to eat", "i need to clean my room", "i love hiking mountains"]
})
target_words = ["food", "house", "nature"]

def get_spacy_similarity(text):
    text_doc = nlp(text)
    scores = []
    for word in target_words:
        word_doc = nlp(word)
        # spaCy直接返回0-1的相似度得分
        scores.append(text_doc.similarity(word_doc))
    return dict(zip(target_words, scores))

# 应用函数并生成新列
similarity_results = df['text'].apply(get_spacy_similarity)
df = pd.concat([df, pd.DataFrame(similarity_results.tolist())], axis=1)

print(df)

一些实用提示

  • 如果你处理的是中文文本,可以替换对应的模型:Sentence-BERT用uer/sbert-base-chinese-nli,spaCy用zh_core_web_md。
  • 1000行数据用这两个方法都很快,哪怕没有GPU也能轻松处理。
  • 如果你想要更精准的结果,可以试试Sentence-BERT的大模型all-mpnet-base-v2,但速度会稍慢一点。

备注:内容来源于stack exchange,提问作者rafine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 18:29:34