# Erstellt von Martin Schlederer, martin.schlederer@t-online.de # Nov 2008, Status: im Test etestet (noch nicht mit großen Dateien # Ermitteln der Anzahl von Wörtern, die in einer Datei vorkommen # Grundlage zur Erstellung einer Sprachmetrik my $blackisback=1; my @bl; my $html=0; my $zu_kleiner_Anteil = 0.1; open(BLACK,"; close(BLACK); } foreach(@ARGV) { if(/-h/) {$html=1;} if(/-\?/) { print "***************************************************\n"; print "* Usage: perl msllit.pl Dateiname *\n"; print "* \h Erzeuge HTML-Tabellen *\n"; print "***************************************************\n"; } } open(INFILE,$ARGV[0]) or die or die "Kann leider $ARGV[0] nicht öffnen!";; my $buffergr=100000; # my $buffergr=50; my %hashliste; my %anzliste; my @sortlist; # Umwandlung der Hashes in Liste zur Ausgabe my $zeichen; my $wort; my $gelesen; my $zeilen; my $i; my $nachlegen; my $nachzeile; my $weg; # Wenn ein Wort nicht in die Liste aufgenommen werden soll. my $ges_z=0; my $zeichen = "."; # Einzeichiges Lesen bis zum nächsten Blank my @wortliste; # Liste der Wörter in $gelesen my $anz_w = 0; # Gesamtanzahl der separierten Worte while(!eof(INFILE)) { $gelesen = read(INFILE,$zeilen,$buffergr); #lese bis zum nächsten Blank, wenn Puffer mitten drin abbricht. $zeichen="."; while( (!eof(INFILE)) && ($zeichen ne " ")) { $gelesen = read(INFILE,$zeichen,1); $zeilen .= $zeichen; } $zeilen =~ s/\n/ /g; # Alle Zeilenumbrüche entfernen $zeilen =~ s/ +/ /g; $zeilen =~ s/[-.,":;„!1234567890\(\)\?']//g; # Alle Trennstriche, Punkte und Kommata entfernen @wortliste = split(/ /,$zeilen); $gelesen = scalar(@wortliste); $anz_w += $gelesen; foreach(@wortliste) { $weg=0; $wort=$_; if(/^[a-z]/){ next; } # Wörter mit Kleinbuchstaben sollen ignoriert werden if(/^$/){ next; } if ($blackisback == 1) { foreach(@bl) { s/\n//g; if($wort eq $_){ $weg =1; } } } if ($weg == 0) { $hashliste{$_}=$_; $anzliste{$_} +=1; $ges_w +=1; } } } close(INFILE); @sortlist = sort {$anzliste{$a} <=> $anzliste{$b}} keys(%anzliste); @sortlist = reverse(@sortlist); my $anteil; if ($html == 1) { print "\n\n Wortanalyse zur Datei $ARGV[0] \n"; print "\n"; print "

Wortanalyse der Datei $ARGV[0] zur Definition metrischer Räume auf Texten

\n"; print "

Die Anzahl eines bestimmten Wortes im Verhältnis zur Gesamtwortzahl macht Texte völlig unterschiedlicher Herkunft bezüglich dieses Wortes vergleichbar. Wenn man die deutsche Sprache als Vektorraum sieht, bildet jedes Wort eine Dimension. Beispiel: Bestünde die deutsche Sprache nur aus den Worten \"Du\" und \"bist\". Der Satz \"Du bist du\" entspricht dem Vektor (2,1). Die nachfolgende Datei ist damit ein individueller Bedeutungsvektor im multidimensionalen Semantikraum der deutschen Sprache. Er hat eine Richtung, eine Länge, eine Basis und einen Ursprung. Jeder Text spannt seinen eigenen Vektorraum auf. Sätze und Abschnitte können als Untervektorräume gesehen werden. Viel Spaß beim Analysieren und vergleichen von Texten

\n"; print "

Es wurden $ges_w Namenwörter und $anz_w Wörter insgesamt gezählt. Es tauchen nur Namenwörter auf, deren Anteil über 0,1 % liegt. Andere Wortarten sind nicht aussagekräftig und verwässern das Ergebnis.

\n"; print "

Erstellt von Martin Schlederer

\n"; # print "

Anzahl\tAnteil in % \tWort\n

\n"; print "\n"; print "\n"; foreach(@sortlist) { $anteil = ($anzliste{$_} / $ges_w)*100; if ($anteil < $zu_kleiner_Anteil) { next;} printf("\n",$anzliste{$_},$anteil,$_); } print "

Anzahl

Anteil in %

Wort

%s%.3f%%s
\n"; print "
\n"; print "\n"; print "\n"; } else { print "Anzahl\tAnteil in % \tWort\n"; foreach(@sortlist) { $anteil = ($anzliste{$_} / $ges_w)*100; printf("%s\t%.3f%\t\t%s\n",$anzliste{$_},$anteil,$_); } print "Es wurden $ges_w Worte gezählt\n"; }