Gibt es einen Unix-Befehl, der nach ähnlichen Zeichenfolgen sucht, hauptsächlich basierend darauf, wie sie beim Sprechen klingen?

7

Ich habe eine Datei mit Namen und möchte darin suchen, ohne mich zu sehr darum zu kümmern, ob ich den Namen (nach dem ich suche) richtig geschrieben habe. Ich weiß, dass grepes eine ganze Reihe von Funktionen gibt, um nach einer ganzen Reihe ähnlicher Zeichenfolgen in einer Datei oder einem Stream zu suchen, aber meines Wissens verfügt es nicht über Funktionen, um Rechtschreibfehler zu korrigieren, und selbst wenn dies der Fall ist, seitdem Dies sind Namen von Personen, die in einem Standardwörterbuch nicht enthalten sind.

Vielleicht kann ich meine Namensdatei in ein spezielles Wörterbuch umwandeln und dann ein Standardwerkzeug zur Rechtschreibprüfung verwenden? Von besonderer Bedeutung in dieser Anwendung ist die Fähigkeit, ähnlich klingende Wörter zu finden.

Zum Beispiel: "jacob"sollte zurückkehren "Jakob". Noch besser wäre es, wenn auch sprachübergreifende Ähnlichkeiten berücksichtigt würden, so dass dies "miguel"übereinstimmen sollte "Michael".

Ist dies etwas, das bereits implementiert wurde, oder muss ich mein eigenes bauen?

gabkdlly
quelle
3
agrepfür ungefähre grep(nicht für Ton / Sprache). Auch beim zshPattern Matching (#a3)können bis zu 3 Fehler zugelassen werden.
Stéphane Chazelas
7
Werfen Sie einen Blick auf das Kernmodul zu: pastebin.com/UbeVFBQAText::Soundex perl
Manatwork
1
@manatwork - das solltest du als Antwort aufschreiben!
slm
2
@slm, nicht sicher, wie nützlich das in der Praxis sein kann. Zum Beispiel haben "miguel", "Michael", "michelle", "majkul" und "mysql" alle den Soundex-Code "M240". Als ich versuchte, es zu verwenden, stellte ich fest, dass es zu breit ist, um für die meisten Aufgaben nützlich zu sein. Also lasse ich besser jemanden, der in der Lage ist, eine Feinabstimmung vorzunehmen, um daraus eine Antwort zu machen.
Manatwork

Antworten:

5

@manatwork hat es richtig, Soundex ist wahrscheinlich das Werkzeug, das Sie suchen.

Installieren Sie das Perl-Soundex-Modul mit CPAN:

$ sudo cpan Text::Soundex
CPAN: Storable loaded ok (v2.27)
....
Text::Soundex is up to date (3.04).

Machen Sie eine Datei voller Namen zum Testen aufgerufen names.txt

jacob
Jakob
miguel
Michael

Nun das Perl-Skript zur Verwendung des Soundex-Moduls, soundslike.pl

#!/usr/bin/perl

use Text::Soundex;

open(FH, 'names.txt');

$targetSoundex=soundex($ARGV[0]);
print "Target soundex of $ARGV[0] is $targetSoundex\n";

while(<FH>) {
    chomp;
    print "Soundex of $_ is ".soundex($_);
    if($targetSoundex eq soundex($_)) {
        print " (match).\n";
    }else {
        print " (no match).\n";
    }
}
close(FH);

Machen Sie es ausführbar und führen Sie einige Beispiele aus:

$ chmod +x soundslike.pl 
$ ./soundslike.pl michael
Target soundex of michael is M240
Soundex of jacob is J210 (no match).
Soundex of Jakob is J210 (no match).
Soundex of miguel is M240 (match).
Soundex of Michael is M240 (match).
$ ./soundslike.pl jagub
Target soundex of jagub is J210
Soundex of jacob is J210 (match).
Soundex of Jakob is J210 (match).
Soundex of miguel is M240 (no match).
Soundex of Michael is M240 (no match).
Nate aus Kalamazoo
quelle