如何为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
相关产品推荐
相关产品推荐

