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

基于TfidfVectorizer计算句子与目标词的距离方法咨询

实现方法与替代方案

核心前提说明

TF-IDF向量是基于词频的稀疏特征,无法直接计算语义层面的词距离,必须借助预训练词嵌入模型(如Word2Vec、GloVe)或预训练语言模型(如BERT)来获取词/句子的语义向量,再计算距离。


方案一:按你的需求——取句子中与"king"最接近的5个词的距离平均值

步骤与代码实现

  1. 加载预训练词向量(以GloVe为例)
import numpy as np
from sklearn.metrics.pairwise import cosine_distances
from sklearn.feature_extraction.text import TfidfVectorizer

# 加载GloVe词向量(替换为你的词向量文件路径)
word_vectors = {}
with open('glove.6B.100d.txt', encoding='utf-8') as f:
    for line in f:
        values = line.split()
        word = values[0]
        vec = np.asarray(values[1:], dtype='float32')
        word_vectors[word] = vec

# 获取目标词"king"的向量,若不存在则抛出异常
king_vec = word_vectors.get('king')
if not king_vec:
    raise ValueError("当前词向量库中无'king'的向量,请更换词源")
  1. 复用TF-IDF的分词逻辑处理句子
# 这里用你之前初始化的TfidfVectorizer实例,保证分词规则一致
# 假设你之前的TF-IDF初始化是:tfidf = TfidfVectorizer(...)
tokenizer = tfidf.build_tokenizer()

def compute_king_avg_distance(text):
    # 分词并过滤掉词向量库中不存在的词
    tokens = tokenizer(text)
    valid_tokens = [t for t in tokens if t in word_vectors]
    
    if not valid_tokens:
        return np.nan  # 无有效词时返回空值
    
    # 计算每个有效词与"king"的余弦距离(值越小越相似)
    token_vecs = np.array([word_vectors[t] for t in valid_tokens])
    distances = cosine_distances(token_vecs, king_vec.reshape(1, -1)).flatten()
    
    # 取最接近的5个词的距离平均值(不足5个则取全部)
    top5_dist = np.sort(distances)[:min(5, len(distances))]
    return top5_dist.mean()

# 新增df['king']字段
df['king'] = df['text'].apply(compute_king_avg_distance)

方案二:直接计算句子与"king"的语义相似度(更贴合整体语义)

如果不需要拆分到单个词,而是直接衡量整个句子和"king"的语义关联度,可以用BERT这类预训练语言模型生成句子嵌入后计算距离:

from transformers import BertTokenizer, BertModel
import torch
from sklearn.metrics.pairwise import cosine_distances

# 加载BERT模型与分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
model.eval()

# 生成"king"的句子嵌入
with torch.no_grad():
    king_input = tokenizer("king", return_tensors="pt", padding=True, truncation=True)
    king_output = model(**king_input)
    king_emb = king_output.last_hidden_state.mean(dim=1).numpy()

def compute_sentence_king_distance(text):
    with torch.no_grad():
        text_input = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
        text_output = model(**text_input)
        text_emb = text_output.last_hidden_state.mean(dim=1).numpy()
    
    # 计算余弦距离,值越小表示句子与"king"语义越接近
    return cosine_distances(text_emb, king_emb)[0][0]

df['king'] = df['text'].apply(compute_sentence_king_distance)

关键注意事项

  • 若处理中文文本,需替换为中文预训练词向量(如中文Word2Vec、GloVe)或中文BERT模型(如bert-base-chinese)
  • 分词规则必须统一,避免TF-IDF分词与词向量分词出现差异
  • 对于无有效词的句子,可根据业务需求选择填充全局平均值、0或保留空值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 21:43:09