Textverarbeitung mit Perl

Perl Praxis 7

In dieser Übung arbeiten wir mit der defined Funktion, printf (erlaubt schöneren Output) und ersten regulären Ausdrücken, und üben den Umgang mit Hashes, Listen, und Subroutinen weiter.


Dieses Programm errechnet die durchschnittliche Wortlänge in einem Text.

printf
#!/usr/local/bin/perl
#errechnet die durchschnittliche Laenge der Worte in einem Text 

#wordlength.pl FILE

 while (<>) {
     chomp;        
     tr/A-Z/a-z/;    #alles klein geschrieben
     tr/;:,.!-'"'?{}{}//d;   #Satzzeichen weg
     foreach $w (split) {
         $words++;   # Anzahl von Worten
         $wordlength = $wordlength + length($w);  #Laenge insgesamt
     }        
 }         

$average = $wordlength/$words;     #durchschnittliche Laenge
print "Durchschnittliche Wortlaenge = $average\n"; 

Übung 7.1. Kopiere oder tippe das Programm in einen Editor und probiere es mit hexe.txt oder emerald.txt aus. Wie sieht das Resultat aus?
Übung 7.2. Perl nimmt es sehr genau und druckt das Result zu mehreren Stellen hinter dem Komma/Punkt aus. Das ist oft zu genau für uns: ein zwei-stelliges Resultat würde ausreichen (und uns mehr sagen). Ändere das Programm mittels printf, so dass dies geschieht: printf "Durchschnittliche Wortlaenge = %4.2f\n", $average;
Übung 7.3. Jetzt kombiniere dieses Programm mit dem Programm wordcount-sort.pl aus Perl Praxis 6 (d.h., mach aus 2 Programmen eines) und ändere den Output von wordcount-sort.pl so, dass der Output schöner gedruckt wird, z.B.: printf "%-15s: %4d\n", $w, $count{$w}; (N.B. dies druckt die Resultate in umgekehrter Reihenfolge aus, als das im originalen Programm der Fall war). Sei dir sicher, dass du all Komponenten des printf Kommandos verstehst.


Wortarten

Das folgende Programm geht einen Text durch, zählt die Anzahl von funktionalen Wörtern im Text und errechnet dann die Proportion von funktionalen zu lexikalischen (semantisch inhaltsvollen) Wörtern.

Funktionale Wörter
#!/usr/local/bin/perl
#errechnet das Verhaeltnis von funktionalen zu lexikalischen Worten in
#einem Text 

#gramzaehl.pl FILE

#eine Approximation der funktionale Woerter im Deutschen, in einer Liste

@gramlist = qw(und oder der die das den dem ein eine einer einen 
einem wie sein ist bin bist sind aber es kein des wird kann);

#some English functional words, in a list (stoplist)

#@gramlist = qw(and or the a  be is are was were but it to every will can);

foreach $member (@gramlist) {
    $gramwords{$member} = 0;         #baue Hash von Liste
	}

while (<>) {
    chomp;
    tr/A-Z/a-z/;   #alles klein
    tr/.,:;!?"(){}//d;   #Satzzeichen weg
    foreach $w (split) {  #fuer jedes Wort 
        $words++;       #zaehle es 
        $gramwds++ if defined($gramwords{$w})  #falls funktional, zaehlen 
    }
}

$lextokens = $words - $gramwds;    #Anzahl lexikalischer Worte
$prop = $lextokens/$gramwds;       #Verhaeltnis von lexikalisch zu funktional

print "Es gibt $words Woerter, von diesen sind $gramwds funktional, $lextokens lexikalisch.";
print "\nProportion von lexikalisch zu funktional = $prop\n"; 

Übung 7.4. Kopiere oder tippe das Programm in einen Editor und probiere es mit hexe.txt aus. Wie sieht das Resultat aus?
Übung 7.5. Ändere das Programm mittels printf, so dass das Resultat nur zweistellig hinter dem Punkt ausgedruckt wird.
Übung 7.6. Siehe dir den Text hexe.txt (wenn man mit emerald.txt arbeitet sollte man die englische stop list nehmen) genauer an. Wenn wir auch Modalverben wie "sollen" oder "muessen" zur Liste der funktionalen Worte zaehlen, dann muss der Inhalt der gramlist verändert werden. Experimentiere ein bisschen, in dem du die Liste veränderst und dann die verschiedenen Resultate miteinander vergleichst.
Übung 7.7. Eigentlich wäre es schön, wenn man die Liste der gefundenen funktionalen Wörter auch ansehen könnte. Ändere das Programm, so dass die funktionalen Wörter nicht nur gezählt, sondern auch gleich in einem Hash abgespeichert werden (siehe wordcount-sort.pl aus Perl Praxis 6). Unter anderem muss die if-Kontrollstruktur umgebaut werden, so dass die funktionalen Wörter nicht nur gezählt werden, sondern auch gleich in eine Datenstruktur getan werden (d.h., man kann das gramwds++ nicht weiter vor der if-Kontrollstruktur lassen, sondern muaa es ordentlich in den Körper der if-Kontrollstruktur einbauen). Nicht vergessen, den Hash mit den funktionalen Wörtern auch auszudrucken!
Übung 7.8. Nun sortiere noch die gesammelten funktionalen Wörter mittels sort by_number und drucke sie mit printf schön aus.


Dieses Programm durchsucht einen Text nach Zeilen, die ein Wort enthalten, das die Buchstaben hexe enthät.

Reguläre Ausdrücke
#!/usr/local/bin/perl
#druckt Zeilen mit -hexe- Woertern 

#reg.pl FILE

    while (<>) {       #waehrend es noch Text gibt
      print if /hexe/i;  #drucke Zeilen mit "hexe" drin
     } 

Übung 7.9. Kopiere oder tippe das Programm in einen Editor und probiere es mit hexe.txt aus. Wie sieht das Resultat aus?
Übung 7.10. Ändere den regulären Ausdruck zu /hexe\W/i und probiere das neue Programm aus. Was ist der Unterschied?
Übung 7.11. Ändere das Programm, so dass es Zeilen ausdruckt, die das Muster mal enthalten.


Dieses Programm durchsucht einen Text nach Wörtern, die ein -en- (Deutsch) oder -ed (Englisch) enthalten, druckt sie aus und gibt an, wieviele gefunden wurden.

Reguläre Ausdrücke II
#!/usr/local/bin/perl
#druckt Worte die -en- enthalten 

# en.pl FILE

    while (<>) {       #waehrend es noch Text gibt
      chomp; 
      foreach $wd (split) {   #jedes Wort ansehen 
	  if ($wd =~ /en/i) {   #falls ein -en- vorhanden
#	  if ($wd =~ /ed/i) {   #falls ein -ed vorhanden
	      printf "%-15s\n", $wd;   #ausdrucken 
	      $var++;    #und zaehlen
			    }
			  }
	       }

printf "Es gab %2d Woerter mit -en-.\n", $var; 
#printf "There were  %2d words with -ed-.\n", $var;

Übung 7.12. Kopiere oder tippe das Programm in einen Editor und probiere es mit hexe.txt oder emerald.txt aus. Wie sieht das Resultat aus?
Übung 7.13. Es gibt noch eine Unschönheit, nämlich dass auch noch Satzzeichen bei einigen Wörtern mit dabei sind. Ändere das Programm, so dass die Satzzeichen ausgelassen werden.
Übung 7.14. Ändere das Programm, so dass nach Worten gesucht wird, die ein ge (Deutsch) oder re (Englisch) enthalten. Das Programm sollte die Liste von Worten ausgeben.
Übung 7.15. Ändere das Programm weiter, so dass auch nur die Worte gefunden werden, die ein ge (Deutsch) oder re (Englisch) am Wortanfang enthalten. Das Programm sollte alle Worte mit ge oder re, die diese Buchstaben am Wortanfang enthalten.



Bitte die Übungen bis 16.7. an Anja Leiderer schicken!

Ende