Am häufigsten verwendete Worte eines PDF ausgeben lassen

L

LouisXIV

Gast
Guten Morgen!

Ich suche nach einer Möglichkeit, bevorzugt eine Linux- oder Windows-Anwendung, die PDF-Dokumente hinsichtlich ihres Inhalts analysieren und eine nach der Häufigkeit der verwendeten Worte sortierte Ausgabe erstellen kann.

Vielen Dank für eure Hinweise.
 
Zuletzt bearbeitet von einem Moderator:
Das Problem dabei dürfte sein, das nicht garantiert ist, das die Wörter im PDF als Klartext enthalten sind.
Deswegen dürfte als erster Schritt eine der hier beschriebenen Möglichkeiten notwendig sein, Text aus dem PDF zu extrahieren. Und als zweiter Schritt wird dann ein Zählprogramm auf den reinen Text angesetzt
 
  • Gefällt mir
Reaktionen: adAstra
Vielen Dank für eure Antworten!

Als technikaffiner, aber nicht programmierfähiger User bin ich ein wenig überwältigt, dass es für diese - für mich relativ naheliegende - Funktionalität keinen automatisierten Mechanismus gibt.

Da ich momentan in einer Linux-Distribution unterwegs bin, habe ich inzwischen mit pdftotext den Inhalt meines PDF in eine Textdatei extrahiert. Trotz folgender Syntax Warning hat die Maßnahme augenscheinlich funktioniert. Es wurde auf jeden Fall eine test.txt angelegt, die auch korrekt und vollständig eingelesen zu sein scheint:
Code:
louisxiv@pc:~/Dokumente> pdftotext /home/louisxiv/Dokumente/test.pdf /home/louisxiv/Dokumente/test.txt
Syntax Warning: Invalid Font Weight

Da ich den von @KuestenNebel verlinkten Python-Code leider weder verstehe, noch weiß, wie ich ihn überhaupt ausführe, hat man mir in meiner Linux-Community zu einem bash-Skript nach folgender Vorlage geraten:
https://unix.stackexchange.com/questions/41479/find-n-most-frequent-words-in-a-file

Dabei habe ich zuerst den Code des Threaderstellers genutzt, wobei dieser eine Ausgabe produziert, deren Inhalt sich mir nicht erschließt:
Code:
cat test.txt | tr -c '[:alnum:]' '[\n*]' | uniq -c | sort -nr | head  -3
    183
    177
    173

Also habe ich den Hinweis der am besten bewerteten Antwort integriert und ein "sort" eingefügt, was bereits deutlich bessere Ergebnisse gebracht hat:
Code:
cat test.txt | tr -c '[:alnum:]' '[\n*]' | sort | uniq -c | sort -nr | head  -3
  33449
   2038 und
   1757 die

Das gleiche Ergebnis ergibt sich übrigens auch aus der alternativen Form des Codes:
Code:
tr -c '[:alnum:]' '[\n*]' < test.txt | sort | uniq -c | sort -nr | head  -3

Problematisch ist, dass die vom Code verlangte von "tr" zu interpretierende Zeichenmenge nicht mit deutschen Sonderzeichen wie Umlauten zurecht kommt. Die Worte werden an den Stellen der Sonderzeichen abgehakt und verfälschen das Wortzählergebnis.
Nach einem Blick in "tr --help" habe ich es abgesehen von "alnum" auch mit "graph" versucht, leider ohne Erfolg.
Code:
tr --help
Aufruf: tr [OPTION]… MENGE1 [MENGE2]
Zeichen bei Ausgabe auf Standardeingabe wandeln, verdichten und/oder löschen

  -c, -C, --complement    das Komplement von MENGE1 verwenden
  -d, --delete            Zeichen der MENGE1 löschen, nicht wandeln
  -s, --squeeze-repeats   jede Eingabefolge eines wiederholten Zeichens, das
                            in MENGE1 enthalten ist, durch ein einzelnes
                            Vorkommens dieses Zeichens ersetzen
  -t, --truncate-set1     zuerst MENGE1 auf die Länge von MENGE2 abschneiden
      --help     diese Hilfe anzeigen und beenden
      --version  Versionsinformation anzeigen und beenden

MENGEn werden angegeben als Zeichenketten. Die meisten Zeichen stehen für sich
selbst. Interpretierte Folgen sind:

  \NNN            Zeichen mit Oktalwert NNN (1 bis 3 oktale Ziffern)
  \\              Rückschrägstrich (\)
  \a              hörbarer Ton (Piep)
  \b              Zeichen zurück
  \f              Seitenvorschub
  \n              Zeilenvorschub
  \r              Wagenrücklauf
  \t              horizontaler Tabulator
  \v              vertikaler Tabulator
  ZEICH1-ZEICH2   alle Zeichen von ZEICH1 bis ZEICH2 aufsteigend
  [ZEICH*]        in MENGE2, Kopien von ZEICH bis zur Länge von MENGE1
  [ZEICH*ANZ]     ANZ Kopien von ZEICHEN, ANZ ist oktal, wenn es mit 0 beginnt
  [:alnum:]       alle Buchstaben und Ziffern
  [:alpha:]       alle Buchstaben
  [:blank:]       alle horizontalen Leerzeichen/Tabulatoren
  [:cntrl:]       alle Steuerzeichen
  [:digit:]       alle Ziffern
  [:graph:]       alle druckbaren Zeichen, ohne Leerzeichen
  [:lower:]       alle Kleinbuchstaben
  [:print:]       alle druckbaren Zeichen, einschl. Leerzeichen
  [:punct:]       alle Satzzeichen
  [:space:]       alle horizontalen oder vertikalen Leerzeichen/Tabulatoren
  [:upper:]       alle Großbuchstaben
  [:xdigit:]      alle hexadezimalen Ziffern
  [=ZEICHEN=]     alle Zeichen äquivalent zu ZEICHEN

Also habe ich es mit Hilfe einer Unicode-Tabelle mit einer Zeichenmenge ZEICH1-ZEICH2 von A bis ω versucht, da mir diese als unsaubere, aber für wissenschaftliche Texte praktikable Lösung erschien:
Code:
tr -c 'A-ω' '[\n*]' < test.txt | sort | uniq -c | sort -nr | head  -3

Tatsächlich sind Umlaute damit kein Problem mehr, die nicht erkannten Einträge und abgehakten Worte halten sich in Grenzen. Dennoch würde ich gerne eine elegantere Lösung für die Zeichenmenge finden. Jemand eine Idee?

Weiterhin erkennt man an 33449 Einträgen "", 2038 "und" sowie 1757 "die", dass die Ergebnisliste durch viele für mich inhaltlich irrelevante Einträge sehr aufgeblasen ist.

Der Autor der populärsten Antwort im geteilten Link adressiert dies durch das Einbinden einer "stop words"-Liste "eign".
Code:
tr -c '[:alnum:]' '[\n*]' < test.txt | fgrep -v -w -f /usr/share/groff/current/eign | sort | uniq -c | sort -nr | head  -3
Diese liegt in meiner Distribution jedoch leider nicht einmal in Englisch vor. Habt ihr einen Hinweis, wo es seriöse solcher Listen für Englisch und Deutsch herunterzuladen gibt und/oder wie ich nur Einträge mit größergleich 4 Zeichen anzeigen lassen kann?
 
Zuletzt bearbeitet von einem Moderator:
bin ich ein wenig überwältigt, dass es für diese - für mich relativ naheliegende - Funktionalität
Weil die offenbar keiner braucht?!
Das müssten schon technische (naturwissenschaftliche) Texte sein wenn das was bringen soll. Fließtexte wie Grimms Märchen oder das BGB - mit was für Aufstellungen rechnest du da, bitte?
Gäbe es andere Ansätze zum Ziel zu kommen?
CN8
 
Übrigens müsstest Du erstmal klären was Du unter einem "Wort" verstehen willst.

In dem Satz "er sah, dass sie sahen", kommt da "sehen" zweimal vor oder "sah" und "sahen" jeweils einmal?

Dein Problem zerfällt in zwei Teilprobleme: Text aus pdfs zu extrahieren (ist im allgemeinen Fall durchaus nicht trivial) und dann den Text zu analysieren (also eventuell erstmal ein "stemming" etc zu machen - siehe das Beispiel oben).

Es gibt zumindest umfangreiche Bibliotheken für "natural language processing", wenn auch vielleicht keine unmittelbar fertige Software.
 
Danke für deine Antwort.

Es geht mir im Moment um "sah" und "sahen", also das exakt Geschriebene, nicht um eine tiefgreifendere Interpretation, Konjugationen oder ähnliches.
Das ganze Unterfangen soll mir helfen ein Wortfeld, in erster Linie die Substantive, zu erschließen, die von den Autoren bevorzugt genutzt werden, um ihre Themen darzustellen.
 
Bei Substantiven gibt es das Problem genauso. Willst Du etwa Singular und Plural jeweils extra zählen?

Wenn es um Wortfelder geht nehme ich an es wäre sauberer Singuar und Pluralvorkommen gemeinsam zu zählen und dann kannst Du eben nicht einfach Vorkommen nehmen, sondern musst einen Extraschritt machen um die Vorkommen zu normalisieren.
 
Ich stimme dir zur, möchte nur anmerken, dass an das Unterfangen kein wissenschaftlicher Maßstab angelegt werden muss, ich möchte das aus persönlichem Interesse checken. Je höher die mit vertretbarem Aufwand erreichte Qualität, umso besser natürlich.
 
Ich würde Dir aber auf jeden Fall raten dieses shell-Gepfriemel zu lassen und eine vernüftige Scriptsprache zu nehmen (python oder perl).

Du hast somst jede Menge Probeme.

Nur ein Beispiel:

Wenn Du kein "-enc" mitgibst erzeugt pdftotext eine utf-8 Datei. Kommt tr damit zurecht? Ich weiss es nicht, aber ich vermute eher nicht. Du wirst also mit deutschen Umlauten jede Menge Spass haben.

In der Zeit in der Du diese Probleme aussortierst hast Du auch eine Skriptsprache gelernt...
 
  • Gefällt mir
Reaktionen: LouisXIV
Zurück
Oben