Python实现语境下两词余弦相似度计算与笛卡尔坐标可视化
词对余弦相似度实现方案
你当前代码生成的trsfm是文档-词TF-IDF矩阵,形状为(文档数量, 词表大小),行对应单条推文,列对应词表中的单个词,因此直接调用cosine_similarity得到的是文档之间的相似度。
要计算词之间的语境相似度,只需要对该矩阵做转置,得到词-文档矩阵——此时每一行对应一个词的特征向量,向量值是该词在所有推文中的TF-IDF权重分布,对这个转置矩阵计算余弦相似度,就能得到词两两之间的相似度结果。
修正后的可运行代码如下:
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity import pandas as pd corpus = dataset # 你的推文语料列表 # 初始化向量器时建议加英文停用词过滤,减少无意义词干扰 vectorizer = TfidfVectorizer(stop_words='english') doc_word_matrix = vectorizer.fit_transform(corpus) # 转置得到词-文档矩阵 word_doc_matrix = doc_word_matrix.T # 计算所有词两两的余弦相似度 word_sim_matrix = cosine_similarity(word_doc_matrix) # 构建词到索引的映射,方便快速查询 vocab = vectorizer.get_feature_names_out() # 旧版sklearn替换为get_feature_names() word2idx = {word: idx for idx, word in enumerate(vocab)} # 计算指定词对的相似度 target_pairs = [["covid","vaccine"], ["work","covid"], ["environment","pollution"]] for w1, w2 in target_pairs: if w1 not in word2idx or w2 not in word2idx: print(f"词对({w1}, {w2})存在词表外的词,跳过计算") continue sim_score = word_sim_matrix[word2idx[w1], word2idx[w2]] print(f"词对({w1}, {w2}) 余弦相似度:{sim_score:.4f}")
词语二维笛卡尔坐标计算与可视化
词向量本身是和文档数维度一致的高维向量,需要通过降维算法映射到2维平面,才能得到可用于绘图的x、y笛卡尔坐标。小数据集场景下用PCA降维速度快、结果可解释性强,足够满足可视化需求,实现代码如下:
from sklearn.decomposition import PCA import matplotlib.pyplot as plt # 待展示的目标词列表 target_words = ["covid", "vaccine", "work", "environment", "pollution"] # 过滤词表中不存在的词 valid_words = [w for w in target_words if w in word2idx] # 提取目标词对应的高维向量 valid_word_vecs = word_doc_matrix[[word2idx[w] for w in valid_words]] # PCA降维到2维,直接得到每个词的x、y坐标 pca = PCA(n_components=2) word_2d = pca.fit_transform(valid_word_vecs.toarray()) # 绘制二维散点图 plt.figure(figsize=(8,6)) plt.scatter(word_2d[:,0], word_2d[:,1], c='#2c7fb8', s=90) # 为每个散点添加词标签 for i, word in enumerate(valid_words): plt.text(word_2d[i,0]+0.01, word_2d[i,1]+0.01, word, fontsize=12) plt.xlabel("Dimension 1") plt.ylabel("Dimension 2") plt.title("Word Distribution on 2D Plane") plt.grid(alpha=0.3) plt.show()
补充说明
- 上述方案得到的词相似度基于文档级共现逻辑:两个词如果频繁出现在同一条推文中,相似度得分就越高,完全匹配基于上下文语境评估相似度的需求。如果需要更细粒度的语义相似度,可以替换为Word2Vec、BERT类预训练词向量模型,后续相似度计算、降维可视化的逻辑完全一致。
- 处理推特语料时,建议在
TfidfVectorizer中自定义分词规则,过滤掉链接、@用户名、#话题标签、特殊表情符号这类噪声,能大幅提升相似度计算的准确性。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

