2017-09-06 1 views
0

J'ai un document assez simple (les stratégies gouvernementales pour le mandat) avec des titres, du texte normal et des puces (qui sont les stratégies qu'ils cherchent à implémenter).Extrait seulement des points de puces à partir de PDF en utilisant R ou Python

Je peux lire et extraire des pages ou des titres du .pdf et le convertir en .txt mais je voudrais seulement garder le texte (les paragraphes entiers) à l'intérieur des puces, ce qui m'intéresse. estime qu'il y a un moyen de le faire car ils peuvent être identifiés par le point de balle lui-même probablement.

Existe-t-il un moyen assez simple de faire cela en R et/ou en Python? Je ne suis pas familier avec d'autres langages de programmation ou méthodes d'analyse.

EDIT: Juste rapidement converti le texte de base au format HTML (en utilisant https://wordtohtml.net) sur une page et il semble tourner les points à <li> que je devine serait assez facile à analyser. Existe-t-il un moyen facile et rapide de convertir l'ensemble du document de 262 pages au format HTML en conservant le format <li> probablement dans R/python? Ou connaissez-vous une méthode PDF - préférable car il serait au moins une étape de moins pour le faire - pour mon problème?

+0

Avez-vous regardé le paquet 'pdftools'? Il a une fonction 'pdf_text' qui devrait au moins vous donner le texte brut. Vous devrez voir si la sortie est telle que vous pouvez décaper les titres et le texte normal. Regex pourrait vous y parvenir en fonction de la cohérence du format. – Mako212

+0

Excellente idée. Oui, j'ai le texte brut. Ci-dessous un extrait: '" (...) passarão a estar enregistrementspolitiquespúblicas que permitam: \ n • Inverser une tendance de perte de rendu pour les familles, les enfants, les personnes handicapées et les retraités; "' '\ n' indique une nouvelle ligne. En supposant qu'il soit parfaitement écrit, ce que je veux est entre '' '' et '; \ n', car une phrase menant à des points de balle se termine par': \ n'. Mais lors de la création de la trame de données, j'ai obtenu 1 ligne par page. Je vais devoir subdiviser chaque puce en sa propre ligne après. –

+1

On dirait que vous êtes sur la bonne voie. Vous devriez être en mesure de sélectionner des chaînes qui correspondent au modèle '• .....; \ n' avec Regex si vous avez d'autres chaînes mélangées dans – Mako212

Répondre

1

Voici mon approche générale:

Lire dans une chaîne exemple

require(stringr) 

string <- "passarão a estar inscritas políticas públicas que permitam:\n • Inverter a tendência de perda de 
rendimento das famílias, dos trabalhadores, dos\n funcionários públicos e dos pensionistas;\n" 

de Split par \n

# match semi-colon or colon, then a backslash, then "n". I.E. split by ;\n or :\n 
stringList <- unlist(str_split(string, "([;:])\\\n")) 

position de retour d'une chaîne qui commence par une balle:

matched <- grep("\\\u0095", stringList) 

à cordes qui Subset commencent par balles:

stringList[matched] 

La partie faible de cette solution est actuellement qu'elle repose sur des balles étant précédé par « ; \ n » ou « : \ n ». Si vous venez de diviser par "\ n", vous perdez la deuxième partie d'une balle quand elle continue sur une deuxième ligne. Selon le format du document, vous devrez peut-être changer la regex pour vous assurer de bien séparer la chaîne.

Vous pouvez également faire la division initiale par une puce: stringList <- unlist(str_split(string, "\\u0095")) mais vous avez besoin d'une règle pour définir où la puce fins et le texte brut commence.

+0

Votre solution semble fonctionner mais pas complètement.Dans mon cas 'matched <- grep (" \\\ u0095 ", stringList)' devait être changé en 'matched <- grep (" \\ • ", stringList)' pour obtenir le résultat désiré. Le vôtre a retourné un matched de 'integer (0)' avec 'stringList [matched]' de 'character (0)'. –

+0

Je l'ai eu à travailler dans le texte intégral. 262 pages ont apparemment 1071 puces! Maintenant, je dois juste nettoyer un peu le texte, en supprimant quelques \ n \ et quelques autres choses qui sont au milieu du texte. Exemple de sortie par ligne: '[1]" • Relançar o investimento na Ciência, na Inovação, na Educação, na Formação e na \ n Cultura, devolvendo a país uma visão de futuro economia global do século XXI "' –

+0

Juste pour clarifier: bien que dans mon commentaire ci-dessus après '\ n' il n'y a qu'un espace, dans mon code (après avoir collé au mot et déconner avec' nchar() 'dans' R') il y a en réalité 8 espaces. –