Вопрос или проблема
Я читаю текст из множества PDF-документов с помощью следующего кода:
import fitz
import numpy as np
import pandas as pd
# открыть документ
doc = fitz.open(filename_path)
# получить текст с каждой страницы документа
for idx, page in enumerate(doc):
page = doc.load_page(idx)
page_text = page.get_text("text")
doc_text = doc_text + page_text
# сохранить текст документа в колонке "text" в моем датафрейме
doc_df["text"] = doc_text
В основном, это работает нормально, но я заметил, что слова, содержащие ‘ff’, такие как ‘stuff’, читаются неправильно, например, ‘stu@’ или ‘stuI’. Судя по краткому поиску, это связано с ‘лигатурами’, но я не знаю, что это такое и как с этим справиться.
Пример текста, похожего на то, что я считываю из моего PDF:
“Я нашел немного вещей в сумке”
Текст после считывания pymupdf:
“Я нашел немного stuI в сумке”
Похоже, это не статическая конверсия, так как один раз он конвертировал ff в @ (в другом слове, но в той же фразе, приведенной выше для иллюстрации):
“Я нашел немного stu@ в сумке”
Как должен выглядеть исправленный код, чтобы я мог остановить это?
Ответ или решение
На вопрос о том, как предотвратить некорректное отображение символов, таких как ‘ff’ в таких словах, как ‘stuff’, при чтении PDF-документов с использованием PyMuPDF (библиотека fitz), можно ответить с учетом деталей проблемы, которые вы описали. Основной проблемой является наличие лигатур, что может привести к неправильному отображению текста.
Понимание Лигатур
Лигатуры — это специальные типографские символы, которые представляют собой комбинации двух или более букв, соединённых в один знак. Например, буквы ‘f’ и ‘f’ могут быть объединены в одну лигатуру ‘ff’. Некоторые шрифты используют лигатуры для улучшения эстетики текста, однако это может создавать проблемы при извлечении текста, поскольку программа может не распознать их как отдельные буквы и, вместо этого, отображать их как неожиданные символы, такие как ‘@’ или ‘I’.
Решение Проблемы
Чтобы избежать этой проблемы с лигатурами при использовании PyMuPDF, можно попробовать следующие методы:
-
Смена Шрифта или Кодировки: Убедитесь, что PDF документ использует стандартные шрифты, которые не содержат лигатур. Это устранит потенциальные проблемы с преобразованием текста. Если шрифт нельзя изменить, можно воспользоваться более продвинутыми методами извлечения.
-
Постобработка Извлеченного Текста: Вы можете написать дополнительный код для обработки текста после его извлечения, чтобы исправить найденные ошибки. Например, можно заменить неожиданные символы на правильные.
Вот измененный код:
import fitz
import numpy as np
import pandas as pd
# Открываем документ
doc = fitz.open('filename_path')
doc_text = "" # Инициализируем переменную для текста
# Извлекаем текст с каждой страницы документа
for idx, page in enumerate(doc):
page = doc.load_page(idx)
page_text = page.get_text("text")
# Заменяем лигатуры на корректные символы
page_text = page_text.replace('stuI', 'stuff').replace('stu@', 'stuff') # Добавьте нужные замены
doc_text += page_text # Конкатенируем текст
# Сохраняем текст документа в колонке "text" в вашем DataFrame
doc_df["text"] = doc_text
Заключение
При работе с PDF-документами и текстом важно учитывать, как шрифты и лигатуры могут влиять на извлечение текста. В случае использования PyMuPDF можно как минимизировать проблемы с лигатурами, так и постобрабатывать извлеченный текст для исправления ошибочных отображений. Если вы продолжите сталкиваться с трудностями, рассмотрите возможность использования других библиотек для извлечения текста, таких как pdfplumber или PyPDF2, которые могут обрабатывать текст иначе.
Надеюсь, данная информация поможет вам решить проблему с некорректным извлечением текста из PDF-документов!