Выделите python-docx с регулярным выражением и пробелом

Я хочу выделить шаблон регулярного выражения в файлах docx в папке, используя python-docx. Я могу добиться этого с помощью обычного кода регулярного выражения ниже.

Проблема возникает, когда я хочу добиться того же с помощью spacy nlp.

from docx import Document
from docx.enum.text import WD_COLOR_INDEX
import pandas as pd
import os
import re

import spacy
nlp = spacy.load("en_core_web_sm")

path = r"/home/coder/Documents/"
doc1 = Document('test.docx')
doc = nlp(doc1)

#re_highlight = re.compile(r"[1-9][0-9]*|0") # This one works.
re_highlight = [token for token in doc if tok.like_num == "TRUE"]

for filename in os.listdir(path):
    if filename.endswith(".docx"):
        file = "/home/writer/Documents/" + filename
        print(file)
        for para in doc.paragraphs:
            text = para.text
            if len(re_highlight.findall(text)) > 0:
                matches = re_highlight.finditer(text)
                para.text = ''
                p3 = 0
                for match in matches:
                    p1 = p3
                    p2, p3 = match.span()
                    para.add_run(text[p1:p2])
                    run = para.add_run(text[p2:p3])
                    run.font.highlight_color = WD_COLOR_INDEX.YELLOW
                para.add_run(text[p3:])
        doc.save(file)

Ошибка:

поднять ValueError(Ошибки.E1041.format(type=type(doc_like)))
ValueError: [E1041] В качестве входных данных ожидалась строка, документ или байты, но получено: <class 'docx.document.Document'>

Я понимаю, что в документе нет doc.paragraphs, являющегося элементом nlp. Как решить эту проблему?

Пожалуйста, помогите.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не можете сделать nlp(doc1) с doc1 объектом Document, вы должны извлечь текстовые части и работать с ними. Вместо этого я бы предложил что-то вроде следующего (работает здесь для примера файла):

import re
from pathlib import Path
import spacy
from docx import Document
from docx.enum.text import WD_COLOR_INDEX

nlp = spacy.load("en_core_web_sm")

def highlight(text):
    tokens = (token.text for token in nlp(text) if token.like_num)
    return re.compile("|".join(sorted(tokens, key=len, reverse=True)))

path_in = Path("/home/coder/Documents/")    # Input folder  
path_out = Path("/home/writer/Documents/")  # Output folder  
for file in path_in.glob("*.docx"):
    print(f"Processing file '{file}' ... ", end = "")
    doc = Document(file)
    for para in doc.paragraphs:
        text = para.text
        para.text = ""
        p3 = 0
        for match in highlight(text).finditer(text):
            p1 = p3
            p2, p3 = match.span()
            para.add_run(text[p1:p2])
            run = para.add_run(text[p2:p3])
            run.font.highlight_color = WD_COLOR_INDEX.YELLOW
        para.add_run(text[p3:])
    doc.save(path_out / file.name)
    print("done.")

Есть вероятность случайного выделения. Если это произойдет, вы можете попробовать использовать

def highlight(text):
    tokens = (token.text for token in nlp(text) if token.like_num)
    pat = r"\b(?:" + "|".join(sorted(tokens, key=len, reverse=True)) + r")\b"
    return re.compile(pat)

вместо.

Другие вопросы по теме