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

使用spaCy结合python-docx高亮docx内容遇错,求解决方案

解决spaCy处理docx文档数字高亮的问题

问题背景

原本用正则表达式(匹配规则[1-9][0-9]*|0)结合python-docx可实现文件夹内docx文件的数字高亮,但改用spaCy的NLP功能时触发错误:

raise ValueError(Errors.E1041.format(type=type(doc_like)))
ValueError: [E1041] Expected a string, Doc, or bytes as input, but got: <class 'docx.document.Document'>

同时发现spaCy处理后的对象不存在paragraphs属性,原代码逻辑存在混淆问题。

错误原因

  1. spaCy输入类型不兼容:nlp()仅接受字符串、Doc或字节对象,不能直接传入python-docx的Document实例
  2. 对象概念混淆:spaCy的Doc对象用于文本分析,没有paragraphs属性;原代码错误将其当作python-docx的文档对象操作
  3. 布尔判断错误:token.like_num是布尔类型,不能与字符串"TRUE"做比较,直接使用token.like_num即可
  4. 流程逻辑错误:原代码未正确遍历目标文件夹的docx文件,反而错误操作了spaCy的Doc对象

修正后的代码

from docx import Document
from docx.enum.text import WD_COLOR_INDEX
import os
import spacy

# 加载spaCy英文分析模型
nlp = spacy.load("en_core_web_sm")

# 目标文件夹路径
path = r"/home/coder/Documents/"

# 遍历文件夹内的docx文件
for filename in os.listdir(path):
    if not filename.endswith(".docx"):
        continue
    
    file_path = os.path.join(path, filename)
    print(f"处理文件: {file_path}")
    
    # 用python-docx打开目标文档
    doc = Document(file_path)
    
    # 逐个处理文档段落
    for para in doc.paragraphs:
        original_text = para.text
        if not original_text:
            continue
        
        # 用spaCy分析当前段落的文本
        spacy_doc = nlp(original_text)
        
        # 收集所有数字token的起止位置
        num_spans = []
        for token in spacy_doc:
            if token.like_num:
                start_idx = token.idx
                end_idx = start_idx + len(token.text)
                num_spans.append((start_idx, end_idx))
        
        if not num_spans:
            continue
        
        # 清空原段落内容,重新构建带高亮的段落
        para.text = ""
        current_pos = 0
        
        for start, end in num_spans:
            # 添加数字前的普通文本
            if start > current_pos:
                para.add_run(original_text[current_pos:start])
            # 添加高亮的数字文本
            num_run = para.add_run(original_text[start:end])
            num_run.font.highlight_color = WD_COLOR_INDEX.YELLOW
            current_pos = end
        
        # 添加段落剩余的普通文本
        if current_pos < len(original_text):
            para.add_run(original_text[current_pos:])
    
    # 保存修改后的文档
    doc.save(file_path)

关键说明

  1. 分离职责:明确区分python-docx的文档读写操作,与spaCy的文本分析功能,先读取docx段落文本,再传入spaCy处理
  2. 精准定位数字:利用spaCy token的idx属性获取数字在原文本中的起始位置,结合len(token.text)得到结束位置,实现精准高亮
  3. 段落重构逻辑:和正则实现逻辑一致,清空原段落内容后,按顺序拼接普通文本与高亮数字,最后处理剩余内容
  4. 路径优化:用os.path.join()拼接文件路径,避免手动拼接导致的格式错误

内容的提问来源于stack exchange,提问作者Programmer_nltk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:43:14