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 werdenpackage de_wortsack;use strict;use warnings;use Encode qw(is_utf8 decode encode);use Exporter qw(import);our @EXPORT = qw(wortsack);# Kurze Rückmeldungprint "\nHier meldet sich das Modul \"de_wortsack.pm\": Hallihallo!\n\n";########################################################################## Subroutinen ################################################################################ Subroutinen für Exportsub 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.pluse strict;use warnings;use de_wortsack qw(wortsack);# Programm## Eingabeaufforderungprint "\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 einlesenmy $text;open ( my $fh, '<', './'.$textdatei );$text = do { local $/; <$fh> };close $fh;#### Probedruckprint "\n$text\n\n";## Übergabe der Parameterwortsack($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 anBitte das Wort, das eingesackt werden soll, eingeben (nur Substantive!)!Schwabende.wikipedia.orgSchwaben – Wikipedia19-23 MinutenKarte des Schwäbischen Kreises 1572Schwaben
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 2011KUCKUCK!!!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,3651So, 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. 2881Band >> Gewicht: 2.75Zeitschrift >> Gewicht: 3.66666666666667Historischen >> Gewicht: 5.5Vereins >> Gewicht: 7.33333333333333Schwaben >> Gewicht: 22Irsee >> Gewicht: 7.33333333333333November >> Gewicht: 1.83333333333333Wortsack Nr. 2990Thaddäus >> Gewicht: 3.66666666666667Troll >> Gewicht: 4.4Deutschland >> Gewicht: 7.33333333333333Schwaben >> Gewicht: 22Im >> Gewicht: 7.33333333333333Anzügle >> Gewicht: 4.4Vordergründig >> Gewicht: 3.14285714285714Neuausgabe >> Gewicht: 1.83333333333333Wortsack Nr. 3045Groß >> Gewicht: 1.83333333333333Wolfgang >> Gewicht: 2.2Urban >> Gewicht: 2.44444444444444Suevia >> Gewicht: 3.14285714285714Schwäbische >> Gewicht: 5.5Glaubenszeugen >> Gewicht: 7.33333333333333Schwabenverlag >> Gewicht: 22Ostfildern >> Gewicht: 7.33333333333333ISBN >> Gewicht: 2.2Wortsack Nr. 3108X >> Gewicht: 1.83333333333333Alfons >> Gewicht: 3.14285714285714Zettler >> Gewicht: 3.66666666666667Geschichte >> Gewicht: 5.5Herzogtums >> Gewicht: 11Schwaben >> Gewicht: 22Stuttgart >> Gewicht: 7.33333333333333Wortsack Nr. 3131K >> Gewicht: 1.83333333333333Graf >> Gewicht: 2.2Das >> Gewicht: 2.75Land >> Gewicht: 5.5� >> Gewicht: 11Schwaben >> Gewicht: 22Mittelalter >> Gewicht: 5.5In >> Gewicht: 3.66666666666667P >> Gewicht: 2.75Moraw >> Gewicht: 2.2Hrsg >> Gewicht: 1.83333333333333Wortsack Nr. 3282Anton >> Gewicht: 3.66666666666667Hunger >> Gewicht: 4.4Gebrauchsanweisung >> Gewicht: 7.33333333333333Schwaben >> Gewicht: 22Piper >> Gewicht: 7.33333333333333ISBN >> Gewicht: 2Wortsack Nr. 3324Zeitschrift >> Gewicht: 3.66666666666667Historischen >> Gewicht: 5.5Vereins >> Gewicht: 7.33333333333333Schwaben >> Gewicht: 22Hrsg >> Gewicht: 7.33333333333333Historischer >> Gewicht: 3.66666666666667Verein >> Gewicht: 3.14285714285714Schwaben >> Gewicht: 2.44444444444444Augsburg >> Gewicht: 2
...
� >> Gewicht: 11Das Letztere zeigt: Auch hier muß ein Encoding her!
Momendemal ...
#### Kodierungeval{$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.71273036997207Schwabenzügen <<: 1.77930651103057Schwabenhass <<: 1.94865016101418Raum <<: 1.95236761051491Schwabenalter <<: 2.03548341994029Schwabenstreich <<: 2.1024173903625Schwabenkinder <<: 2.1024173903625Das <<: 2.19300496605711Der <<: 2.30729699011891Quelltext <<: 2.69156861850938Schwabenland <<: 3.17878799580075Bearbeiten <<: 3.21572815474325Die <<: 3.28465910216998Herzogtum <<: 6.50200206733806Schwabens <<: 12.3535660135839Schwaben <<: 100Wortsack-"Größe" = 22
...Schwabenbilder <<: 1.50422126161403Schwabenverlag <<: 1.50422126161403Bayerisch <<: 1.6295730334152Vereins <<: 1.64096864903349Schwabenzügen <<: 1.71911001327318Namen <<: 1.74125006647442Raum <<: 1.76632042083466Das <<: 1.84446178507435Schwabenhass <<: 1.89167219263583Schwabenalter <<: 1.89167219263583Schwabenstreich <<: 2.14237573623817Schwabenkinder <<: 2.14237573623817Der <<: 2.23543993045419Quelltext <<: 2.41212623737393Bearbeiten <<: 2.89931593747389Schwabenland <<: 3.14518991064752Die <<: 3.15115904263805Herzogtum <<: 6.4430810705801Schwabens <<: 12.5883567196689Schwaben <<: 100Wortsack-"Größe" = 11
...Land <<: 1.2987012987013Bearbeiten <<: 1.53246753246753Schwabenverlag <<: 1.55844155844156Vereins <<: 1.55844155844156Schwabenzügen <<: 1.55844155844156Schwabenbilder <<: 1.55844155844156Bayerisch <<: 1.55844155844156Namen <<: 1.66233766233766Raum <<: 1.68831168831169Der <<: 1.68831168831169Schwabenhass <<: 1.81818181818182Schwabenalter <<: 1.81818181818182Die <<: 2.07792207792208Schwabenstreich <<: 2.07792207792208Schwabenkinder <<: 2.07792207792208Schwabenland <<: 3.11688311688312Herzogtum <<: 6.23376623376623Schwabens <<: 12.7272727272727Schwaben <<: 100Wortsack-"Größe" = 4
...Wahrnehmung <<: 0.78125Bischofssitz <<: 0.78125Herzogs <<: 1.04166666666667Name <<: 1.04166666666667Der <<: 1.04166666666667Schwabenzügen <<: 1.5625Vereins <<: 1.5625Schwabenverlag <<: 1.5625Schwabenstreich <<: 1.5625Schwabenalter <<: 1.5625Bayerisch <<: 1.5625Schwabenkinder <<: 1.5625Schwabenbilder <<: 1.5625Schwabenhass <<: 1.5625Die <<: 1.82291666666667Schwabenland <<: 3.125Herzogtum <<: 6.25Schwabens <<: 12.5Schwaben <<: 100Upps!
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.779220779220779Herzogtums <<: 0.779220779220779Karte <<: 0.831168831168831Mittelalter <<: 0.909090909090909Rumäniens <<: 1.01298701298701Herzogs <<: 1.03896103896104Teil <<: 1.03896103896104Name <<: 1.03896103896104Bewohnern <<: 1.09090909090909Kolonisten <<: 1.09090909090909Das <<: 1.14285714285714Historischen <<: 1.16883116883117Land <<: 1.2987012987013Bearbeiten <<: 1.53246753246753Schwabenzügen <<: 1.55844155844156Schwabenverlag <<: 1.55844155844156Schwabenbilder <<: 1.55844155844156Bayerisch <<: 1.55844155844156Vereins <<: 1.55844155844156Namen <<: 1.66233766233766Raum <<: 1.68831168831169Der <<: 1.68831168831169Schwabenhass <<: 1.81818181818182Schwabenalter <<: 1.81818181818182Die <<: 2.07792207792208Schwabenstreich <<: 2.07792207792208Schwabenkinder <<: 2.07792207792208Schwabenland <<: 3.11688311688312Herzogtum <<: 6.23376623376623Schwabens <<: 12.7272727272727Schwaben <<: 100
Naaaa ...
Ähh ... doch, doch ... Momendenochemal!
...Titel <<: 0.625Elsass <<: 0.651041666666667Historischer <<: 0.651041666666667Nordwesten <<: 0.703125Metropolen <<: 0.78125Banater <<: 0.78125Bedeutung <<: 0.78125MS <<: 0.78125Alamannien <<: 0.78125Zeitschrift <<: 0.78125Herzogtums <<: 0.78125Witzen <<: 0.78125Hrsg <<: 0.78125Begriff <<: 0.78125Regierungsbezirk <<: 0.78125Schönes <<: 0.78125Sathmarer <<: 0.78125Sieben <<: 0.78125Den <<: 0.78125Als <<: 0.78125Kolonisten <<: 0.78125Karte <<: 0.833333333333333Raum <<: 0.911458333333333Rumäniens <<: 1.015625Herzogs <<: 1.04166666666667Name <<: 1.04166666666667Das <<: 1.14583333333333Der <<: 1.171875Historischen <<: 1.171875Bearbeiten <<: 1.22395833333333Land <<: 1.30208333333333Namen <<: 1.35416666666667Bayerisch <<: 1.5625Die <<: 1.5625Vereins <<: 1.5625Herzogtum <<: 6.25Schwaben <<: 100Hatte 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.96078431372549Königreiche <<: 2.08333333333333Nachbarn <<: 2.22222222222222Eisenbahn <<: 2.22222222222222Herzogtümer <<: 2.38095238095238Deutsche <<: 2.38095238095238Schwäbische <<: 2.38095238095238Liste <<: 3.7037037037037Oberschwaben <<: 3.7037037037037Auch <<: 4.16666666666667Sowohl <<: 4.16666666666667Gaue <<: 4.76190476190476Herzogtum <<: 5.25252525252525Schweiz <<: 5.55555555555556Alamannien <<: 6.66666666666667Deutschschweiz <<: 6.66666666666667Teile <<: 8.33333333333333Hochburgund <<: 8.33333333333333Vorarlberg <<: 11.1111111111111Schwaben <<: 25.9920634920635Elsass <<: 100... und noch ne weitere Probe, diesmal Sackwort "Deutschschweiz" && Anzahl = 33
Jahrhundert <<: 7.14285714285714Nachbarn <<: 9.09090909090909Elsass <<: 20Schwaben <<: 22.5Sowohl <<: 25Deutschschweiz <<: 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 werdenpackage de_wortsack;use strict;use warnings;use Encode qw(is_utf8 decode encode);use Exporter qw(import);our @EXPORT = qw(wortsack);# Kurze Rückmeldungprint "\nHier meldet sich das Modul \"de_wortsack.pm\": Hallihallo!\n\n";########################################################################## Subroutinen ################################################################################ Subroutinen für Exportsub 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.pluse strict;use warnings;use Encode qw(encode);use de_wortsack qw(wortsack);# Programm## Eingabeaufforderungenprint "\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 einlesenmy $text;open ( my $fh, '<', './'.$textdatei );$text = do { local $/; <$fh> };close $fh;#### Kodierungeval{$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 Referenzmy $wortsack_ref = wortsack($text,$sackwort,$sackwortzahl);my %wortsack = %$wortsack_ref;## Ausdruck Wortsackprint "\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.32919254658385Gebiet <<: 2.32919254658385Die <<: 2.71739130434783Mediatisierung <<: 2.71739130434783Hochburgund <<: 2.71739130434783Reichsklosters <<: 3.26086956521739Nach <<: 3.26086956521739Bedeutung <<: 3.29380764163373Masse <<: 3.39673913043478Schwäbische <<: 3.80434782608696Weingarten <<: 4.07608695652174Unterteilungen <<: 4.07608695652174Landvogteien <<: 4.07608695652174Mittelalters <<: 4.34782608695652Bezeichnungen <<: 4.74308300395257Der <<: 6.68896321070234Ausdruck <<: 9.3167701863354Niederschwaben <<: 11.8286445012788Oberschwaben <<: 100Aber jetzt wirklich: Gute Nacht!
... Tschuldigung, das konnte ich mir nicht verkneifen!
Bearbeiten <<: 4.34782608695652Liste <<: 4.34782608695652Literatur <<: 4.54545454545455Gaue <<: 4.76190476190476Gelbfüßler <<: 5Alamannien <<: 5.26315789473684Schwaben <<: 5.55555555555556Elsass <<: 6.66666666666667Kaukasiendeutsche <<: 6.66666666666667Hochburgund <<: 8.33333333333333Bäderstraße <<: 10Barockstraße <<: 14.2857142857143Oberschwaben <<: 14.2857142857143Oberschwäbische <<: 16.6666666666667Schwäbische <<: 61.1111111111111Eisenbahn <<: 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