La détection de syllabes dans un mot
J'ai besoin de trouver un assez efficace pour détecter les syllabes dans un mot. E. g.,
Invisible -> in-vi-sib-le
Il y a quelques syllabification des règles qui pourraient être utilisés:
V
CV
VC
CVC
CCV
CCCV
CCCV
*où V est une voyelle et C est une consonne.
E. g.,
Prononciation (5 Pro-nun-ci-a-tion; CV-CVC-CV-V-CVC)
J'ai essayé plusieurs méthodes, parmi lesquelles ont été en utilisant les regex (qui permet uniquement si vous voulez compter les syllabes) ou codés en dur règle de définition (une approche par force brute qui s'avère être très efficace) et, enfin, à l'aide d'un automates d'états finis (qui n'a pas abouti à quelque chose d'utile).
Le but de ma demande est de créer un dictionnaire de tous les syllabes dans une langue donnée. Ce dictionnaire sera par la suite utilisé pour la vérification orthographique des applications (à l'aide de Bayésienne classificateurs) et le texte de synthèse de la parole.
J'apprécierais si on pouvait me donner des conseils sur une autre façon de résoudre ce problème en plus de mes précédentes approches.
Je travaille en Java, mais tout conseil en C/C++, C#, Python, Perl... pourrait fonctionner pour moi.
- Ne vous voulez vraiment le réel de points de division ou tout simplement le nombre de syllabes dans un mot? Dans ce dernier cas, envisager de chercher les mots dans un texte-à-parole du dictionnaire et de compter les phonèmes qui codent pour des sons de voyelles.
- Le moyen le plus efficace (calcul-sage; pas de stockage-sage), je dirais juste pour avoir un Python dictionnaire avec des mots clés et le nombre de syllabes comme des valeurs. Cependant, vous auriez encore besoin d'une solution de repli pour les mots qui ne se trouvent pas dans le dictionnaire. Laissez-moi savoir si vous trouvez un tel dictionnaire!
Vous devez vous connecter pour publier un commentaire.
Lire sur les TeX approche à ce problème pour l'application de la césure. Surtout voir Frank Liang est la thèse Mot Hy-phen-a-tion par Com-mis-er. Son algorithme est très précis, et puis comprend un petit exceptions dictionnaire pour les cas où l'algorithme ne fonctionne pas.
Je suis tombé sur cette page à la recherche de la même chose, et trouvé quelques implémentations de la Liang papier ici:
https://github.com/mnater/hyphenator
C'est moins que vous êtes le type qui aime la lecture d'une page 60 thèse au lieu de s'adapter librement disponible code pour non-unique problème. 🙂
Voici une solution à l'aide de NLTK:
Je suis en train d'essayer de s'attaquer à ce problème pour un programme qui calcule la flesch-kincaid et de lecture de flesch score d'un bloc de texte. Mon algorithme utilise ce que j'ai trouvé sur ce site: http://www.howmanysyllables.com/howtocountsyllables.html et il devient assez proches. Il a des difficultés sur les mots compliqués comme invisible et la césure, mais j'ai trouvé qu'elle obtient de rester dans la course pour mes fins.
Il a l'avantage d'être facile à mettre en œuvre. J'ai trouvé le "es" peut être syllabiques ou pas. C'est un pari, mais j'ai décidé de supprimer l'es dans mon algorithme.
C'est un problème particulièrement difficile qui n'est pas complètement résolu par le LaTeX de césure de l'algorithme. Un bon résumé de certaines méthodes et les défis peuvent être trouvés dans le document L'évaluation Automatique de la Syllabification Algorithmes pour l'anglais (Marchand, Adsett, et d'un Amortisseur 2007).
Merci Joe Basirico, pour le partage de votre rapide et sale de la mise en œuvre en C#. J'ai utilisé les grandes bibliothèques, et ils travaillent, mais ils sont généralement un peu lent, et pour les projets rapides, votre méthode fonctionne très bien.
Ici votre code est en Java, ainsi que des cas de test:
Le résultat a été comme prévu (il fonctionne assez bien pour Flesch-Kincaid):
Cogner @Tihamer et @joe-basirico. Fonction très utile, pas parfait, mais bon pour la plupart des petites et moyennes projets. Joe, j'ai ré-écrit une mise en œuvre de votre code en Python:
Espère que quelqu'un trouve cette pratique!
Perl a Lingua::Phonologie::Syllabe module. Vous pourriez essayer, ou à essayer de le chercher dans son algorithme. J'ai vu quelques autres anciens modules, là aussi.
Je ne comprends pas pourquoi une expression régulière ne vous donne qu'un nombre de syllabes. Vous devriez être en mesure d'obtenir les syllabes eux-mêmes à l'aide de la capture de parenthèses. En supposant que vous pouvez construire une expression régulière qui fonctionne, ce qui est.
Aujourd'hui j'ai trouvé cette Java mise en œuvre de Frank Liang de la césure algorithmn avec motif de l'anglais ou de l'allemand, qui fonctionne très bien et est disponible sur Maven Central.
Grotte: Il est important d'enlever les dernières lignes de la
.tex
fichiers de motifs, parce que sinon ces fichiers ne peuvent pas être chargées avec la version actuelle sur Maven Central.Chargement et l'utilisation de la
hyphenator
, vous pouvez utiliser le code Java suivant extrait.texTable
est le nom de la.tex
les fichiers contenant le besoin de modèles. Ces fichiers sont disponibles sur le projet github site.Après la
Hyphenator
est prêt à l'emploi. Pour détecter les syllabes, l'idée de base est de diviser le terme à la condition des traits d'union.Vous avez besoin de partager sur
"\u00AD
", depuis l'API n'a pas de retour à la normale"-"
.Cette approche est plus performante que la réponse de Joe Basirico, puisqu'il prend en charge de nombreuses langues différentes et détecte allemand coupure des mots plus précis.
Pourquoi le calculer? Chaque dictionnaire en ligne a cette info. http://dictionary.reference.com/browse/invisible
à·vis·i·ble
Merci @joe-basirico et @tihamer. J'ai porté @tihamer du code Lua 5.1, 5.2 et luajit 2 (probablement se tourner sur d'autres versions de lua ainsi):
countsyllables.lua
Et de l'amusement des tests pour confirmer qu'il fonctionne (autant qu'il est censé):
countsyllables.tests.lua
Je ne pouvais pas trouver une façon de compter les syllabes, j'ai donc conçu une méthode de moi-même.
Vous pouvez consulter ma méthode ici: https://stackoverflow.com/a/32784041/2734752
- Je utiliser une combinaison d'un dictionnaire et de l'algorithme de la méthode pour compter les syllabes.
Vous pouvez consulter ma bibliothèque ici: https://github.com/troywatson/Lawrence-Style-Checker
Je viens de tester de mon algorithme et avait une de 99,4% taux de grève!
De sortie:
J'ai rencontré exactement le même problème il y a peu.
J'ai fini par utiliser la La CMU Dictionnaire de Prononciation rapide et précis des recherches de la plupart des mots. Pour les mots qui ne sont pas dans le dictionnaire, je suis tombé en arrière un appareil à un modèle d'apprentissage qui s ~98% de précision dans la prédiction de la syllabe compte.
J'ai emballé le tout dans un facile à utiliser le module python ici: https://github.com/repp/big-phoney
Installer:
pip install big-phoney
Compter Les Syllabes:
Si vous n'êtes pas à l'aide de Python et que vous voulez essayer la ML-approche par modèle, j'ai fait un assez détaillée écrire sur la façon dont la syllabe comptage modèle fonctionne sur Kaggle.
Après avoir fait beaucoup de tests et d'essayer de césure paquets ainsi, j'ai écrit ma propre fondée sur un certain nombre d'exemples. J'ai aussi essayé la
pyhyphen
etpyphen
paquets que les interfaces avec les dictionnaires de césure, mais ils produisent un mauvais nombre de syllabes dans de nombreux cas. Lenltk
paquet était tout simplement trop lent pour ce cas d'utilisation.Mon implémentation en Python fait partie d'une classe que j'ai écrit, et la syllabe comptage de routine est collé ci-dessous. Il sur-estime le nombre de syllabes un peu, car je n'ai toujours pas trouvé un bon moyen de prendre en compte le silence des terminaisons de mots.
La fonction renvoie le ratio de syllabes par mot tel qu'il est utilisé pour un Flesch-Kincaid score de lisibilité. Le nombre n'a pas à être exact, juste assez près pour un devis.
Sur mon 7ème génération i7, cette fonction a pris 1.1-1.2 millisecondes pour une 759 mot de l'échantillon de texte.
J'ai utilisé jsoup de le faire une fois. Voici un exemple de syllabe analyseur: