如何用spaCy中型模型en_core_web_md批量处理文档并计算向量平均值?
嘿,我来帮你搞定这个需求!要实现遍历文件夹里的Word文档、生成每个文档的向量再计算整体平均值,咱们一步步来,代码和细节都给你理清楚:
用spaCy处理Word文档并计算向量平均值
先搞定依赖安装
首先得装两个关键工具:python-docx用来读取Word文档,还有spaCy和它的中型模型。打开终端跑这两句:
pip install spacy python-docx python -m spacy download en_core_web_md
完整代码实现
下面是完整的代码,每部分我都加了注释,方便你理解:
import spacy import os from docx import Document import numpy as np # 加载spaCy的中型预训练模型 nlp = spacy.load("en_core_web_md") def read_docx(file_path): """读取Word文档的文本内容""" doc = Document(file_path) # 把所有段落的文本拼接起来 return "\n".join([para.text for para in doc.paragraphs]) def get_document_vector(text): """生成单篇文档的向量""" doc = nlp(text) # 方案1:直接用spaCy自带的文档向量(默认是所有token向量的平均值) return doc.vector # 方案2:手动过滤停用词、标点后再计算平均(更精准),把上面的return注释掉,解开下面的代码 # tokens = [token for token in doc if not token.is_stop and not token.is_punct and token.has_vector] # if not tokens: # 处理没有有效向量的文档 # return np.zeros(nlp.vocab.vectors_length) # return np.mean([token.vector for token in tokens], axis=0) def process_folder(folder_path): """遍历文件夹里的所有Word文档,收集向量并计算平均值""" all_doc_vectors = [] # 遍历文件夹中的每个文件 for filename in os.listdir(folder_path): # 只处理docx格式的文件 if filename.lower().endswith(".docx"): file_full_path = os.path.join(folder_path, filename) print(f"正在处理: {filename}") # 读取文档内容 doc_text = read_docx(file_full_path) # 跳过空文档,避免影响平均值 if not doc_text.strip(): print(f"跳过空文档: {filename}") continue # 生成文档向量并加入列表 doc_vec = get_document_vector(doc_text) all_doc_vectors.append(doc_vec) # 处理没有有效文档的情况 if not all_doc_vectors: print("未找到有效的Word文档,或所有文档都是空的!") return None # 计算所有文档向量的平均值 average_vector = np.mean(all_doc_vectors, axis=0) return average_vector # 主程序入口 if __name__ == "__main__": # 替换成你的Word文档所在文件夹路径 target_folder = "./word_documents" avg_vector = process_folder(target_folder) if avg_vector is not None: print(f"\n所有文档的平均向量维度: {avg_vector.shape}") print(f"平均向量前10个元素示例: {avg_vector[:10]}")
一些关键细节说明
- 文档向量生成:spaCy的
doc.vector已经帮你做了基础的平均处理,如果你需要更精细的控制(比如排除停用词、标点),可以用代码里的方案2。 - 空文档处理:代码里会跳过空文档,避免全零向量拉低整体平均值。
- 向量维度:
en_core_web_md的向量是300维的,所以最终的平均向量也是300维的。
内容的提问来源于stack exchange,提问作者Gerold
相关产品推荐
相关产品推荐

