как извлечь текст из PDF между некоторыми шаблонами - PullRequest
0 голосов
/ 14 июля 2020

У меня есть несколько тысяч документов (на немецком языке) в формате PDF. Мне нужно извлечь часть текста из каждого из них, который обычно идет после даты и заканчивается перед датой, местоположением, адресом почти в конце страницы. Пример прилагается. Нужный мне текст выделен. введите описание изображения здесь

То, что я пробовал, это qdapRegex::rm_between:

library(pdftools)
library(qdapRegex)
t1 <- pdf_text("textsample.pdf")
textIneed <- rm_between(t1, "Datum", ", den" )

, что не сработало. На выходе получается весь текстовый контент, включая Name, Vorame и т. Д. c. (Я мог бы жить с датой 20.01.2019 в начале.) Что я делаю неправильно, мне непонятно, так как я новичок в регулярных выражениях и nlp и не могу обнаружить его, читая документацию rm_between или qdapRegex.

Моя первая проблема - заставить это работать.

Еще одна проблема заключается в том, что эти документы не являются стандартными, и некоторые документы могут содержать другой тип информации, например, Ref:1234 вместо даты до выделенная область. Этот фрагмент может быть найден на любой странице документа, поэтому использование точных номеров страниц не вариант.

Есть ли другое решение, библиотека и т. Д. c. что можно использовать для извлечения большей или меньшей части текста?

1 Ответ

1 голос
/ 14 июля 2020

Я не думаю, что на это есть хороший простой ответ. С помощью регулярных выражений можно захватить текст между ними, но выражение может стать заведомо сложным, если у вас есть несколько или сложные шаблоны для сопоставления. Давайте возьмем ваш простой пример и воспользуемся фиктивным немецким текстом и ожидаем, что вы хотите получить все, что находится между датой (в формате дд.мм.гггг или дд.мм.гг) или ref: [хотя бы одна цифра] и ", den XX "но исключая последнее слово (местоположение) перед этим.

Я буду использовать пакет stringr:

# generate some text (with new lines)
t1 <- c("Du möchtest also den Text zwischen dem Datum 13.07.2020
        am Anfang und den Ort bzw. Datum am Ende extrahieren.
        Freiburg, den 13. Juli 2020",
        "Oder den Text nach einem ref:384 übernehmen bis zum Datum am Ende.
        Freiburg, den 13. Juli 2020")

# extract the parts
textIneed <- stringr::str_match(t1,
"(?:\\d{2}\\.\\d{2}.\\d{2,4}|ref:\\d+)((.|\n)*)\\s\\w+, den \\d{1,2}")[,2]

# trim white space
# (this could be done before extraction too, to simplify the text)
trimws(textIneed)
#> [1] "am Anfang und den Ort bzw. Datum am Ende extrahieren."
#> [2] "übernehmen bis zum Datum am Ende."

То, что я делаю здесь, - это сопоставление первых элементов с (?:\\d{2}\\.\\d{2}.\\d{2,4}|ref:\\d+), затем захватите все, включая новые строки между ними ((.|\n)*), но не последнее слово \\s\\w+ перед , den \\d{1,2}.

Для изучения регулярных выражений доступно несколько ресурсов, например RegexOne

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...