1

I have a pdf file that I am reading as a text.

The problem I am having has to do with syllabification occurring between numbers.

Link to file on github.

library(pdftools)
library(tidytext)
library(readxl)
library(dplyr)

setwd("~/Automation - Official Guazzete")
path <- getwd()
pdf_file <- file.path(path, "stecajni_postapki.pdf")

test <- pdf_text(pdf_file)

If you search the document, you'll see examples like 530000101378- 659. This is supposed to be a single number 530000101378659.

I've tried different regex versions, but all failed.

test <- gsub("-", "", test) #try 1
test <- gsub("-\r\n+", "", test) #try 2
test <- gsub("-\\n+", "", test) #try 3

This is the remaining code:

text_df <- data_frame(line = 1:5, text = test)

p <- text_df %>%
  unnest_tokens(word, text)

count <- p  %>%
  count(word, sort = TRUE) 

In every instance, the output in count is two seperate words

1. 530000101378
2. 659

I assume the regex is failing in combining the elements from different lines. But im not sure how to fix it.

Any help is much appreciated.

4

2 回答 2

3

Try the following:

gsub("(\\d)-(\\d)", "\\1\\2", "530000101378-659")

matches - between two numbers and replaces it with the numbers. This will not remove - located elsewhere.

() - parentheses indicate a capture group

\\d - number

(\\d)-(\\d) - 1st capture group is a number before "-". 2nd capture group is a number after "-"

\\1 - \\9 reference the captured groups, we have two in this example.

test <- c("530000101378-659", "2-53", "2777-a", "brb - 27")

gsub("(\\d)-(\\d)", "\\1\\2", test)
#output: [1] "530000101378659" "253"             "2777-a"          "brb - 27"  

EDIT: this does not work on your PDF since it is rendered as it is (check Mike Stanley answer)

even if we do:

test = gsub("[\r\n]", "", test)
test = gsub("(\\d)-.*?(\\d)", "\\1\\2", test)

replacing: - and any number of characters up to the first next number, we will not get 100% recovery:

test[4]
"....со жиро-сметка бр. 5300001013786.7.2017 годи-659, која се води в..."

Here is a workaround:

test <- pdf_text(pdf_file)
test = gsub("[\r\n]", " ", test)
list = strsplit(test, " {2,}") #split anywhere where there are 2 or more consecutive spaces - hopefully only between two paragraphs (if not the output wont make much sense) 

resi = lapply(list, function(x) {
  unl = unlist(x)
  len = length(x)
  uneven = seq(from = 1, to = len , by =2)
  even = seq(from = 2, to = len , by =2)
  uneven = unl[uneven]
  even = unl[even]
  uneven = paste(uneven, collapse = " ")
  even = paste(even, collapse = " ") #intentionally leave a space between them, one could even use something that is not expected to occur in the document like "frafrafra" and use that in the gsub call later as gsub("(\\d)-frafrafra(\\d)", "\\1\\2", resi)
  return(cbind(uneven, even))
}) #separate even from uneven rows



resi = unlist(resi)

resi = gsub("(\\d)- (\\d)", "\\1\\2", resi) #clean numbers

resi = gsub("(\\b)- (\\b)", "\\1\\2", resi) #clean words

resi[8] # instead of 4 since we split even and odd rows
    [1] "10 јули 2017 Извод од Решението да се објави во „Сл. весник на РМ“ и на
 огласната табла на судот. Се налага на Прокредит банка АД Скопје и на Охридска
 банка АД Охрид како институција што вршеле платен промет за субјектот, по 
приемот на ова Решение доколку на жиро-сметката на субјектот се наоѓаат средства
и тие да се префрлат на жиро-сметка на Буџетските средства на РМ – Трезорска 
сметка при НБРМ на трансакциона сметка 10000000063095, сметка на Буџетски 
корисник бр. 630010001963019, приходна шифра (34168) ___________ Против 
погоренаведеното Решение, доверителите имаат право на жалба преку овој суд до 
Апелациониот суд во Гостивар, во рок од 8 дена од објавувањето на Решението во 
„Сл. весник на РМ“. По правосилноста на Решението, должникот ќе се брише од 
Трговскиот регистар што се води при Централниот регистар на РМ – Регионална 
регистрациона канцеларија – Тетово. (34165) __________ гледување на грозје, со 
трансакциски сметки број 200000036020069 во Стопанска банка АД Скопје, број на 
постапка над стечајниот должник Друштво за трговија на големо и мало и услуги 
АНИТОМ ДООЕЛ увоз-извоз Гостивар, со жиро-сметка бр. 530000101378659, која се 
води во Охридска банка АД Скопје, со ЕДБ 4007011510476 и ЕМБС 6677754. 
Стечајната постапка не се спроведува поради немање имот и се заклучува. Против 
погоренаведеното Решение, дозволена е жалба преку Основниот суд во Гостивар до 
Апелациониот суд во Гостивар, во рок од 8 дена од денот на објатано од денот на 
објавувањето на Решението во „Службен весник на Република Македонија“, да ги 
пријават (34166) __________ на подвижни предмети и права на должникот, како и 
разлачните права на недвижностите на должникот што не се запишани во јавните 
книги и разлачните права на недвижностите на должникот што се запишани во 
јавните книги, своите разлачни права на подвижните предмети и на правата на 
должникот што се запишани во регистрите во кои тие предмети, односно права се 
запишани да ги пријават кај стечајниот управник во рок од 15 Седницата на 
Собранието на доверители ќе се одржи во Основниот суд во Велес на ден 14.7.2017 
година, во 10:30 часот, во судница бр. 7 на II кат, на Осна кои предмети постои 
разлачно право, начинот и основот на засновање на тоа право, како и средствата 
за ДНЕВЕН РЕД своите обврски што ги имаат спрема должникот да ги исполнат на 
стечајниот управник. Се закажува рочиште за испитување и утврдување (34167) 
__________ ца бр. 3 во Основниот суд во Штип. Се закажува Собрание на доверители 
на кое врз основа на извештајот на стечајниот управник, ќе се одлучува за 
натамошниот тек на стечајната постапка (Извештајно собрание) за 12.10.2017 
година со почеток во 12:00 часот, во судница бр. 3 во Основниот суд во Штип. 
Отворањето на стечајната постапка да се запише во Трговскиот регистар при 
Централниот регистар на РМ, во јавните книги во кои се запишани правата врз 
недвижностите и во други соодветни регистри. Ова Решение да се објави на 
огласната табла на Основниот суд во Штип и во „Службен весник на РМ“.

However because of this the first page (resi[1] and resi[2]) is messed up, since it has only one paragraph:

resi[1]
    [1] "10 јули 2017 Стечајни постапки Основниот суд Скопје II – Скопје преку 
стечајниот управник Ѓорѓе Костов, објавува дека со Решение 2 постапка над 
должникот Друштво за производство, трка сметка 300000000744414 при Комерцијална 
банка 4854217 и единствен даночен број 4030003477097 и давници претежно со храна 
и пијалаци и тутун. ње имот и се заклучува. регистар на РМ, во „Службен весник 
на РМ“ и на огласОд Основен суд Скопје II – Скопје. __________ судија Артан 
Лимани, објавув....

Hopefully you have the tools now to overcome this.

于 2017-09-27T09:02:54.687 回答
2

This is nothing to do with regular expressions; rather, it's to do with how your PDF has been rendered after being OCRed. The text inside the PDF is not collected into columns, so the second column's text is interpolated with the first column, padded with spaces between them. Your example string looks like this after being imported:

на постапка над стечајниот должник Друштво за трго-      АД Скопје и број 250000000176263 во Шпаркасе банка
вија на големо и мало и услуги АНИТОМ ДООЕЛ              Македонија АД Скопје.
увоз-извоз Гостивар, со жиро-сметка бр. 530000101378-        Стечајната постапка се отвора на ден 6.7.2017 годи-
659, која се води во Охридска банка АД Скопје, со ЕДБ    на во 12:00 часот.
4007011510476 и ЕМБС 6677754.                                За стечаен управник се именува Пепи Страшо Па-

As a result, I don't believe it will be possible to write a regular expression to parse this as-is.

The way I would parse this is by re-parsing the pdf text as a fixed width file. This will create a data frame with two columns which can then be parsed separately using regex.

于 2017-09-27T09:35:57.900 回答