词频向量模型可用纯数组实现:先分词清洗、构建索引词表,再统计词频生成固定维向量,最后用余弦相似度计算文本相似性,全程不依赖sklearn,适合理解原理或轻量部署。

直接用数组实现词频向量模型,核心是手动构建词汇表、统计词频、生成固定长度的向量,再用余弦相似度比较文本。它不依赖 sklearn,适合理解底层逻辑或轻量部署。
准备分词与清洗文本
中文需先分词(如用 jieba),英文可按空格或正则切分;同时建议统一小写、去除标点和停用词(如“的”“是”“a”“the”)。
- 对每条文本调用
list(jieba.cut(text))得到词序列 - 过滤掉长度 ≤1 的词、纯空格/标点、常见停用词(可自建列表)
- 保留有意义的实词,如名词、动词、形容词
构建全局词汇表并映射索引
遍历全部文本的分词结果,统计所有不重复词,按字母或频次排序后赋予唯一整数索引(从 0 开始),形成词→下标的字典。
- 用
dict存储:例如{'电影': 0, '喜欢': 1, '今天': 2, '天气': 3, ...} - 词汇表大小即向量维度;建议限制最大词数(如前 5000 个高频词),避免维度过高
- 未登录词(OOV)可统一忽略,或设为特殊索引(如 -1)并在向量化时跳过
用数组生成词频向量
对每个文本,初始化一个全零数组(长度 = 词汇表大小),遍历其分词结果,查表得索引,对应位置 +1。
- 示例:文本“我 喜欢 看 电影”,若词表含 ['喜欢', '电影'] → 索引 [1, 0],向量为
[0,1,0,1](假设四维) - 注意:同一词多次出现就累加,不是布尔值(除非你做的是二值化)
- 最终得到二维数组(n_texts × vocab_size),每行是一个文档的词频向量
计算余弦相似度完成相似度评估
两个向量 a 和 b 的余弦相似度 = (a·b) / (||a|| × ||b||),值域 [-1, 1],越接近 1 越相似。
- 点积可用
sum(a[i] * b[i] for i in range(len(a))) - 模长用
sqrt(sum(x**2 for x in a)) - 对多文本两两比较,可嵌套循环或用 NumPy 向量化加速(如
np.dot+np.linalg.norm) - 输出结果可排序取 Top-K 最相似对,用于查重、推荐或聚类初筛










