基于TfidfVectorizer计算句子与目标词的距离方法咨询
实现方法与替代方案
核心前提说明
TF-IDF向量是基于词频的稀疏特征,无法直接计算语义层面的词距离,必须借助预训练词嵌入模型(如Word2Vec、GloVe)或预训练语言模型(如BERT)来获取词/句子的语义向量,再计算距离。
方案一:按你的需求——取句子中与"king"最接近的5个词的距离平均值
步骤与代码实现
- 加载预训练词向量(以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'的向量,请更换词源")
- 复用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
相关产品推荐
相关产品推荐

