Machine Learning, NLP

Обработка документов docx с параграфами и таблицами

Время прочтения: 2 мин.

На сайте есть уже большое количество различных статей с разбором разных алгоритмов NLP. Мы уже знаем об основных этапах обработки текста перед его анализом (отчистка текста от лишних символов, лемматизация, отчистка от стопслов). Однако я хочу рассказать про этап, который может вызвать определённые трудности, если текст изначально хранится в формате docx и в нём есть и параграфы с текстом и таблицы.

Передо мной стояла задача обработать текстовые документы, с сохранением последовательности текста внутри него. Однако вы должны знать, что при использовании библиотеки docx на языке  python параграфы и таблицы вы можете получить только в виде двух независимых потоков.

Такой подход перемешает текст и основной смысл текста будет нарушен. Больше всего это может вам помешать, при необходимости восстановить этот текста в правильном порядке. Для решения этой проблемы можно воспользоваться следующим кодом:

if isinstance(parent, _Document):
    parent_elm = parent.element.body
elif isinstance(parent, _Cell):
    parent_elm = parent._tc
elif isinstance(parent, _Row):
    parent_elm = parent._tr
else:
    raise ValueError("something's not right")
for child in parent_elm.iterchildren():
    if isinstance(child, CT_P):
        yield Paragraph(child, parent)
    elif isinstance(child, CT_Tbl):
        yield Table(child, parent)
document = Document('test.docx')
for block in iter_block_items(document):

if isinstance(block, Paragraph):
    print(block.text)
elif isinstance(block, Table):
    for row in block.rows:
        row_data = []
        for cell in row.cells:
            for paragraph in cell.paragraphs:
                row_data.append(paragraph.text)
        print("\t".join(row_data))

Основной принцип этого кода заключается в однопоточной обработке текстового документа и при получении каждого последующего элемента происходит определение его типа (параграф или таблица). Если полученных элемент таблица, то дальше идет следующее разделение на строки и ячейки. На выходе вы получите текст в его первоначальном виде без потери смысла в однопоточном виде.

После этого этапа можно приступать к другим этапам обработки текста, которых вы можете посмотреть в следующих статьях:

Решаем NLP-задачу – классификация текстов по темам;

Обработка текстовых данных методами NLP

Желаю успешного анализа текста с точностью не ниже 0.99.

Советуем почитать