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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:58:01