专项训练之计算余弦相似度
面试的时候被问到
“你了解 Embedding 吗?”
回答是没问题
文本
↓
Embedding Model
↓
[0.12, -0.37, 0.81, ...]
↓
计算余弦相似度
↓
Top-K
↓
得到最相似的文本
然后写一下,我没敲过啊,都是面向AI做实验,那就下一家吧。
出来后写了一下。
先给语料
texts = ["免费主机推荐", "免费空间使用教程", "免费PHP空间"]
接着丢给结巴分词(中文天然没有空格,免费主机和免费空间里的【免费】理论上就是靠近的元素)
seg_list = [list(jieba.cut(text)) for text in texts]
# [['免费', '主机', '推荐'], ['免费', '空间', '使用', '教程'], ['免费', 'PHP', '空间']]
然后就是文本向量化
# `分词集合` 中的每篇文档已经是词语列表,而 CountVectorizer 默认
# 按字符串处理文档(会调用 `.lower()`)。指定 analyzer 直接使用词列表,
# 这样既不会触发类型错误,也能保留 jieba 的分词结果。
向量化器 = CountVectorizer(analyzer=lambda 词语列表: 词语列表)
向量集合 = 向量化器.fit_transform(分词集合)
但是 CountVectorizer 返回的是稀疏矩阵。直接 print 时只显示非零元素的坐标,不容易看出“哪一个词对应哪一列”,可以输出看看。
词汇表 = 向量化器.get_feature_names_out()
print("\n词汇表(列名):")
print(list(词汇表))
print("\n词汇到列索引的映射:")
print(向量化器.vocabulary_)
print("\n词汇矩阵(每行一篇文档,每列一个词):")
print(向量集合.toarray())
print(f"矩阵形状: {向量集合.shape}({向量集合.shape[0]} 篇文档 × {向量集合.shape[1]} 个词)")
print("\n按词汇表列顺序查看每篇文档:")
print("列顺序:", " | ".join(词汇表))
for 文本, 向量 in zip(文本集合, 向量集合.toarray()):
print(f"{文本}: {list(map(int, 向量))}")
print("\n稀疏矩阵表示(只显示非零项):")
print(向量集合)
最后就是计算
from sklearn.metrics.pairwise import cosine_similarity
相似度矩阵 = cosine_similarity(向量集合)
print(相似度矩阵)

浙公网安备 33010602011771号