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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:43:57