R: очистка pdf текста - PullRequest
       105

R: очистка pdf текста

0 голосов
/ 28 января 2020

У меня есть PDF-текст, который мне нужно преобразовать в "аккуратный" формат. Но я не уверен, как читать текст в формате PDF без ущерба для информации, которая мне нужна. Например:

# install pacman package if you require it
if (!require("pacman")) install.packages("pacman")

# p_load installs and loads packages

pacman::p_load(tidyverse, pdftools, tabulizer)

pdf_txt_raw <- pdf_text("https://www.statcan.gc.ca/eng/statistical-programs/document/5027_D1_V10-eng.pdf") %>% 
               read_lines()

pdf_txt_raw 

Использование read_lines(), похоже, выдает ошибку, потому что всякий раз, когда в столбце «официальное имя» есть две строки, он портит нужный мне формат. Например, Loblaw In c [4] вполне подойдет для очистки, поскольку каждое имя операции отделено запятой, и оно находится в строке Lobl aws, что дает мне чистую категорию.

Но первая юридическая категория имен неверна из-за разрыва строки в PDF - то есть «Buy-Low Foods Limited Partnership» должно быть юридическим названием, а названия операций в этой категории должны быть «AG». Foods, Buy-Low Foods, Buy & Save Foods, Fine Foods, G & H Shop N 'Save, Nesters Market ".

Какие-нибудь советы о том, как правильно это почистить и получить нужный формат?

1 Ответ

0 голосов
/ 29 января 2020

Я только что нашел способ обмана. Позволь мне бросить это для тебя. Я скопировал и вставил каждую страницу файла PDF в EXCEL 2013 на свой Windows и создал файл. Этот файл содержит данные очень хорошим способом. Я думаю, что это спасатель для вас. Сначала я импортировал его в R с read_xlsx(). Затем я изменил имя столбца на Legal Name. Вы можете иметь что-то еще, если хотите. Затем я удалил строки, содержащие заголовки в файле PDF, такие как Operating Name|, Operating Name и так далее. Затем я создал две колонки. Одним из них является id. В основном информация одной компании находится в двух последовательных строках. Я использовал этот шаблон для создания переменной. Я также создал type, который содержит два типа имен. Наконец, я преобразовал данные в широкоформатные данные. Это дает нам следующий результат. Я не уверен, работает ли этот подход постоянно. Но по крайней мере с вашими данными PDF, да, это так.

library(readxl)
library(dplyr)
library(tidyr)

mydf <- read_xlsx("SO_pdf.xlsx")

rename(mydf, legal_name = "Legal Name") %>% 
filter(!grepl(x = legal_name, pattern = "Operating Name|The Food Retailers|The Department Stores|The Other Non-Food Retailers")) %>% 
mutate(id = rep(1:(n()/2), each = 2),
       type = rep(c("legal_name", "operating_name"), times = (n()/2))) %>% 
pivot_wider(id_cols = "id", names_from = "type", values_from = "legal_name")

#      id legal_name                        operating_name                                                                            
#   <int> <chr>                             <chr>                                                                                     
# 1     1 Buy-Low Foods Limited Partnership AG Foods, Buy-Low Foods, Buy & Save Foods, Fine Foods, G&H Shop N' Save, Nesters Market   
# 2     2 Loblaws Inc.                      At the Pumps, Atlantic Gas Bars, Dominion, Extra Foods, Joe Fresh, Loblaws, Loblaws à Ple~
# 3     3 Metro Ontario Inc.                Drug Basics, Food Basics, Metro, Super C, The Pharmacy                                    
# 4     4 Overwaitea Food Group Limited Pa~ Cooper's Foods, Overwaitea Foods, PriceSmart Foods, Save-On-Foods, Urban Fare             
# 5     5 Sobeys Capital Incorporated       Candico Food Markets, Canada Safeway, Canada Safeway Liquor Store, Fast Fuel, Foodland, F~
# 6     6 Hudson's Bay Company              Home Outfitters/Déco Découverte, The Bay/ La Baie, Zellers                                
# 7     7 Sears Canada Inc.                 Sears, Sears Home Stores, Sears Hometown Stores, Sears Outlet                             
# 8     8 Wal-Mart Canada Corp              Walmart                                                                                   
# 9     9 American Eagle Outfitters Canada~ Aerie, American Eagle Outfitters                                                          
#10    10 Apple Canada Inc.                 Apple Store   
...