Ich muss einen ziemlich effizienten Weg finden, um Silben in einem Wort zu erkennen. Z.B,
Unsichtbar -> in-vi-sib-le
Es gibt einige Silbenregeln, die verwendet werden könnten:
V CV VC CVC CCV CCCV CVCC
* wobei V ein Vokal und C ein Konsonant ist. Z.B,
Aussprache (5 Pro-nun-ci-a-tion; CV-CVC-CV-V-CVC)
Ich habe nur wenige Methoden ausprobiert, darunter die Verwendung von Regex (was nur hilft, wenn Sie Silben zählen möchten) oder einer fest codierten Regeldefinition (ein Brute-Force-Ansatz, der sich als sehr ineffizient herausstellt) und schließlich die Verwendung von Automaten mit endlichen Zuständen (was der Fall war) nicht mit irgendetwas Nützlichem resultieren).
Der Zweck meiner Anwendung ist es, ein Wörterbuch aller Silben in einer bestimmten Sprache zu erstellen. Dieses Wörterbuch wird später für Rechtschreibprüfungsanwendungen (unter Verwendung von Bayes'schen Klassifikatoren) und für die Text-zu-Sprache-Synthese verwendet.
Ich würde mich freuen, wenn man mir neben meinen bisherigen Ansätzen Tipps geben könnte, wie man dieses Problem auf andere Weise lösen kann.
Ich arbeite in Java, aber jeder Tipp in C / C ++, C #, Python, Perl ... würde für mich funktionieren.
quelle
Antworten:
Lesen Sie mehr über den TeX-Ansatz für dieses Problem zum Zwecke der Silbentrennung. Siehe insbesondere Frank Liangs Dissertation Word Hy-phen-a-tion von Computer . Sein Algorithmus ist sehr genau und enthält dann ein kleines Ausnahmewörterbuch für Fälle, in denen der Algorithmus nicht funktioniert.
quelle
Ich bin über diese Seite gestolpert und habe nach einigen Implementierungen des Liang-Papiers gesucht: https://github.com/mnater/hyphenator oder der Nachfolger: https://github.com/mnater/Hyphenopoly
Es sei denn, Sie sind der Typ, der gerne eine 60-seitige Arbeit liest, anstatt frei verfügbaren Code für nicht eindeutige Probleme anzupassen. :) :)
quelle
Hier ist eine Lösung mit NLTK :
quelle
Ich versuche, dieses Problem für ein Programm anzugehen, das die Flesch-Kincaid- und Flesch-Lesewerte eines Textblocks berechnet. Mein Algorithmus verwendet das, was ich auf dieser Website gefunden habe: http://www.howmanysyllables.com/howtocountsyllables.html, und es kommt ziemlich nahe. Es hat immer noch Probleme mit komplizierten Wörtern wie unsichtbar und Silbentrennung, aber ich habe festgestellt, dass es für meine Zwecke in den Ballpark gelangt.
Es hat den Vorteil, dass es einfach zu implementieren ist. Ich fand, dass die "es" entweder Silben sein können oder nicht. Es ist ein Glücksspiel, aber ich habe beschlossen, die es in meinem Algorithmus zu entfernen.
quelle
Dies ist ein besonders schwieriges Problem, das vom LaTeX-Silbentrennungsalgorithmus nicht vollständig gelöst wird. Eine gute Zusammenfassung einiger verfügbarer Methoden und der damit verbundenen Herausforderungen finden Sie in dem Artikel Evaluating Automatic Syllabification Algorithms for English (Marchand, Adsett und Damper 2007).
quelle
Vielen Dank an Joe Basirico, der Ihre schnelle und schmutzige Implementierung in C # geteilt hat. Ich habe die großen Bibliotheken verwendet und sie funktionieren, aber normalerweise sind sie etwas langsam, und für schnelle Projekte funktioniert Ihre Methode einwandfrei.
Hier ist Ihr Code in Java zusammen mit Testfällen:
Das Ergebnis war wie erwartet (es funktioniert gut genug für Flesch-Kincaid):
quelle
@Tihamer und @ joe-basirico stoßen. Sehr nützliche Funktion, nicht perfekt , aber gut für die meisten kleinen bis mittleren Projekte. Joe, ich habe eine Implementierung Ihres Codes in Python neu geschrieben:
Hoffe jemand findet das nützlich!
quelle
Warum berechnen? Jedes Online-Wörterbuch hat diese Informationen. http://dictionary.reference.com/browse/invisible in · vis · i · ble
quelle
Perl hat das Modul Lingua :: Phonology :: Syllable . Sie könnten das versuchen oder versuchen, seinen Algorithmus zu untersuchen. Ich habe dort auch einige andere ältere Module gesehen.
Ich verstehe nicht, warum ein regulärer Ausdruck nur eine Anzahl von Silben enthält. Sie sollten in der Lage sein, die Silben selbst in Klammern zu erfassen. Angenommen, Sie können einen regulären Ausdruck erstellen, der funktioniert.
quelle
Heute habe ich diese Java-Implementierung von Frank Liangs Silbentrennungsalgorithmus mit Muster für Englisch oder Deutsch gefunden, die recht gut funktioniert und auf Maven Central verfügbar ist.
Cave: Es ist wichtig, die letzten Zeilen der
.tex
Musterdateien zu entfernen , da diese Dateien sonst nicht mit der aktuellen Version von Maven Central geladen werden können.Zum Laden und Verwenden von
hyphenator
können Sie das folgende Java-Code-Snippet verwenden.texTable
ist der Name der.tex
Dateien, die die benötigten Muster enthalten. Diese Dateien sind auf der Projekt-Github-Site verfügbar.Danach
Hyphenator
ist der gebrauchsfertig. Um Silben zu erkennen, besteht die Grundidee darin, den Begriff an den bereitgestellten Bindestrichen aufzuteilen.Sie müssen auf
"\u00AD
" teilen ", da die API kein normales zurückgibt"-"
.Dieser Ansatz übertrifft die Antwort von Joe Basirico, da er viele verschiedene Sprachen unterstützt und die deutsche Silbentrennung genauer erkennt.
quelle
Ich bin vor einiger Zeit auf genau dasselbe Problem gestoßen.
Am Ende habe ich das CMU-Aussprachewörterbuch verwendet, um die meisten Wörter schnell und genau nachzuschlagen. Für Wörter, die nicht im Wörterbuch enthalten sind, habe ich auf ein Modell für maschinelles Lernen zurückgegriffen, das bei der Vorhersage von Silbenzahlen zu ~ 98% genau ist.
Ich habe das Ganze hier in einem benutzerfreundlichen Python-Modul zusammengefasst: https://github.com/repp/big-phoney
Installieren:
pip install big-phoney
Silben zählen:
Wenn Sie Python nicht verwenden und den ML-Modell-basierten Ansatz ausprobieren möchten, habe ich ziemlich ausführlich beschrieben , wie das Silbenzählmodell bei Kaggle funktioniert .
quelle
Danke @ joe-basirico und @tihamer. Ich habe den Code von @ tihamer auf Lua 5.1, 5.2 und Luajit 2 portiert (wird höchstwahrscheinlich auch auf anderen Versionen von Lua ausgeführt ):
countsyllables.lua
Und einige lustige Tests, um zu bestätigen, dass es funktioniert ( so viel es soll ):
countsyllables.tests.lua
quelle
Ich konnte keinen adäquaten Weg finden, um Silben zu zählen, deshalb habe ich selbst eine Methode entworfen.
Sie können meine Methode hier anzeigen: https://stackoverflow.com/a/32784041/2734752
Ich benutze eine Kombination aus einem Wörterbuch und einer Algorithmusmethode, um Silben zu zählen.
Sie können meine Bibliothek hier anzeigen: https://github.com/troywatson/Lawrence-Style-Checker
Ich habe gerade meinen Algorithmus getestet und hatte eine Trefferquote von 99,4%!
Ausgabe:
quelle
Nachdem ich viele Tests durchgeführt und auch Silbentrennungspakete ausprobiert hatte, schrieb ich meine eigenen anhand einer Reihe von Beispielen. Ich habe auch die Pakete
pyhyphen
und ausprobiert, diepyphen
mit Silbentrennungswörterbüchern kompatibel sind, aber sie erzeugen in vielen Fällen die falsche Anzahl von Silben. Dasnltk
Paket war für diesen Anwendungsfall einfach zu langsam.Meine Implementierung in Python ist Teil einer Klasse, die ich geschrieben habe, und die Silbenzählroutine wird unten eingefügt. Es überschätzt die Anzahl der Silben ein wenig, da ich immer noch keinen guten Weg gefunden habe, um stille Wortendungen zu erklären.
Die Funktion gibt das Verhältnis der Silben pro Wort zurück, wie es für eine Flesch-Kincaid-Lesbarkeitsbewertung verwendet wird. Die Zahl muss nicht genau sein, gerade nah genug für eine Schätzung.
Auf meiner i7-CPU der 7. Generation dauerte diese Funktion 1,1 bis 1,2 Millisekunden für einen Beispieltext mit 759 Wörtern.
quelle
Ich habe jsoup verwendet, um dies einmal zu tun. Hier ist ein Beispiel für einen Silbenparser:
quelle