专项训练之计算余弦相似度

面试的时候被问到

“你了解 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(相似度矩阵)
posted @ 2026-09-01 21:44  电动工具  阅读(3)  评论(0)    收藏  举报