Bewertung: 4.9 von 8 Benutzern
klaus_b
Nachdem ich im vorherigen Artikel eine mögliche Implementierung der Kölner Phonetik gezeigt habe, möchte ich in diesem Artikel den Entwurf einer Klasse für den täglichen Gebrauch vorstellen.
Das Ziel ist eine flexible Verwendung sowohl mit statischen Methoden zum einfachen direkten Vergleich einzelner Wörter und Analyse kleiner Listen, als auch die Verwendung von Instanzen zur Verarbeitung großer und komplexer Wortlisten. Ich gehe heute bewusst nicht auf die technischen Details ein, sondern zeige die Verwendung aus der Sicht des Anwendungsentwicklers.

Werfen wir zunächst einmal einen Blick auf die statischen Methoden:
Mit Encode wird das Ziffernabbild eines Wortes als Zeichenfolge zurückgegeben. Als Parameter wird ein einzelnes Wort erwartet. Ob diese Methode sehr oft benötigt wird kann ich im Moment noch nicht beurteilen. Doch da sie intern zwangsläufig vorhanden ist, kann ich sie genauso gut öffentlich zur Verfügung stellen.
Für den direkten Vergleich zweier Wörter kann die Methode IsSimilar, vom Typ bool, verwendet werden.
Zum finden einer Gruppe von ähnlich klingenden Wörtern in einer Aufzählung, steht die Methode FindSimilar zur Verfügung. Als zu durchsuchende Aufzählung, erwartet die Methode eine beliebige Auflistung deren Inhalt vom Typ string ist. Es kann ein String-Array genauso sein wie eine generische Liste vom Typ string. Der Typ der Aufzählung muss lediglich die Schnittstelle IList<T> implementieren. Zurückgegeben wird eine Liste von gefundenen Ähnlichkeiten in einer IList<T>-Aufzählung. Diese Methode ist zur einfachen Verarbeitung von kleinen Listen gedacht.
Für die Verarbeitung großer und vor allem komplexer Wortlisten, sind die Instanz-Member der Klasse gedacht. Hier kann schon einer Konstruktor-Überladung eine Wortliste übergeben werden. Wenn diese Überladung verwendet wird, muss nach dem Initialisieren der Instanz unbedingt entweder die Methode Analyze oder AnalyzeAsync aufgerufen werden. Der Grund hierfür ist folgender:
Wenn eine sehr große Liste verarbeitet wird, kann das eine beträchtliche Zeit in Anspruch nehmen. Wenn jetzt im Konstruktor die Methode Analyze verwendet wird, blockiert die Anwendung bis die Analyse abgeschlossen ist. Die asynchrone Methode AnalyzeAsync wollte ich nicht verwenden, da vom Entwickler noch kein Eventhandler abonniert wurde. Also bleibt es dem jeweiligen Entwickler freigestellt, ob er mit Analyze die Anwendung blockiert, oder nach dem initialisieren der Instanz das Event AnalyzeCompleted abonniert und dann AnalyzeAsync verwendet.
// eine Instanz erzeugen um mit den Instanz-Membern zu arbeiten
KoelnerPhonetic koelner = new KoelnerPhonetic(words);
// Eventhandler abonnieren der ausgelöst wird,
// wenn eine asynchrone Analyse beendet ist.
koelner.AnalyzeCompleted +=
new EventHandler<AnalyzeCompletedEventargs>(OnAnalyzeCompleted);
// Namensliste asynchron analysieren
koelner.AnalyzeAsync();
// tue hier was sinnvolles
Thread.Sleep(1000);
// Ergebnisse für "huber" abfragen.
List<string> results = (List<string>)koelner.AllSimilarTo("huber");
Der Status der Instanz, ob bereist analysiert wurde oder nicht, kann jederzeit über die Eigenschaft HasAnalyzed abgefragt werden. Die bereits an die Instanz übergebene Wortliste steht mit der Eigenschaft WordList zur Verfügung.
Die interne Liste, die mit der Eigenschaft WordList eingesehen werden kann, lässt sich jederzeit mit der Methode AddContent erweitern oder vervollständigen. Auch hier steht eine Überladung zur Verfügung. Wenn die Instanz bereits eine Liste enthält und nun diese Liste erweitert wird, muss natürlich neu analysiert werden. Da die hinzugefügte Wortliste durchaus Wörter enthalten kann die in einem der internen Dictionary<TKey, TValue> bereits verarbeitet wurden, müssen natürlich auch diese neu erstellt werden. Deshalb habe ich eine Überladung der Methode hinzugefügt. mit der Standardmethode, wird die Wortliste erweitert und anschließend sofort analysiert. Dies kann, bei einer bereits enthaltenen großen Liste, zu einer Blockierung der Anwendung führen. Wenn statt dessen die Überladung verwendet wird, mit der außer einer Aufzählung auch angegeben werden kann ob sofort analysiert werden soll, kann hier als zweiter Parameter false übergeben werden und die Analyse im Anschluss asynchron gestartet. Ich habe hier bereits ein partielles Update der Dictionary’s in Betracht gezogen, allerdings noch nicht umgesetzt.
Mit der Methode Clear ist die Möglichkeit gegeben, alle internen Listen der Instanz zu leeren und diese Listen somit auf den Status einer Neuinitialisierung zurück zusetzen. Ein abonnierter Eventhandler bleibt davon natürlich unbeeinflusst.
Um alle Ähnlichkeiten eines bestimmten Worts zu erhalten, ist die Methode AllSimilarTo vorgesehen. Mit ihr wird eine Aufzählung aller gefundener phonetischen Ähnlichkeiten eines angegebenen Worts zurückgegeben.
Interessierte können sich den Entwurf als Visual Studio Projekt herunterladen.
Über Feedback würde ich mich freuen. Kritik ist ausdrücklich erwünscht.
KoelnerPhonetic.zip
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitten "kicken" sie ihn.
