Die Schriftsprache unterscheidet sich an vielen Stellen vom gesprochenen Wort. Die Unterschiede zwischen dem geschriebenen Wort und der gesprochenen Variante sind gehörig – das gilt für viele Sprachen – so auch für Texte in englischer Sprache. Es gibt aber gerade für die englische Sprache Algorithmen, die die Wörter des Englischen in eine bestimmte Form der Lautschrift überführen. Man erhöht so die Trefferwahrscheinlichkeit. Wie oft hat man sich schon über fehlerhafte Sachauskünfte im Google geärgert – nur weil die Schreibweise nicht passend war. In der Literatur ist die Prozedur soundex() bekannt.
Auch in PHP gibt es zu diesem Problem ein Implementation – der Befehl metaphone(). Passend hauptsächlich allerdings für die englische Sprache, für andere Sprachen wie Deutsch oder Französische ist das Verfahren so leider nicht exakt zu übertragen.
metaphone() ist eine PHP-Funktion, die eine phonetische Repräsentation eines Wortes liefert. Diese Funktion verwendet eine Reihe von Regeln, um die phonetische Repräsentation zu bestimmen, die dann als Ergebnis zurückgegeben wird. Sie kann verwendet werden, um Wörter zu vergleichen, die ähnlich klingen, aber nicht genau gleich sind. Zum Beispiel kann metaphone() „Vogel“ und "Vögel" als ähnlich erkennen. Die Funktion macht keinen Unterschied zwischen Groß- und Kleinschreibung.
Man schaue sich folgendes Beispiel einmal an:
<?php
/*
* Created on 28.01.2010 by Nico Schubert
*/
$text = 'cash';
$rueckgabe_metaphone = metaphone($text);
echo 'Der englische Klangwert von "'.$text.'" ist:
'.$rueckgabe_metaphone.'<br>';
$text = 'flash';
$rueckgabe_metaphone = metaphone($text);
echo 'Der englische Klangwert von "'.$text.'" ist:
'.$rueckgabe_metaphone.'<br>';
?>
Ausgabe:
Der englische Klangwert von "cash" ist: KX
Der englische Klangwert von "flash" ist: FLX
Erklärung:
Das Beispiel verwendet die eingebaute Prozedur methaphone(), um den Lautwert eines Strings zu berechnen. Die Prozedur „Methaphone“ ist eine unitäre Funktion, also eine Funktion, die ein einziges Argument hat – hier in dem Beispiel die umzuwandelnden Strings. Der Rückgabewert entspricht dem Klangwert des Strings. Im Beispiel werden die Begriffe "cash" und "flash" in die gesprochenen Varianten umgewandelt. Aus dem Sprachstring wird eine Pseudo-Lautschrift Form erstellt. Dieser String wird dann mittels des echo Befehls auf der Konsole ausgegeben.
Man könnte diese Werte dann einem Sprachgenerator wie „Sam“ zuweisen, der dann aus dem Text wieder gesprochene Sprache erzeugt. Der erzeugte Wert kann dann auch für eine Verschlagwortung der Begriffe genutzt und in eine MySQL Datenbank eingepflegt werden. Dann wäre eine schnelle, indexierte Suche unter MySQL nach dem Lautwert möglich.
Wenn man den Lautwert von deutschen Begriffen bestimmen möchte, dann empfiehlt sich die Umwandlung nach dem sogenannten Kölner Algorithmus. Diese Prozedur berücksichtigt ziemlich genau die Eigenheiten der deutschen Sprache. Sie finden dazu eine fertige PHP Funktion unter x3m.ch, diese Funktion ist an den Kölner Algorithmus angelegt. In grober Näherung kann man die Prozedur metaphone() aber auch für Texte in deutscher Sprache verwenden.
Die Funktion soundex() im Vergleich
Neben metaphone() gibt es in PHP auch die Funktion soundex(). Beide berechnen phonetische Schlüssel, nutzen aber unterschiedliche Algorithmen. soundex() erzeugt immer einen vierstelligen Code, während metaphone() einen Code variabler Länge berechnet.
<?php
echo soundex('Robert');
/* Ausgabe: R163 */
echo soundex('Rupert');
/* Ausgabe: R163 */
echo metaphone('Robert');
/* Ausgabe: RBRT */
echo metaphone('Rupert');
/* Ausgabe: RPRT */
?>
Im Beispiel erkennt soundex() beide Namen als identisch (gleicher Code R163), während metaphone() einen Unterschied erkennt. Für eine breitere Übereinstimmung eignet sich soundex(), für eine präzisere Zuordnung eher metaphone().
soundex() vs. metaphone()
| Eigenschaft | soundex() | metaphone() |
|---|
| Code-Länge | Immer 4 Zeichen | Variable Länge |
| Algorithmus | Älterer Standard (1918) | Neuerer, genauer |
| Genauigkeit | Grober Vergleich | Feinerer Vergleich |
Praxisbeispiel: Unscharfe Namenssuche
Ein häufiger Anwendungsfall ist die Suche nach ähnlich klingenden Namen. Statt einer exakten Suche vergleichen Sie die phonetischen Schlüssel und finden so auch Treffer bei leicht abweichender Schreibweise.
<?php
$namen = array(
'Smith', 'Schmidt', 'Smyth',
'Meyer', 'Miller', 'Mueller'
);
$suche = 'Smith';
$suche_code = soundex($suche);
$treffer = array();
foreach ($namen as $name) {
if (soundex($name) === $suche_code) {
$treffer[] = $name;
}
}
echo implode(', ', $treffer);
/* Ausgabe: Smith, Schmidt, Smyth */
?>
Die Suche nach "Smith" findet auch "Schmidt" und "Smyth", weil alle drei den gleichen soundex-Code erzeugen. So können Benutzer einen Namen finden, auch wenn sie die genaue Schreibweise nicht kennen.
Ergänzende Funktionen für Textvergleiche
PHP bietet weitere Möglichkeiten, um Ähnlichkeiten zwischen Texten zu berechnen. Die Funktion similar_text() gibt die Ähnlichkeit zweier Strings in Prozent an, und levenshtein() berechnet die Anzahl der Bearbeitungsschritte.
<?php
$a = 'Meier';
$b = 'Meyer';
similar_text($a, $b, $prozent);
echo round($prozent, 1) . '% aehnlich';
/* Ausgabe: 60% aehnlich */
echo levenshtein($a, $b);
/* Ausgabe: 2 */
?>