Deutscher Wortsack
Spässle zur Entspannung
Ein kleines, lustiges Hilfsmodul
Da
ich bei meinen letzten Perl-Programmierungen weitere Routine im Umgang
und mit dem Einsatz von Modulen gesammelt habe, dachte ich mir, daß ich
heute mal einen kleinen Versuch starten könnte, ein witziges Minimodul
zu erstellen, was sich - falls es sich als nützlich erweist - ohne
Weiteres zu einem komfortableren Modell erweitern läßt, unter Umständen
sogar unter Verwendung einer PostgreSQL-Datenbank, die Wortsäcke
einsammeln hilft. "Wortsäcke"? Was? Nu ja, dazu kommen wir jetzt ...
gleich.
Grobentwurf
Code Modul
#!/usr/bin/perl
# de_wortsack.pm
# Wird kopiert per 'sudo cp de_wortsack.pm /usXXXXXXXXXXX/de_wortsack.pm'
## Muß ggf. in Zukunft angepasst werden
package de_wortsack;
use strict;
use warnings;
use Encode qw(is_utf8 decode encode);
use Exporter qw(import);
our @EXPORT = qw(wortsack);
# Kurze Rückmeldung
print "\nHier meldet sich das Modul \"de_wortsack.pm\": Hallihallo!\n\n";
###########################################################
############### Subroutinen ####################
###########################################################
# Subroutinen für Export
sub wortsack {
my $text = shift;
my $sackwort = shift;
print "\n\nKUCKUCK!!!\n\n";
print "\n\nDas Sackwort lautet: $sackwort.\n\n";
}
1;
Code Modul-Testproggi
#!/usr/bin/perl
# deutscher_wortsack-testproggi.pl
use strict;
use warnings;
use de_wortsack qw(wortsack);
# Programm
## Eingabeaufforderung
print "\nBitte den Pfad zum Text angeben!\n\n";
my $textdatei = <STDIN>;
chomp $textdatei;
print "\nBitte das Wort, das eingesackt werden soll, eingeben (nur Substantive!)!\n\n";
my $sackwort = <STDIN>;
chomp $sackwort;
## Textdatei laden
### per Default bleibt 'testtext.txt' in diesem Verzeichnis eingestellt
$textdatei = 'testtext.txt';
### Laden und in Textstring einlesen
my $text;
open ( my $fh, '<', './'.$textdatei );
$text = do { local $/; <$fh> };
close $fh;
#### Probedruck
print "\n$text\n\n";
## Übergabe der Parameter
wortsack($text,$sackwort);
Erster Output
perl deutscher_wortsack-testproggi.pl
Hier meldet sich das Modul "de_wortsack.pm": Hallihallo!
Bitte den Pfad zum Text angeben!
nö, gebe ich nicht an
Bitte das Wort, das eingesackt werden soll, eingeben (nur Substantive!)!
Schwaben
de.wikipedia.org
Schwaben – Wikipedia
19-23 Minuten
Karte des Schwäbischen Kreises 1572
Schwaben
ist ein historischer politischer Raum, dessen Bezeichnung auch
gegenwärtig für dieses Gebiet in der Gebrauchssprache verwendet wird.
Der Umfan
...
↑ Schwaben - ein Gebiet wie ein Fleckerlteppich Augsburger Allgemeine vom 16. Oktober 2008
↑ Rangendingen deutscher Online-Preisvergleichsmeister – Schwaben am sparsamsten Bei www.preis.de, vom 8. Juni 2011
KUCKUCK!!!
Das Sackwort lautet: Schwaben.
Da der Text ja erkennbar korrekt eingelesen wird, verzichte ich im folgenden auf den Probedruck.
Nächster Schritt - Codeerweiterung
sub wortsack {
my $text = shift;
my $sackwort = shift;
print "\n\nKUCKUCK!!!\n\n";
print "\n\nDas Sackwort lautet: $sackwort.\n\n";
my @wortreihe = split ( /[^a-zäöüA-ZÄÖÜß]/, $text );
print map { $_, " --> " } @wortreihe;
my @wortpos;
for ( my $i; $i <= scalar @wortreihe - 1; $i++ ) {
if ( $wortreihe[$i] =~ /$sackwort/ ) { push @wortpos, $i }
}
print "\n\nDas Sackwort kommt an folgenden Stellen vor:\n\n";
print join ( ",", map { $_ } @wortpos );
}
Output ( Ende )
-->
Internetseiten --> --> Einzelnachweise --> Bearbeiten -->
--> --> Quelltext --> bearbeiten --> --> -->
--> --> --> --> --> --> --> --> Webpage
--> https --> --> --> www --> landesmuseum -->
stuttgart --> de --> ausstellungen --> sonderausstellung
--> --> --> abgerufen --> am --> --> -->
--> --> Oktober --> --> --> --> --> -->
--> --> --> Bedeutende --> Kunstwerke --> vom -->
frühen --> Mittelalter --> bis --> zur --> Gegenwart -->
zeugen --> von --> der --> Bedeutung --> der --> Schwaben
--> Metropolen --> Konstanz --> --> Ulm --> -->
Augsburg --> und --> Stuttgart --> --> --> -->
--> --> --> --> --> --> --> Schwaben -->
--> --> ein --> Gebiet --> wie --> ein -->
Fleckerlteppich --> Augsburger --> Allgemeine --> vom -->
--> --> --> --> Oktober --> --> --> -->
--> --> --> --> --> --> --> --> -->
--> Rangendingen --> deutscher --> Online -->
Preisvergleichsmeister --> --> --> --> --> Schwaben
--> am --> sparsamsten --> Bei --> www --> preis -->
de --> --> vom --> --> --> --> Juni -->
Das Sackwort kommt an folgenden Stellen vor:
4,28,50,60,96,109,119,134,158,163,208,221,238,246,278,289,348,515,533,551,631,671,727,743,777,784,793,799,844,875,898,
909,921,953,1040,1046,1054,1151,1210,1236,1248,1598,1650,1660,1713,1742,1789,1822,1843,1892,2116,2230,2295,2323,2342,
2358,2526,2595,2627,2643,2648,2653,2658,2683,2693,2754,2858,2881,2990,3045,3108,3131,3282,3324,3332,3402,3459,3476,
3595,3614,3651
So, damit ist klar, daß es viele Säcke geben wird, mit dem Sackwort "Schwaben". Klar. Wie getippt.
Aber es fehlt noch was ... wie groß sollen die Säcke werden?
...
Sooooo ...
Nach einem Geheimrezept habe ich nun das hier ausgekocht:
...
Bitte das Wort, das eingesackt werden soll, eingeben (nur Substantive!)!
Schwaben
Wie
groß soll der Wortsack / sollen die Wortsäcke (wenn mehrere) werden?
(Die (theoretisch maximale) Anzahl der Worte ist gefragt!)
22
KUCKUCK!!!
Das Sackwort lautet: Schwaben.
...
Wortsack Nr. 2881
Band >> Gewicht: 2.75
Zeitschrift >> Gewicht: 3.66666666666667
Historischen >> Gewicht: 5.5
Vereins >> Gewicht: 7.33333333333333
Schwaben >> Gewicht: 22
Irsee >> Gewicht: 7.33333333333333
November >> Gewicht: 1.83333333333333
Wortsack Nr. 2990
Thaddäus >> Gewicht: 3.66666666666667
Troll >> Gewicht: 4.4
Deutschland >> Gewicht: 7.33333333333333
Schwaben >> Gewicht: 22
Im >> Gewicht: 7.33333333333333
Anzügle >> Gewicht: 4.4
Vordergründig >> Gewicht: 3.14285714285714
Neuausgabe >> Gewicht: 1.83333333333333
Wortsack Nr. 3045
Groß >> Gewicht: 1.83333333333333
Wolfgang >> Gewicht: 2.2
Urban >> Gewicht: 2.44444444444444
Suevia >> Gewicht: 3.14285714285714
Schwäbische >> Gewicht: 5.5
Glaubenszeugen >> Gewicht: 7.33333333333333
Schwabenverlag >> Gewicht: 22
Ostfildern >> Gewicht: 7.33333333333333
ISBN >> Gewicht: 2.2
Wortsack Nr. 3108
X >> Gewicht: 1.83333333333333
Alfons >> Gewicht: 3.14285714285714
Zettler >> Gewicht: 3.66666666666667
Geschichte >> Gewicht: 5.5
Herzogtums >> Gewicht: 11
Schwaben >> Gewicht: 22
Stuttgart >> Gewicht: 7.33333333333333
Wortsack Nr. 3131
K >> Gewicht: 1.83333333333333
Graf >> Gewicht: 2.2
Das >> Gewicht: 2.75
Land >> Gewicht: 5.5
� >> Gewicht: 11
Schwaben >> Gewicht: 22
Mittelalter >> Gewicht: 5.5
In >> Gewicht: 3.66666666666667
P >> Gewicht: 2.75
Moraw >> Gewicht: 2.2
Hrsg >> Gewicht: 1.83333333333333
Wortsack Nr. 3282
Anton >> Gewicht: 3.66666666666667
Hunger >> Gewicht: 4.4
Gebrauchsanweisung >> Gewicht: 7.33333333333333
Schwaben >> Gewicht: 22
Piper >> Gewicht: 7.33333333333333
ISBN >> Gewicht: 2
Wortsack Nr. 3324
Zeitschrift >> Gewicht: 3.66666666666667
Historischen >> Gewicht: 5.5
Vereins >> Gewicht: 7.33333333333333
Schwaben >> Gewicht: 22
Hrsg >> Gewicht: 7.33333333333333
Historischer >> Gewicht: 3.66666666666667
Verein >> Gewicht: 3.14285714285714
Schwaben >> Gewicht: 2.44444444444444
Augsburg >> Gewicht: 2
...
� >> Gewicht: 11
Das Letztere zeigt: Auch hier muß ein Encoding her!
Momendemal ...
#### Kodierung
eval{$text = encode('ISO 8859-1', $text, Encode::FB_CROAK)};
eval{$text = decode('utf8', $text, Encode::FB_DEFAULT)};
CROAK oder nicht CROAK - ist das hier die Frage?
Ich kann sie zur Zeit noch nicht beantworten. Egal. Nicht so wichtig. Weiter im Text ...
...
Wortsack-"Größe" = 33
...
Bayerisch <<: 1.71273036997207
Schwabenzügen <<: 1.77930651103057
Schwabenhass <<: 1.94865016101418
Raum <<: 1.95236761051491
Schwabenalter <<: 2.03548341994029
Schwabenstreich <<: 2.1024173903625
Schwabenkinder <<: 2.1024173903625
Das <<: 2.19300496605711
Der <<: 2.30729699011891
Quelltext <<: 2.69156861850938
Schwabenland <<: 3.17878799580075
Bearbeiten <<: 3.21572815474325
Die <<: 3.28465910216998
Herzogtum <<: 6.50200206733806
Schwabens <<: 12.3535660135839
Schwaben <<: 100
Wortsack-"Größe" = 22
...
Schwabenbilder <<: 1.50422126161403
Schwabenverlag <<: 1.50422126161403
Bayerisch <<: 1.6295730334152
Vereins <<: 1.64096864903349
Schwabenzügen <<: 1.71911001327318
Namen <<: 1.74125006647442
Raum <<: 1.76632042083466
Das <<: 1.84446178507435
Schwabenhass <<: 1.89167219263583
Schwabenalter <<: 1.89167219263583
Schwabenstreich <<: 2.14237573623817
Schwabenkinder <<: 2.14237573623817
Der <<: 2.23543993045419
Quelltext <<: 2.41212623737393
Bearbeiten <<: 2.89931593747389
Schwabenland <<: 3.14518991064752
Die <<: 3.15115904263805
Herzogtum <<: 6.4430810705801
Schwabens <<: 12.5883567196689
Schwaben <<: 100
Wortsack-"Größe" = 11
...
Land <<: 1.2987012987013
Bearbeiten <<: 1.53246753246753
Schwabenverlag <<: 1.55844155844156
Vereins <<: 1.55844155844156
Schwabenzügen <<: 1.55844155844156
Schwabenbilder <<: 1.55844155844156
Bayerisch <<: 1.55844155844156
Namen <<: 1.66233766233766
Raum <<: 1.68831168831169
Der <<: 1.68831168831169
Schwabenhass <<: 1.81818181818182
Schwabenalter <<: 1.81818181818182
Die <<: 2.07792207792208
Schwabenstreich <<: 2.07792207792208
Schwabenkinder <<: 2.07792207792208
Schwabenland <<: 3.11688311688312
Herzogtum <<: 6.23376623376623
Schwabens <<: 12.7272727272727
Schwaben <<: 100
Wortsack-"Größe" = 4
...
Wahrnehmung <<: 0.78125
Bischofssitz <<: 0.78125
Herzogs <<: 1.04166666666667
Name <<: 1.04166666666667
Der <<: 1.04166666666667
Schwabenzügen <<: 1.5625
Vereins <<: 1.5625
Schwabenverlag <<: 1.5625
Schwabenstreich <<: 1.5625
Schwabenalter <<: 1.5625
Bayerisch <<: 1.5625
Schwabenkinder <<: 1.5625
Schwabenbilder <<: 1.5625
Schwabenhass <<: 1.5625
Die <<: 1.82291666666667
Schwabenland <<: 3.125
Herzogtum <<: 6.25
Schwabens <<: 12.5
Schwaben <<: 100
Upps!
Peinlicher Fehler?
if ( $wortreihe[$i] =~ /$sackwort/ ) { push @wortpos, $i }
Lieber mal so probieren:
if ( $wortreihe[$i] eq $sackwort ) { push @wortpos, $i }
Odda??
Stichprobe: Wortsack-"Größe" = 11
...
Schwäbische <<: 0.779220779220779
Herzogtums <<: 0.779220779220779
Karte <<: 0.831168831168831
Mittelalter <<: 0.909090909090909
Rumäniens <<: 1.01298701298701
Herzogs <<: 1.03896103896104
Teil <<: 1.03896103896104
Name <<: 1.03896103896104
Bewohnern <<: 1.09090909090909
Kolonisten <<: 1.09090909090909
Das <<: 1.14285714285714
Historischen <<: 1.16883116883117
Land <<: 1.2987012987013
Bearbeiten <<: 1.53246753246753
Schwabenzügen <<: 1.55844155844156
Schwabenverlag <<: 1.55844155844156
Schwabenbilder <<: 1.55844155844156
Bayerisch <<: 1.55844155844156
Vereins <<: 1.55844155844156
Namen <<: 1.66233766233766
Raum <<: 1.68831168831169
Der <<: 1.68831168831169
Schwabenhass <<: 1.81818181818182
Schwabenalter <<: 1.81818181818182
Die <<: 2.07792207792208
Schwabenstreich <<: 2.07792207792208
Schwabenkinder <<: 2.07792207792208
Schwabenland <<: 3.11688311688312
Herzogtum <<: 6.23376623376623
Schwabens <<: 12.7272727272727
Schwaben <<: 100
Naaaa ...
Ähh ... doch, doch ... Momendenochemal!
...
Titel <<: 0.625
Elsass <<: 0.651041666666667
Historischer <<: 0.651041666666667
Nordwesten <<: 0.703125
Metropolen <<: 0.78125
Banater <<: 0.78125
Bedeutung <<: 0.78125
MS <<: 0.78125
Alamannien <<: 0.78125
Zeitschrift <<: 0.78125
Herzogtums <<: 0.78125
Witzen <<: 0.78125
Hrsg <<: 0.78125
Begriff <<: 0.78125
Regierungsbezirk <<: 0.78125
Schönes <<: 0.78125
Sathmarer <<: 0.78125
Sieben <<: 0.78125
Den <<: 0.78125
Als <<: 0.78125
Kolonisten <<: 0.78125
Karte <<: 0.833333333333333
Raum <<: 0.911458333333333
Rumäniens <<: 1.015625
Herzogs <<: 1.04166666666667
Name <<: 1.04166666666667
Das <<: 1.14583333333333
Der <<: 1.171875
Historischen <<: 1.171875
Bearbeiten <<: 1.22395833333333
Land <<: 1.30208333333333
Namen <<: 1.35416666666667
Bayerisch <<: 1.5625
Die <<: 1.5625
Vereins <<: 1.5625
Herzogtum <<: 6.25
Schwaben <<: 100
Hatte es vergessen, nicht nur im Artikel, sondern auch im Code zu ändern, meaculperallala!
Und? Bringt das was?
Tja.
Hat auf jeden Fall Spaß gemacht, damit ein bissi Programmieren zu trainieren.
Mal ne weitere Probe, diesmal Sackwort "Elsass" && Anzahl = 33
...
Geltungsbereich <<: 1.96078431372549
Königreiche <<: 2.08333333333333
Nachbarn <<: 2.22222222222222
Eisenbahn <<: 2.22222222222222
Herzogtümer <<: 2.38095238095238
Deutsche <<: 2.38095238095238
Schwäbische <<: 2.38095238095238
Liste <<: 3.7037037037037
Oberschwaben <<: 3.7037037037037
Auch <<: 4.16666666666667
Sowohl <<: 4.16666666666667
Gaue <<: 4.76190476190476
Herzogtum <<: 5.25252525252525
Schweiz <<: 5.55555555555556
Alamannien <<: 6.66666666666667
Deutschschweiz <<: 6.66666666666667
Teile <<: 8.33333333333333
Hochburgund <<: 8.33333333333333
Vorarlberg <<: 11.1111111111111
Schwaben <<: 25.9920634920635
Elsass <<: 100
... und noch ne weitere Probe, diesmal Sackwort "Deutschschweiz" && Anzahl = 33
Jahrhundert <<: 7.14285714285714
Nachbarn <<: 9.09090909090909
Elsass <<: 20
Schwaben <<: 22.5
Sowohl <<: 25
Deutschschweiz <<: 100
Das war's. In diesem Fall. Mehr kam nicht. Aber das war's auch hier & heute damit.
Fazitchen:
Es
lässt sich schon ein bissi mit herumspielen. Schon ganz okay so. Das
Schöne ist ja, daß es ein Modul ist. Deshalb kann ich das demnächst mal
bei größeren Datenabfragen einbauen und die ermittelten Wortsäcke
weiterverarbeiten. Ich denke, erst dann wird es wirklich interessant.
Für heute aber Feierabend! Und zum Abschluß gebe ich noch einen aus und
stelle die fertigen Codes zur freien Ansicht/Verfügung**:
#!/usr/bin/perl
# de_wortsack.pm
# Wird kopiert per 'sudo cp de_wortsack.pm /usr/üX
üX
üX
üX
üX
üX
üX
üX
üX
/de_wortsack.pm'
## Muß ggf. in Zukunft angepasst werden
package de_wortsack;
use strict;
use warnings;
use Encode qw(is_utf8 decode encode);
use Exporter qw(import);
our @EXPORT = qw(wortsack);
# Kurze Rückmeldung
print "\nHier meldet sich das Modul \"de_wortsack.pm\": Hallihallo!\n\n";
###########################################################
############### Subroutinen ####################
###########################################################
# Subroutinen für Export
sub wortsack {
my $text = shift;
my $sackwort = shift;
my $sackwortzahl = shift;
my %wortsack;
print "\n\nKUCKUCK!!!\n\n";
print "\n\nDas Sackwort lautet: $sackwort.\n\n";
my @wortreihe = split ( /[^a-zäöüA-ZÄÖÜß]/, $text );
print map { $_, " --> " } @wortreihe;
my @wortpos;
for ( my $i; $i <= scalar @wortreihe - 1; $i++ ) {
if ( $wortreihe[$i] eq $sackwort ) { push @wortpos, $i }
}
print "\n\nDas Sackwort kommt an folgenden Stellen vor:\n\n";
print join ( ",", map { $_ } @wortpos );
foreach ( @wortpos ) {
print "\n\nWortsack Nr. $_\n\n";
for ( my $j = $_ - int($sackwortzahl/2); $j <= $_ + int($sackwortzahl/2); $j++ ) {
if ( $wortreihe[$j] ne "" && length $wortreihe[$j] > 1 && $wortreihe[$j] =~ /^[A-ZÄÖÜ].*/ ) {
my $gewicht = $sackwortzahl/( 1 + abs($_ - $j) );
print $wortreihe[$j], " >> Gewicht: ", $gewicht, "\n";
if ( not exists $wortsack{$wortreihe[$j]} ) { $wortsack{$wortreihe[$j]} = $gewicht }
else { $wortsack{$wortreihe[$j]} = $wortsack{$wortreihe[$j]} + $gewicht }
}
}
}
my $sackwortgewicht = $wortsack{$sackwort};
foreach ( keys %wortsack ) { $wortsack{$_} = $wortsack{$_}/$sackwortgewicht*100 }
return \%wortsack;
}
1;
#!/usr/bin/perl
# deutscher_wortsack-testproggi.pl
use strict;
use warnings;
use Encode qw(encode);
use de_wortsack qw(wortsack);
# Programm
## Eingabeaufforderungen
print "\nBitte den Pfad zum Text angeben!\n\n";
my $textdatei = <STDIN>;
chomp $textdatei;
print "\nBitte das Wort, das eingesackt werden soll, eingeben (nur Substantive!)!\n\n";
my $sackwort = <STDIN>;
chomp $sackwort;
print
"\nWie groß soll der Wortsack / sollen die Wortsäcke (wenn mehrere)
werden? (Die (theoretisch maximale) Anzahl der Worte ist gefragt!)\n\n";
my $sackwortzahl = <STDIN>;
chomp $sackwortzahl;
## Textdatei laden
### per Default bleibt 'testtext.txt' in diesem Verzeichnis eingestellt
$textdatei = 'testtext.txt';
### Laden und in Textstring einlesen
my $text;
open ( my $fh, '<', './'.$textdatei );
$text = do { local $/; <$fh> };
close $fh;
#### Kodierung
eval{$text = encode('ISO 8859-1', $text, Encode::FB_CROAK)};
eval{$text = decode('utf8', $text, Encode::FB_DEFAULT)};
#### Probedruck
# print "\n$text\n\n";
## Übergabe der Parameter und Return des Wortsackhashs als Referenz
my $wortsack_ref = wortsack($text,$sackwort,$sackwortzahl);
my %wortsack = %$wortsack_ref;
## Ausdruck Wortsack
print "\n\n";
print map { $_, " <<: ", $wortsack{$_}, "\n" } sort { $wortsack{$a} <=> $wortsack{$b} } keys %wortsack;
print "\n\n";
** Wenn's auch kein Schwein interessiert. ;-)
... "Oberschwaben"
...
Verpfändungen <<: 2.32919254658385
Gebiet <<: 2.32919254658385
Die <<: 2.71739130434783
Mediatisierung <<: 2.71739130434783
Hochburgund <<: 2.71739130434783
Reichsklosters <<: 3.26086956521739
Nach <<: 3.26086956521739
Bedeutung <<: 3.29380764163373
Masse <<: 3.39673913043478
Schwäbische <<: 3.80434782608696
Weingarten <<: 4.07608695652174
Unterteilungen <<: 4.07608695652174
Landvogteien <<: 4.07608695652174
Mittelalters <<: 4.34782608695652
Bezeichnungen <<: 4.74308300395257
Der <<: 6.68896321070234
Ausdruck <<: 9.3167701863354
Niederschwaben <<: 11.8286445012788
Oberschwaben <<: 100
Aber jetzt wirklich: Gute Nacht!
... Tschuldigung, das konnte ich mir nicht verkneifen!
Bearbeiten <<: 4.34782608695652
Liste <<: 4.34782608695652
Literatur <<: 4.54545454545455
Gaue <<: 4.76190476190476
Gelbfüßler <<: 5
Alamannien <<: 5.26315789473684
Schwaben <<: 5.55555555555556
Elsass <<: 6.66666666666667
Kaukasiendeutsche <<: 6.66666666666667
Hochburgund <<: 8.33333333333333
Bäderstraße <<: 10
Barockstraße <<: 14.2857142857143
Oberschwaben <<: 14.2857142857143
Oberschwäbische <<: 16.6666666666667
Schwäbische <<: 61.1111111111111
Eisenbahn <<: 100
Jetzt aber ... !!!
(nach: https://sites.google.com/site/hembelzomx/startseite/hier-geht-s-los-aber-nicht-unbedingt-ab/kakalumbatsch-uno/kakalumbatsch-due/kalakalumbatsch-tre/kalakalumbatsch-quattro/kalakalawabumbatsch-cinque/kumbadsh-sei/kmbsh-otti/kbh-nonno/word-vectoring; von hier: https://sites.google.com/site/hembelzomx/startseite/hier-geht-s-los-aber-nicht-unbedingt-ab/kakalumbatsch-uno/kakalumbatsch-due/kalakalumbatsch-tre/kalakalumbatsch-quattro/kalakalawabumbatsch-cinque/kumbadsh-sei/kmbsh-otti/kbh-nonno/word-vectoring/deutscher-wortsack)
Kommentare
Kommentar veröffentlichen