J'ai besoin de trouver un moyen assez efficace de détecter les syllabes dans un mot. Par exemple,
Invisible -> in-vi-sib-le
Certaines règles de syllabification pourraient être utilisées:
V CV VC CVC CCV CCCV CVCC
* où V est une voyelle et C est une consonne. Par exemple,
Prononciation (5 Pro-nun-ci-a-tion; CV-CVC-CV-V-CVC)
J'ai essayé quelques méthodes, parmi lesquelles l'utilisation de regex (qui aide seulement si vous voulez compter les syllabes) ou la définition de règle codée en dur (une approche de la force brute qui s'avère très inefficace) et enfin l'utilisation d'un automate à états finis (ce qui a fait ne donne rien d’utile).
Le but de mon application est de créer un dictionnaire de toutes les syllabes dans une langue donnée. Ce dictionnaire sera utilisé plus tard pour les applications de vérification orthographique (utilisant des classificateurs bayésiens) et la synthèse de texte à parole.
J'apprécierais si l'on pouvait me donner des conseils sur une autre façon de résoudre ce problème en plus de mes approches précédentes.
Je travaille en Java, mais toute astuce en C / C ++, C #, Python, Perl ... fonctionnerait pour moi.
la source
Réponses:
Découvrez l'approche TeX de ce problème aux fins de la césure. Voir en particulier la thèse de Thèse de Frank Liang Word Hy-phen-a-tion de Com-put-er . Son algorithme est très précis, et inclut alors un dictionnaire de petites exceptions pour les cas où l'algorithme ne fonctionne pas.
la source
Je suis tombé sur cette page à la recherche de la même chose et j'ai trouvé quelques implémentations du document de Liang ici: https://github.com/mnater/hyphenator ou le successeur: https://github.com/mnater/Hyphenopoly
À moins que vous ne soyez du genre à aimer lire une thèse de 60 pages au lieu d'adapter du code disponible gratuitement pour un problème non unique. :)
la source
Voici une solution utilisant NLTK :
la source
J'essaie de résoudre ce problème pour un programme qui calculera le score de lecture flesch-kincaid et flesch d'un bloc de texte. Mon algorithme utilise ce que j'ai trouvé sur ce site Web: http://www.howmanysyllables.com/howtocountsyllables.html et il se rapproche raisonnablement. Il a encore des problèmes avec des mots compliqués comme invisible et césure, mais j'ai trouvé que cela correspondait à mes besoins.
Il a l'avantage d'être facile à mettre en œuvre. J'ai trouvé que le "es" pouvait être syllabique ou non. C'est un pari, mais j'ai décidé de supprimer les es dans mon algorithme.
la source
C'est un problème particulièrement difficile qui n'est pas complètement résolu par l'algorithme de césure LaTeX. Un bon résumé de certaines méthodes disponibles et des défis impliqués peut être trouvé dans le document Evaluating Automatic Syllabification Algorithms for English (Marchand, Adsett et Damper 2007).
la source
Pourquoi le calculer? Chaque dictionnaire en ligne a cette information. http://dictionary.reference.com/browse/invisible in · vis · i · ble
la source
Merci Joe Basirico, pour le partage de votre implémentation rapide et sale en C #. J'ai utilisé les grandes bibliothèques, et elles fonctionnent, mais elles sont généralement un peu lentes, et pour les projets rapides, votre méthode fonctionne bien.
Voici votre code en Java, ainsi que les cas de test:
Le résultat était comme prévu (cela fonctionne assez bien pour Flesch-Kincaid):
la source
Bumping @Tihamer et @ joe-basirico. Fonction très utile, pas parfaite , mais bonne pour la plupart des petits et moyens projets. Joe, j'ai réécrit une implémentation de votre code en Python:
J'espère que quelqu'un trouvera cela utile!
la source
Perl a le module Lingua :: Phonology :: Syllable . Vous pouvez essayer cela, ou essayer de regarder dans son algorithme. J'y ai vu aussi quelques autres modules plus anciens.
Je ne comprends pas pourquoi une expression régulière ne vous donne qu'un nombre de syllabes. Vous devriez pouvoir obtenir les syllabes elles-mêmes en utilisant les parenthèses de capture. En supposant que vous puissiez construire une expression régulière qui fonctionne, c'est-à-dire.
la source
Aujourd'hui, j'ai trouvé cette implémentation Java de l'algorithme de césure de Frank Liang avec un motif pour l'anglais ou l'allemand, qui fonctionne assez bien et est disponible sur Maven Central.
Cave: Il est important de supprimer les dernières lignes des
.tex
fichiers de signatures, car sinon ces fichiers ne pourront pas être chargés avec la version actuelle sur Maven Central.Pour charger et utiliser le
hyphenator
, vous pouvez utiliser l'extrait de code Java suivant.texTable
est le nom des.tex
fichiers contenant les modèles nécessaires. Ces fichiers sont disponibles sur le site github du projet.Ensuite, le
Hyphenator
est prêt à être utilisé. Pour détecter les syllabes, l'idée de base est de diviser le terme aux tirets fournis.Vous devez diviser sur
"\u00AD
", car l'API ne retourne pas un normal"-"
.Cette approche surpasse la réponse de Joe Basirico, car elle prend en charge de nombreuses langues différentes et détecte plus précisément la césure allemande.
la source
J'ai rencontré exactement le même problème il y a quelque temps.
J'ai fini par utiliser le dictionnaire de prononciation CMU pour des recherches rapides et précises de la plupart des mots. Pour les mots qui ne figurent pas dans le dictionnaire, je suis revenu à un modèle d'apprentissage automatique qui est précis à environ 98% pour prédire le nombre de syllabes.
J'ai tout emballé dans un module python facile à utiliser ici: https://github.com/repp/big-phoney
Installer:
pip install big-phoney
Compter les syllabes:
Si vous n'utilisez pas Python et que vous souhaitez essayer l'approche basée sur le modèle ML, j'ai rédigé un article assez détaillé sur le fonctionnement du modèle de comptage de syllabes sur Kaggle .
la source
Merci @ joe-basirico et @tihamer. J'ai porté le code de @ tihamer sur Lua 5.1, 5.2 et luajit 2 (fonctionnera probablement également sur d'autres versions de lua ):
countsyllables.lua
Et quelques tests amusants pour confirmer que cela fonctionne ( autant qu'il est censé le faire ):
countsyllables.tests.lua
la source
Je ne trouvais pas de moyen adéquat pour compter les syllabes, j'ai donc conçu une méthode moi-même.
Vous pouvez voir ma méthode ici: https://stackoverflow.com/a/32784041/2734752
J'utilise une combinaison d'un dictionnaire et d'une méthode d'algorithme pour compter les syllabes.
Vous pouvez consulter ma bibliothèque ici: https://github.com/troywatson/Lawrence-Style-Checker
Je viens de tester mon algorithme et j'ai eu un taux de grève de 99,4%!
Production:
la source
Après avoir fait beaucoup de tests et essayé des packages de césure, j'ai écrit le mien basé sur un certain nombre d'exemples. J'ai également essayé les packages
pyhyphen
etpyphen
qui s'interfacent avec les dictionnaires de césure, mais ils produisent le mauvais nombre de syllabes dans de nombreux cas. Lenltk
package était tout simplement trop lent pour ce cas d'utilisation.Mon implémentation en Python fait partie d'une classe que j'ai écrite, et la routine de comptage de syllabes est collée ci-dessous. Il surestime un peu le nombre de syllabes car je n'ai toujours pas trouvé de bon moyen de rendre compte des fins de mots silencieuses.
La fonction renvoie le rapport de syllabes par mot tel qu'il est utilisé pour un score de lisibilité Flesch-Kincaid. Le nombre n'a pas besoin d'être exact, juste assez proche pour une estimation.
Sur mon processeur i7 de 7e génération, cette fonction prenait 1,1 à 1,2 millisecondes pour un exemple de texte de 759 mots.
la source
J'ai utilisé jsoup pour le faire une fois. Voici un exemple d'analyseur de syllabe:
la source