Forum: PC-Programmierung Daten aus problematischem PDF extrahieren? (Wahl-O-Mat Antworten)


von Joachim S. (oyo)


Lesenswert?

Hallo,

ich möchte aus folgendem PDF:
https://www.wahl-o-mat.de/bundestagswahl2017/PositionsvergleichBundestagswahl2017

die Daten extrahieren, also welche Partei zu welcher Aussage wie 
Stellung genommen hat (Zustimmung/Ablehnung/Neutral)
Und das halbwegs automatisiert, um a) mir etwas Arbeit zu sparen und b) 
menschliche Fehler zu vermeiden.

Habe bereits mit mehreren Tools probiert, den Inhalt des PDF-Dokuments 
einfach als Text zu extrahieren. Das hat auch grundsätzlich geklappt, 
aber leider sind ausgerechnet die eigentlichen Daten (also die Antworten 
der Parteien) offenbar nicht als Text enthalten, sondern als 
Symbole/Grafiken, und beim Konvertieren nach reinem Text fielen die dann 
einfach komplett raus.

Hat jemand vielleicht eine hilfreiche Idee, mit was für einer Library 
(bevorzugt Python) oder Tool ich irgendwie an die gewünschten Daten 
herankommen bzw. in ein Format konvertieren könnte, dass ich dann 
irgendwie parsen kann?

: Bearbeitet durch User
von PDFlüsterer (Gast)


Lesenswert?

Irgendwas mit OCR, dem beizubringen ist wie Kreuz/Haken/Strich zu 
erkennen und durch irgendendein "Buchstaben" (oder gleich das passende 
Unicode Zeichen?) zu ersetzen.
Diese Symbole sind immerhin ganz wenige und im Dokument absolut 
konstant...

von Altenpfleger (Gast)


Angehängte Dateien:

Lesenswert?

Ok-Haken als "_", X und - werden erkannt.
Der Text ist manchmal nicht ganz richtig aber man kann ja die jeweiligen
Antworten des extrahierten Textzeilen per script zuordnen.

von Joachim S. (oyo)


Lesenswert?

PDFlüsterer schrieb:
> Irgendwas mit OCR, dem beizubringen ist wie Kreuz/Haken/Strich zu
> erkennen und durch irgendendein "Buchstaben" (oder gleich das passende
> Unicode Zeichen?) zu ersetzen.
> Diese Symbole sind immerhin ganz wenige und im Dokument absolut
> konstant...

Hey, clevere Idee!
Habe eben mal testweise die erste Seite des Dokuments in eine PNG-Datei 
umgewandelt, und diese Datei dann per tesseract geOCRt. Ohne tesseract 
extra zu trainieren kamen da solche Ergebnisse heraus:
1
3. Für die Aufnahme von neuen Asylsuchenden soll eine jährliche Obergrenze gelten. — X X X
2
4. Der Ausbau erneuerbarer Energien soll vom Bund dauerhaft finanziell gefördert werden. )( \/ \/ \/
3
6. BAföG soll generell unabhängig vom Einkommen der Eltern gezahlt werden. )( _ \/ \/
4
7. Die Videoüberwachung im öffentlichen Raum soll ausgeweitet werden. \/ \/ X X
5
22. In Deutschland geborene und aufgewachsene Kinder ausländischer Eltern sollen weiterhin neben der
6
deutschen ihre zweite Staatsangehörigkeit behalten dürfen. _ \/ ‘/ ‘/
Die Kreuze, Haken und Striche werden zwar wie man sieht unterschiedlich 
erkannt, aber damit kann man denke ich trotzdem etwas anfangen.

Vielen Dank nochmal für die clevere Idee!

von Joachim S. (oyo)


Lesenswert?

Altenpfleger schrieb:
> Ok-Haken als "_", X und - werden erkannt.
> Der Text ist manchmal nicht ganz richtig aber man kann ja die jeweiligen
> Antworten des extrahierten Textzeilen per script zuordnen.

Wow, vielen Dank für die Mühe, die Du Dir gemacht hast!

Gehe ich recht in der Annahme, dass Du das auch mit dem OCR-Ansatz 
gemacht hast? Wenn ja, welches Programm hast Du dafür verwendet?

Das die Kreuze bei Dir durchgängig als "X" erkannt werden, gefällt mir 
schon mal sehr gut. Nur der Umstand, dass Häkchen und Striche als 
Bindestrich bzw. Underscore erkannt werden, ist mir im ersten Moment 
nicht so ganz geheuer - tesseract z.B. hat bei mir den Strich im 
Originaldokument nämlich als genau diese beiden Zeichen erkannt, mal 
dieses, mal jenes...

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Wenn der Haken als \/ erkannt wird, sollte es ein Leichtes sein, diesen 
'Text' im ganzen Dokument zu ersetzen.
Beim X sehe ich Da eher Probleme :)

Bastelst Du an einem WahloMat, bei Dem man mehr als 8 (Alle ?) Parteien 
gescannt bekommt?

... kann doch nicht sein, daß die Berechnung der Prozente zwar bei 8 
Parteien klappt, aber bei Allen nicht möglich scheint ... vll. Mal einen 
ATtiny drauf ansetzen ...

Ok, man könnte auch versuchen, ob nach der Auswahl die Generierung des 
Ergebnis in einem neuen Tab gestattet wird und man im Vorherigen die 
Auswahl 'auf die nächsten 8' ändern kann - sehe Da aber schon Murphy 
lachend am Gangende auf mich warten ...

... ach ja ... erschreckend, wen ich wohl wählen soll ... muß wohl noch 
'n paar Mal rumtesten ;)

MfG

von PDFluesterer (Gast)


Lesenswert?

Altenpfleger schrieb:
> Ok-Haken als "_", X und - werden erkannt.
> Der Text ist manchmal nicht ganz richtig aber man kann ja die jeweiligen
> Antworten des extrahierten Textzeilen per script zuordnen.

1
$ cat document.txt  |  \
2
>    sed  -e 's!B\. !8. !g'  -e 's!_\. !9. !g'  -e 's!\([123]\)o\. !\10. !g'  |  \  ##1
3
>    sed  -e 's/^\([0-9][0-9]*\.\) [^\.!]*[\.!] /\1 /g'  |  \  ##2
4
>    sed  -e 's!\. *\([_xX-]\)!.  \1!g'  -e 's!     !    !g'  |  \  ##3
5
>    grep -P '^\d+\. '  ##4
6
1.  _    X    X    X
7
2.  X    X    _    _
8
3.  -    X    X    X
9
4.  X    _    _    _
10
5.  _    _    _    _
11
:
12
:

##1 ein paar Ziffern vor den Fragen richtigstellen
##2 den Fragetext entfernen
##3 whitespace normalisieren
##4 nur die nummerierten Fragen beibehalten


Die noch fehlende Vorbehandlung um:
- Nicht-ASCII-Zeichen zu entfernen/ersetzen
- Mehrzeilige Fragen behandeln
...sei dem geneigten Forumsbesucher zur Übung gemaess Steilvorlage 
ueberlassen

Selbstverstaendlich müssen noch die Parteien ueber 8 Seiten korrekt 
zugeordnet werden. Händisch.  :-P

von Altenpfleger (Gast)


Lesenswert?

Joachim S. schrieb:
> Gehe ich recht in der Annahme, dass Du das auch mit dem OCR-Ansatz
> gemacht hast? Wenn ja, welches Programm hast Du dafür verwendet?
pdftoppm document.pdf > bild.ppm
gocr bild.ppm > text.txt

Ich sehe gerade dass bei Fragen mit Umbruch die Antworten fehlen.

Ich würde anschliessend den Text der Fragen nochmal separat extrahieren
z.B. mit
pdftotext -raw document.pdf -

Die Zeilen der Anworten mit Umbruch abändern.
Danach die als Text extrahierten Frane in der gescannten Version 
zeilenweise
ersetzen. Dann musst du noch die ... ne alles Bullshit das müsste 
einfacher gehen.

Ich habe da noch ne andere Idee... melde mich wieder...

von Joachim S. (oyo)


Lesenswert?

Patrick J. schrieb:
> Bastelst Du an einem WahloMat, bei Dem man mehr als 8 (Alle ?) Parteien
> gescannt bekommt?

Ja, ich spiele mit dem Gedanken einen minimalistischen Wahl-o-Mat-Ersatz 
zu programmieren, mit ein paar Veränderungen, die mich beim 
Original-Wahl-o-Mat stören.
Die unnötige Beschränkung auf 8 Parteien war für mich in der Tat der 
konkrete Auslöser (schon die dafür genannte Begründung in der FAQ 
(https://www.wahl-o-mat.de/bundestagswahl2017/popup_faq.php#qe9) finde 
ich ein wenig skurril: "Der Wahl-O-Mat ist [..] keine Wahlempfehlung").
Weiterhin hätte ich auch gerne mehr Möglichkeiten, die einzelnen 
Aussagen zu gewichten.
Und den Umstand, dass man mit dem Wahl-o-Mat einer Thomas de Maiziere 
unterstehenden Behörde detailliert Auskunft darüber erteilt, wie man zu 
diversen Themen steht, finde ich auch ein wenig problematisch. Den 
Wahl-o-Mat haben bei der letzten Bundestagswahl immerhin fast 14 
Millionen Menschen genutzt - das ist schon ein sehr umfangreicher 
Datenschatz, den die da ansammeln, und den man potentiell auch durchaus 
missbrauchen kann.

von Altenpfleger (Gast)


Lesenswert?

Funktioniert wie ich mir das vorstellte.

Format sieht dann so aus:
Textdatei:
1.Zeile: Die Namen der Parteien:
NamePartei1,NamePartei2,NamePartei3,NamePartei4
folgende Zeilen:
Fragenummer, Fragetext, Antworten

Antworten besteht aus 4 Buchstaben, aus der Menge J|N|E
eben die Antwortspalten der jeweiligen Parteien.
J=Ok-Haken, N=Kreuz also nein, E=Minus enthalten/keine Antwort

Das ganze je PDF-Seite.
Das kannste dann ja von Python aus auslesen.

Ich stell die Daten heute im Laufe des Tages hier rein.

von Altenpfleger (Gast)


Angehängte Dateien:

Lesenswert?

Dateizuordnung habe ich jetzt weggelassen,
das musst du pro Seite noch selber machen, die gibt man dann händisch
ein, da lohnt sich eine automatische Extrahierung nicht, eintippen geht
da schneller.

Daten sind jetzt seitenweise extrahiert:
Frage inkl. Nummerierung;Antworten

Antwortaufbau wie oben

von Altenpfleger (Gast)


Lesenswert?

Sollte Parteizuordnung heissen, nicht Dateizuordnung.

von Joachim S. (oyo)


Angehängte Dateien:

Lesenswert?

Altenpfleger schrieb:
> Dateizuordnung habe ich jetzt weggelassen,
> das musst du pro Seite noch selber machen, die gibt man dann händisch
> ein, da lohnt sich eine automatische Extrahierung nicht, eintippen geht
> da schneller.
>
> Daten sind jetzt seitenweise extrahiert:
> Frage inkl. Nummerierung;Antworten
>
> Antwortaufbau wie oben

Ui, vielen Dank, dass Du Dir die ganze Mühe gemacht hast! Ich weiss ja 
gar nicht, was ich sagen soll...

Habe die von Dir bereit gestellten Daten jetzt mal geparst und mit den 
Namen der Parteien verknüpft. Falls noch Jemand an den Daten 
interessiert ist:
In der Anlage dieses Postings befindet sich eine JSON-Datei, in der alle 
Fragen (in Original-Reihenfolge) sowie die Antworten aller Parteien 
aufgelistet sind. Die Antworten der Parteien sind dabei als ein jeweils 
38 Zeichen langer String angegeben, der aus den Zeichen "J" (=ja bzw. 
stimme zu), "N" (=nein, bzw. stimme nicht zu) und "-" (=neutral) 
besteht.

von Joachim S. (oyo)


Lesenswert?

Ich habe aus dem Ganzen mal eine minimalistische Web-App gemacht -
falls es Jemand mal ausprobieren möchte:
https://cdn.rawgit.com/oyooyo/wahl-helfer/master/html/wahl-helfer.html?wahl=bundestagswahl2017

von lalelu (Gast)


Lesenswert?

Ich habs gerade mal ausprobiert. Super Arbeit!
Hast Du was dagegen, wenn der Link weitergegeben wird?

Noch ein paar kleine Hinweise:
Nochmal eine Übersicht von den Antworten der Parteien wäre auf der Seite 
ganz geschickt.
Ist es eigentlich Absicht, dass die Auswertung immer nach ganz unten 
scrollt (Firefox 55.0.3)? Das stört etwas, wenn man nochmal an den 
Antworten schraubt und sich die Veränderung anschauen will.

von Interessierter (Gast)


Lesenswert?

Danke für Eure Mühen.
Kannst Du bitte die ganze Scripterei weglassen und einfach HTML-Seiten 
verwenden? Bei
https://cdn.rawgit.com/oyooyo/wahl-helfer/master/html/wahl-helfer.html#theses-tabpanel
https://cdn.rawgit.com/oyooyo/wahl-helfer/master/html/wahl-helfer.html#parties-tabpanel
kommt bei mir der selbe Inhalt wie auf den Hauptseite.

von Joachim S. (oyo)


Lesenswert?

lalelu schrieb:
> Ich habs gerade mal ausprobiert. Super Arbeit!
> Hast Du was dagegen, wenn der Link weitergegeben wird?

Nein, natürlich nicht. Würde mich ja vielmehr freuen, wenn das auch 
andere nützlich finden.

> Noch ein paar kleine Hinweise:
> Nochmal eine Übersicht von den Antworten der Parteien wäre auf der Seite
> ganz geschickt.

Das stimmt. Derzeit ist es ja eh noch extrem minimalistisch, und das ist 
wohl so mit der wichtigste, was man noch hinzufügen sollte.

> Ist es eigentlich Absicht, dass die Auswertung immer nach ganz unten
> scrollt (Firefox 55.0.3)? Das stört etwas, wenn man nochmal an den
> Antworten schraubt und sich die Veränderung anschauen will.

Nein, das ist keine Absicht. Kann mir das momentan nur so erklären, dass 
das daher kommt, weil ich die Auswertungs-Seite komplett neu aufbaue, 
sobald irgend etwas verändert wird.

Ich habe es eben mal probiert, komischerweise kann ich das Problem nicht 
einmal reproduzieren (hier: Firefox 55.0.2 auf Ubuntu).

von Joachim S. (oyo)


Lesenswert?

Interessierter schrieb:
> Danke für Eure Mühen.
> Kannst Du bitte die ganze Scripterei weglassen und einfach HTML-Seiten
> verwenden? Bei
> 
https://cdn.rawgit.com/oyooyo/wahl-helfer/master/html/wahl-helfer.html#theses-tabpanel
> 
https://cdn.rawgit.com/oyooyo/wahl-helfer/master/html/wahl-helfer.html#parties-tabpanel
> kommt bei mir der selbe Inhalt wie auf den Hauptseite.

Ich verstehe gerade nicht ganz, was Du genau meinst.
Ich habe das Ganze ja ganz bewusst so implementiert, dass keinerlei 
Daten an's Internet gesendet werden, und die Auswertung komplett auf dem 
Endgerät des Benutzers passiert - komplett ohne Skripte geht es also eh 
nicht, sofern ich diese Eigenschaft beibehalten möchte... :-(

Auf die Javascripte von jQuery, bootstrap und poppler.js würde ich 
hingegen liebend gerne verzichten - die werden eh nur benötigt, damit 
man zwischen den Tabs umschalten kann.

: Bearbeitet durch User
von wähler (Gast)


Lesenswert?

Patrick J. schrieb:
> ... kann doch nicht sein, daß die Berechnung der Prozente zwar bei 8
> Parteien klappt, aber bei Allen nicht möglich scheint ... vll. Mal einen
> ATtiny drauf ansetzen ...

Ich halte das für ganz sinnvoll so wie es ist, das motiviert dazu sich 
wenigstens ein bisschen selbst mit den Parteien auseinanderzusetzen, 
anstatt blind den "Gewinner" in einer vollständigen Liste zu wählen.

von Joachim S. (oyo)


Lesenswert?

wähler schrieb:
> Patrick J. schrieb:
>> ... kann doch nicht sein, daß die Berechnung der Prozente zwar bei 8
>> Parteien klappt, aber bei Allen nicht möglich scheint ... vll. Mal einen
>> ATtiny drauf ansetzen ...
>
> Ich halte das für ganz sinnvoll so wie es ist, das motiviert dazu sich
> wenigstens ein bisschen selbst mit den Parteien auseinanderzusetzen,
> anstatt blind den "Gewinner" in einer vollständigen Liste zu wählen.

Ich denke, dass in der Praxis die Allerwenigsten tatsächlich blind die 
Partei wählen würden, die als Gewinner herauskommt, ohne sich zumindest 
mehr über diese Partei zu informieren.

Schon deshalb, weil die meisten der 32 Parteien realistisch betrachtet 
eh keine Chance haben, die undemokratische 5%-Hürde zu nehmen (die 
leider wie eine fast unüberwindbare Markteintrittsbarriere verhindert, 
dass sich neue Parteien etablieren können).

Ich persönlich fand den Vergleich aller Parteien schon deshalb 
interessant, weil SPD & CDU es bei mir tatsächlich geschafft haben, 
abgeschlagen auf den beiden letzten Plätzen zu landen. Bei stolzen 32 
Parteien ist das schon eine gewisse Leistung... ;-)

von Cyblord -. (Gast)


Lesenswert?

Joachim S. schrieb:
> Schon deshalb, weil die meisten der 32 Parteien realistisch betrachtet
> eh keine Chance haben, die undemokratische 5%-Hürde zu nehmen (die
> leider wie eine fast unüberwindbare Markteintrittsbarriere verhindert,
> dass sich neue Parteien etablieren können).

Naja wenn man sich diese Meisten anguckt, verwundert das auch nicht und 
die brauchts dann auch nicht im Bundestag. Mit dem richtigen Angebot 
können sich offenbar doch neue Teilnehmer einen Zugang zum 
Vollversorgungsmarkt öffnen, siehe AfD. Dass deren Einzug zusammen mit 
der FDP dazu führen wird, dass CDU und SPD in zweistelliger Zahl Mandate 
verlieren werden und sicher geglaubte Landeslistenpositionen doch nicht 
mehr so sicher sind, machts die Sache schon wert. Spaßig fände ich noch 
das mediale Wundenlecken, wenns für Platz 3 reicht.

von Steffen W. (derwarze)


Lesenswert?

Interessierter schrieb:
> Danke für Eure Mühen.
> Kannst Du bitte die ganze Scripterei weglassen und einfach HTML-Seiten
> verwenden? Bei
> 
https://cdn.rawgit.com/oyooyo/wahl-helfer/master/html/wahl-helfer.html#theses-tabpanel
> 
https://cdn.rawgit.com/oyooyo/wahl-helfer/master/html/wahl-helfer.html#parties-tabpanel
> kommt bei mir der selbe Inhalt wie auf den Hauptseite.

Diese Links funktionieren bei mir nicht, die Fragedaten werden nicht 
geladen.

Die von Joachim angegebene Seite funktioniert einwandfrei. Danke dafür 
ist ein prima Service.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.