Aufgabe 12

1-4. Frage

Lösung

~ $ wget "http://gutenberg.spiegel.de/buch/5560/1" -O 1.html
~ $ wget "http://gutenberg.spiegel.de/buch/5560/2" -O 2.html
~ $ wget "http://gutenberg.spiegel.de/buch/5560/3" -O 3.html
~ $ wget "http://gutenberg.spiegel.de/buch/5560/4" -O 4.html
~ $
~ $ lynx -dump -assume_charset=UTF-8 -hiddenlinks=ignore -nolist -verbose 1.html 2.html 3.html 4.html > bibel.txt

5. Frage

Lösung

#!/usr/bin/perl
# Programm start: perl -C datei_name.perl

# Aufgabe 12.5
# Datei: aufg_12_5.perl
# Die ersten 4 Bucher Moses runterladen und in die Datei "bibel.txt" zusammenfügen

use strict;
use warnings;

my $bibel="";

my $anzahl_buecher =4;

for(my $i=1; $i<=$anzahl_buecher; $i++){
   my $url ="wget \"http://gutenberg.spiegel.de/buch/5560/$i\" -O $i.html";
   system($url);
   
   my $fileIn = "temp.txt";
   system("lynx -dump $i.html -assume_charset=UTF-8 -hiddenlinks=ignore -nolist -verbose > $fileIn");
   open(IN, "<:utf8", $fileIn) or die "Datei $fileIn nicht gefunden!\n";
   
   undef $/;
   my $buch=<IN>;
   close(IN);
   system("rm $fileIn");
   
   # Die nächsten Zeilen sind optional. 
   # Ich lösche die unnötigen Informationen der Internetseite.
   $buch =~ s/^.+$i\. Buch Mose//s; # Den Header löschen
   my $next = $i+1;
   my $back = $i-1;
   $buch =~ s/Kapitel $next >>.*//s; # Den Footer löschen
   $buch =~ s/<< Kapitel $back.*//s; # Den Footer löschen
   $buch = "\n$i. Buch Mose".$buch; 
   # Ende optional
   
   $bibel = $bibel.$buch;
}
print $bibel;
# Aufrum im Terminal: perl -C aufg_12_5.perl > bibel.txt

# ODER

# Datei "bibel.txt" im Program erzeugen
#open(OUT, ">:utf8", "bibel.txt");
#print(OUT $bibel);
#close(OUT);

6-9. Frage

Lösung

#!/usr/bin/perl
# Programm start: perl -C datei_name.perl

use strict;
use warnings;
use utf8;

# Aufgabe 12.6
# Eine sortierte Frequenzliste aller Wörter aus der Datei "bibel.txt" erzeugen.
my($inFile, $line, @words, $word, %wordlist);
$inFile = "bibel.txt";
open (IN,$inFile) or die "File $inFile not found!";
while($line = <IN>) {
  chomp($line);
  @words = split(/[\p{Z}\p{P}]+/,$line);
  foreach $word (@words) {
    if ($word ne "") {
      $wordlist{$word}++;
    }
  }
}
close(IN);

# Aufgabe 12.7
# Anzahl unterschiedlicher Wörter in der Bibel 
my @sorted_words = sort {$wordlist{$b} <=> $wordlist{$a}} keys %wordlist;
my $numder_dif_words = scalar @sorted_words;
print "In der Bibel sind $numder_dif_words unterschiedlicher Wörter.\n";

# Aufgabe 12.8
# Die 10 wichtigsten(häufigsten) großgeschriebenen Wörter
my $counter = 0;
print "Die 10 wichtigsten(häufigsten) großgeschriebenen Wörter sind:\n";
foreach $word (@sorted_words) {
  if ($word =~ /^\p{Lu}/){
    print "$wordlist{$word}: $word\n";
    $counter++;
  }
  last if ($counter == 10);
}

# Aufgabe 12.9
# Was sind die 10 wichtigsten(häufigsten) kleingeschriebenen Wörter?
print "Die 10 wichtigsten(häufigsten) kleingeschriebenen Wörter sind:\n";
$counter = 0;
foreach $word (@sorted_words) {
  if ($word =~ /^\p{Ll}/){
    print "$wordlist{$word}: $word\n";
    $counter++;
  }
  last if ($counter == 10);
}

10. 15. 16. Frage

Lösung

#!/usr/bin/perl
# Programm start: perl -C datei_name.perl

use strict;
use warnings;
use utf8;

# Aufgabe 12.10
# das längeste Wort, das in der Bibel vorkommt

my($inFile, $line);
my $longestBibelWord = "";
my $nr_of_words = 0;

$inFile = "bibel.txt";
open (IN,$inFile) or die "File not found!";

while($line = <IN>) {
  chomp($line);
  my $longestLineWord = &longest_word($line);
  
  $longestBibelWord = $longestLineWord if (length($longestLineWord) > length($longestBibelWord));
  
  $nr_of_words += &count_words($line);
}
close IN;

print "In der Bibel sind insgesamt $nr_of_words Wörter.\n";
print "Das längste Wort (mit ".length($longestBibelWord)." Buchstaben) ist \"$longestBibelWord\".\n";

# Aufgabe 15
sub longest_word($){  # Ermittelt das längste Wort einer Zeile, wobei im Wort nur Buchstaben vorkommen dürfen.
  my $zeile = $_[0];  # INPUT: Eine Textzeile als Skalar: $zeile
  my $max = "";
  my @words = split(/[\p{Z}\p{P}]+/,$zeile);
  my $word;
  foreach $word (@words){
    if ( ($word =~/^\p{L}+$/) && (length($word) > length($max)) ){
      $max = $word;
    }
  }
  return $max;        # RETURN: Das Wort mit den meissten Buchstaben
}

# Aufgabe 16
sub count_words($){  # Ermittelt die Anzahl der Wörter in eine Zeile
  my $zeile = $_[0]; # INPUT: Eine Textzeile als Skalar: $zeile
  
  my @words = split(/[\p{Z}\p{P}]+/,$zeile);
  
  return scalar(@words); # RETURN: Die Anzahl der Wörter in der Zeile
}

ODER

#!/usr/bin/perl
# Programm start: perl -C datei_name.perl

use strict;
use warnings;
use utf8;

# Aufgabe 12.10
# das längeste Wort, das in der Bibel vorkommt

my $inFile = "bibel.txt";
open (IN,$inFile) or die "File not found!";

undef $/;
my $text_in_line = <IN>;
close IN;

my $longestBibelWord = &longest_word($text_in_line);
my $nr_of_words = &count_words($text_in_line);

print "In der Bibel sind insgesamt $nr_of_words Wörter.\n";
print "Das längste Wort (mit ".length($longestBibelWord)." Buchstaben) ist \"$longestBibelWord\".\n";

# Aufgabe 15
sub longest_word($){  # Ermittelt das längste Wort einer Zeile, wobei im Wort nur Buchstaben vorkommen dürfen.
  my $zeile = $_[0];  # INPUT: Eine Textzeile als Skalar: $zeile
  my $max = "";
  my @words = split(/[\p{Z}\p{P}]+/,$zeile);
  my $word;
  foreach $word (@words){
    if ( ($word =~/^\p{L}+$/) && (length($word) > length($max)) ){
      $max = $word;
    }
  }
  return $max;        # RETURN: Das Wort mit den meissten Buchstaben
}

# Aufgabe 16
sub count_words($){  # Ermittelt die Anzahl der Wörter in eine Zeile
  my $zeile = $_[0]; # INPUT: Eine Textzeile als Skalar: $zeile
  my @words = split(/[\p{Z}\p{P}]+/,$zeile);
  return scalar(@words); # RETURN: Die Anzahl der Wörter in der Zeile
}

11. 12. Frage

Lösung

#!/usr/bin/perl
# Programm start: perl -C datei_name.perl

use strict;
use warnings;
use utf8;

# Aufgabe 12.11
# Dem Satzendeerkenner den Text aus der Datei geben 
# und aus dem zurückgegebenen Text die Datei "bibel_satzend.txt" erstellen (Copy/Paste aus Browzer in Editor.)


# Aufgabe 12.12
# die 10 häufigsten Wörter am Satzanfang aus der Datei "bibel_satzend.txt"

my %wordlist;

my $inFile = "bibel_satzend.txt";
open (IN,$inFile) or die "File $inFile not found!";

undef $/;
my $text =<IN>;
close(IN);

$text =~ s/\n/ /g;  # Newlines durch Space erzetzen
$text =~ s/\s+/ /g; # Multiple Space durch ein Space ersetzen

my @sätze = split("{eos}", $text);

foreach my $satz (@sätze){
  if ($satz =~/^\s*(\p{L}+)\b/) {
    $wordlist{$1}++;
  }
}

my @sortierte_wörter = sort {$wordlist{$b} <=> $wordlist{$a}} keys %wordlist;

print "\nDie 10 häufigsten Wörter am Satzanfang aus der Datei \"bibel_satzend.txt\".\n";
for(my $i=0; $i<10; $i++){
  print "$wordlist{$sortierte_wörter[$i]}: $sortierte_wörter[$i]\n";
}


13. Frage

Lösung

#!/usr/bin/perl
# Programm start: perl -C datei_name.perl

# PERL-Programm, das die ersten 3 Zeilen eines jeden Kapitels von jedem Buch ausgibt. 
# Die Ausgabe soll folgende Form haben

$inFile = "bibel.txt";
open (IN,$inFile) or die "File not found!";
my $counter = 0;
while($line = <IN>) {
  chomp($line);
  
  if ( ($line =~ /[1-4]\. Buch Mose/) || ($line =~ /Kapitel \p{N}+/) ){
    print "$line\n";
    $counter = 0;
    next;
  } 
  $counter++ if ( $line =~ /^\p{Z}*\p{N}\./ );
  print "$line\n" if ( ($counter <= 3) && ($line ne "") );
}
close(IN);

14. Frage

Lösung

#!/usr/bin/perl
# Programm start: perl -C datei_name.perl

use strict;
use warnings;
use utf8;

# Aufgabe 12.14
# morpholgischen Varianten des Wortes Herr.
# wie oft die verschiedenen Varianten des Wortes Herr vorkommen.

my($inFile, $line, @words, $word, %wordlist);
$inFile = "bibel.txt";
open (IN,$inFile) or die "File not found!";
while($line = <IN>) {
  chomp($line);
  @words = split(/[\p{Z}\p{P}]+/,$line);
  foreach $word (@words) {
    if ($word =~/^Herr/i) {
      $wordlist{$word}++;
    }
  }
}
my @sortedWords = sort {$wordlist{$b} <=> $wordlist{$a}} keys %wordlist;
print "Morpholgischen Varianten und die Häufigkeit des Wortes \"Herr\":\n";
foreach $word (@sortedWords){
  print "$wordlist{$word}: $word\n";
}
close(IN);

Hier die ganze Aufgabe 12 als ein Perl-Programm.

#!/usr/bin/perl

use strict;
use warnings;
use utf8;

{
##################
###Texte holen
##################
   for (my $i = 1; $i <= 4; $i++){
      system("wget -O $i.html http://gutenberg.spiegel.de/buch/5560/$i");
      system("lynx -dump $i.html -hiddenlinks=ignore -nolist -verbose > bibel$i.txt");
   }
   system("cat bibel*.txt >> bibel.txt");
   
  
##################
###Variablen deklarieren und Dateien öffnen
##################
   my ($line,@words,$word,%lexikon,@lexikon_sortiert,$anzahl,$longest_word_in_line,$anzahl_woerter);
   my $longest_word = "";
   
   open(IN, "<utf8:", "bibel.txt");
   open(OUT, ">utf8:", "statistik.txt");
   
   
##################
###Hash erstellen und sortieren
##################
   while($line = <IN>){
      chomp($line);
      if ($line =~ /\p{L}/){
#           $longest_word_in_line = &longest_word($line);
#           $anzahl_woerter = &count_words($line);
#           #print "Anzahl Wörter pro Zeile: $anzahl_woerter\n\n";
#           if (length($longest_word_in_line) > length($longest_word)){
#              $longest_word = $longest_word_in_line;
#           }
         @words = split(/[\p{Z}\p{P}]+/,$line);
         foreach $word(@words){
            if ($word =~ /\p{L}/){
               $lexikon{$word}++;
            }
         }
      }
   }
   
#     print "Längstes Wort in der Bibel: $longest_word\n\n";
#     print OUT "Längstes Wort in der Bibel: $longest_word\n\n";
   
   @lexikon_sortiert = sort {$lexikon{$b} <=> $lexikon{$a}} keys %lexikon;

   
##################
###Anzahl unterschiedlicher Wörter ermitteln
##################
   
   $anzahl = scalar(@lexikon_sortiert);
   print "Anzahl unterschiedlicher Wörter: $anzahl\n\n"; 
   print OUT "Anzahl unterschiedlicher Wörter: $anzahl\n\n";
   
   
##################
###Die 10 häufigsten großgeschriebenen Wörter ermitteln
##################

   print "Die 10 häufigsten großgeschriebenen Wörter:\n";
   print OUT "Die 10 häufigsten großgeschriebenen Wörter:\n";
   my $zaehler = 0;
   foreach $word(@lexikon_sortiert){
      if ($word =~ /^\p{Lu}/){
         print "$word\n";
         print OUT "$word\n";
         $zaehler++;
      }
      if ($zaehler == 10){
         last;
      }
   }
   
   
##################
###Die 10 häufigsten kleingeschriebenen Wörter ermitteln
##################
   
   print "\nDie 10 häufigsten kleingeschriebenen Wörter:\n";
   print OUT "\nDie 10 häufigsten kleingeschriebenen Wörter:\n";
   $zaehler = 0;
   foreach $word(@lexikon_sortiert){
      if ($word =~ /^\p{Ll}/){
         print "$word\n";
         print OUT "$word\n";
         $zaehler++;
      }
      if ($zaehler == 10){
         last;
      }
   }
   
   
##################
###Datei mit den end-of-sentence-Tags öffnen und in eine skalare Variable einlesen
##################
   
   open(EOS, "<utf8:", "eos.txt");
   
   $/ = undef;
   
   $line = <EOS>;
   
   $/ = "\n";
   
   
##################
###Hash aller Wörter an Satzanfängen erstellen und die 10 häufigsten ausgeben
##################
   
   my %satzanfänge;
   while($line =~ /\{eos\}.+?([\p{L}\p{N}]+)\b/gs){
      $satzanfänge{$1}++;
   }
   my @satzanfänge_sortiert = sort {$satzanfänge{$b} <=> $satzanfänge{$a}} keys %satzanfänge;
   print "\nDie 10 häufigsten Satzanfänge:\n";
   print OUT "\nDie 10 häufigsten Satzanfänge:\n";
   $zaehler = 0;
   foreach $word(@satzanfänge_sortiert){
      print "$word\n";
      print OUT "$word\n";
      $zaehler++;
      if ($zaehler == 10){
         last;
      }
   }
   
close(IN);
close(EOS);
close(OUT);
}


##################
###Subroutinen
##################


sub longest_word($){
   my $zeile = shift(@_);
   my $longestword= "";
   my ($word,@words);
   @words = split(/[\p{Z}\p{P}]+/,$zeile);
   foreach $word(@words){
     if ((length($word) > length($longestword))&&($word =~ /^\p{L}+$/)) {
        $longestword = $word;
     }
   }
   return ($longestword);
}
 

 sub count_words($){
   my $zeile = shift(@_);
   my @words = split(/[\p{Z}\p{P}]+/,$zeile);
   my $anzahl_woerter = scalar(@words);
   return $anzahl_woerter;
}