[Trennmuster] Seltsames Verhalten von `abgleich-neueintraege.py`

Werner LEMBERG wl at gnu.org
Mo Mär 30 12:18:39 CEST 2020


Liebe Mitstreiter!


Nach längerer Zeit will ich wieder einmal etwas in unsere Wortliste
einpflegen; gedacht habe ich an einfache Komposita (also mit nur einem
»=«) aus

  https://sourceforge.net/projects/germandict/files/german.7z/download

Folgendes habe ich zur Vorbereitung gemacht.

1. Runterladen obiger Datei.
2. Konversion der Zeilenenden nach Unix.
3. Konversion von latin9 nach utf8.
4. Entfernen aller zweibuchstabigen Einträge.
5. Entfernen aller Einträge, die schon in unserer Wortliste sind.
   Benutzt habe ich dazu das angehängte Perl-Skript.
6. Sortieren mit unserem `sort.py`.

Der Einfachheit halber habe ich das Ergebnis hochgeladen unter

  https://we.tl/t-hGn0WKeBuO

Wenn ich jetzt das ganze mit

  abgleich_neueintraege.py < german.dic.rest > german.dic.rest.analyzed

behandle – auf meinem Laptop hat das mehr als zwei Stunden gedauert –
finden sich seltsame Einträge in der Ausgabedatei, z.B.

  zytogenetisch;zy-to<ge-ne-tisch;zy-to<ge-ne-tisch;zy-to<ge-ne-tisch;zy-to<ge-ne-tisch;zy-to<ge-ne-tisch;zy-to<ge-ne-tisch;zy-to<ge-ne-tisch

Wenn ich dagegen nur das Wort »zytogenetisch« vom Skript bearbeiten
lasse, erzeugt es korrekt

  zytogenetisch;zy-to<ge-ne-tisch

Das schaut nach einem Bug aus.  Günter?


    Werner
-------------- nächster Teil --------------
#! /usr/bin/perl -w
#
# entferne-dopplungen.pl
#
# Dieses Perl-Skript entfernt alle Wörter, die bereits in einer Wortliste
# vorhanden sind.
#
# Es erwartet als erstes Argument eine Wortlistendatei im Langformat.  Die
# restlichen Argumente sind Dateien mit ungetrennten Wörtern (ein Wort pro
# Zeile); auch stdin kann verwendet werden.
#
# Die Eingabedaten brauchen nicht sortiert sein, und die Groß- und
# Kleinschreibung wird beim Test auf Vorhandensein ignoriert.
#
# Die Ausgabe erfolgt unsortiert auf stdout.

use strict;
use warnings;
use utf8;                              # String-Literals direkt als UTF-8.
use open qw(:std :utf8);
use feature 'unicode_strings';

my $prog = $0;
$prog =~ s at .*/@@;


my $wortlistendatei = shift;
if (!defined $wortlistendatei) {
  die "Aufruf:  $prog wortlistendatei [eingabedatei1 ...]\n";
}


my %wortliste;

open WORTLISTE, '<', $wortlistendatei
|| die "$prog: Kann Wortlistendatei `$wortlistendatei' nicht öffnen: $!\n";

while (<WORTLISTE>) {
  chop;

  # Entferne Leer- und Kommentarzeilen.
  next if (/^ \s* (?: \# | $)/x);

  # Entferne alles nach dem ersten Strichpunkt.
  s/;.*//;

  $wortliste{lc $_} = $_;
}

close WORTLISTE;


my %wörter;

while (<>) {
  chop;

  # Entferne Leerzeilen.
  next if (/^ \s* $/x);

  # Entferne Leerzeichen am Anfang und Ende.
  s/^ \s+ | \s+ $//gx;

  $wörter{lc $_} = $_;
}


foreach my $schlüssel (keys %wörter) {
  print "$wörter{$schlüssel}\n" unless exists $wortliste{$schlüssel};
}

# eof


Mehr Informationen über die Mailingliste Trennmuster