Necesito encontrar una manera bastante eficiente de detectar sílabas en una palabra. P.ej,
Invisible -> in-vi-sib-le
Hay algunas reglas de syllabification que podrían usarse:
V CV VC CVC CCV CCCV CVCC
* donde V es una vocal y C es una consonante. P.ej,
Pronunciación (5 Pro-nun-ci-a-tion; CV-CVC-CV-V-CVC)
He probado algunos métodos, entre los que se encuentran el uso de expresiones regulares (que ayuda solo si quieres contar las sílabas) o la definición de reglas codificadas (un enfoque de fuerza bruta que demuestra ser muy ineficiente) y finalmente usar un autómata de estado finito (que sí no resulte con nada útil).
El propósito de mi aplicación es crear un diccionario de todas las sílabas en un idioma determinado. Este diccionario se utilizará más tarde para aplicaciones de revisión ortográfica (usando clasificadores bayesianos) y síntesis de texto a voz.
Le agradecería que me diera consejos sobre una forma alternativa de resolver este problema además de mis enfoques anteriores.
Trabajo en Java, pero cualquier consejo en C / C ++, C #, Python, Perl ... funcionaría para mí.
fuente
Respuestas:
Lea sobre el enfoque de TeX para este problema a los efectos de la separación silábica. Ver especialmente la tesis de la tesis de Frank Liang Word Hy-phen-a-tion de Com-put-er . Su algoritmo es muy preciso y luego incluye un pequeño diccionario de excepciones para casos en los que el algoritmo no funciona.
fuente
Me encontré con esta página buscando lo mismo, y encontré algunas implementaciones del documento de Liang aquí: https://github.com/mnater/hyphenator o el sucesor: https://github.com/mnater/Hyphenopoly
Eso es a menos que sea del tipo que disfruta leer una tesis de 60 páginas en lugar de adaptar el código disponible libremente para un problema no único. :)
fuente
Aquí hay una solución usando NLTK :
fuente
Estoy tratando de abordar este problema para un programa que calculará el puntaje de lectura flesch-kincaid y flesch de un bloque de texto. Mi algoritmo utiliza lo que encontré en este sitio web: http://www.howmanysyllables.com/howtocountsyllables.html y se acerca razonablemente. Todavía tiene problemas con palabras complicadas como invisible y separación silábica, pero he descubierto que entra en el estadio para mis propósitos.
Tiene la ventaja de ser fácil de implementar. Encontré que las "es" pueden ser silábicas o no. Es una apuesta, pero decidí eliminar las es en mi algoritmo.
fuente
Este es un problema particularmente difícil que el algoritmo de separación de sílabas de LaTeX no resuelve completamente. Se puede encontrar un buen resumen de algunos métodos disponibles y los desafíos involucrados en el documento Evaluación de algoritmos de sillabificación automática para inglés (Marchand, Adsett y Damper 2007).
fuente
¿Por qué calcularlo? Cada diccionario en línea tiene esta información. http://dictionary.reference.com/browse/invisible en · vis · i · ble
fuente
Gracias Joe Basirico, por compartir su implementación rápida y sucia en C #. He usado las bibliotecas grandes, y funcionan, pero generalmente son un poco lentas, y para proyectos rápidos, su método funciona bien.
Aquí está su código en Java, junto con casos de prueba:
El resultado fue el esperado (funciona lo suficientemente bien para Flesch-Kincaid):
fuente
Golpeando a @Tihamer y @ joe-basirico. Función muy útil, no perfecta , pero buena para la mayoría de los proyectos pequeños a medianos. Joe, he reescrito una implementación de tu código en Python:
¡Espero que alguien encuentre esto útil!
fuente
Perl tiene Lingua :: Fonología :: Syllable Módulo . Podrías probar eso, o intentar buscar en su algoritmo. También vi algunos otros módulos más antiguos allí.
No entiendo por qué una expresión regular solo te da un recuento de sílabas. Deberías poder obtener las sílabas usando paréntesis de captura. Suponiendo que puede construir una expresión regular que funcione, es decir.
fuente
Hoy encontré esta implementación de Java del algoritmo de división de palabras de Frank Liang con patrón para inglés o alemán, que funciona bastante bien y está disponible en Maven Central.
Cueva: es importante eliminar las últimas líneas del
.tex
archivos de patrones, porque de lo contrario esos archivos no se pueden cargar con la versión actual en Maven Central.Para cargar y usar
hyphenator
, puede usar el siguiente fragmento de código Java.texTable
es el nombre de los.tex
archivos que contienen los patrones necesarios. Esos archivos están disponibles en el sitio del proyecto github.Luego el
Hyphenator
está listo para usar. Para detectar sílabas, la idea básica es dividir el término en los guiones provistos.Debe dividirse en
"\u00AD
", ya que la API no devuelve un valor normal"-"
.Este enfoque supera la respuesta de Joe Basirico, ya que admite muchos idiomas diferentes y detecta la separación silábica más precisa.
fuente
Me encontré con este mismo problema hace un rato.
Terminé usando el Diccionario de Pronunciación CMU para búsquedas rápidas y precisas de la mayoría de las palabras. Para las palabras que no están en el diccionario, recurrí a un modelo de aprendizaje automático que es ~ 98% exacto al predecir recuentos de sílabas.
Abrigé todo en un módulo de Python fácil de usar aquí: https://github.com/repp/big-phoney
Instalar en pc:
pip install big-phoney
Conde Syllables:
Si no está utilizando Python y desea probar el enfoque basado en el modelo ML, hice una descripción bastante detallada sobre cómo funciona el modelo de conteo de sílabas en Kaggle .
fuente
Gracias @ joe-basirico y @tihamer. He portado el código de @ tihamer a Lua 5.1, 5.2 y luajit 2 (lo más probable es que también se ejecute en otras versiones de lua ):
countsyllables.lua
Y algunas pruebas divertidas para confirmar que funciona ( tanto como se supone que debe ):
countsyllables.tests.lua
fuente
No pude encontrar una manera adecuada de contar las sílabas, así que diseñé un método yo mismo.
Puede ver mi método aquí: https://stackoverflow.com/a/32784041/2734752
Utilizo una combinación de un diccionario y un método de algoritmo para contar las sílabas.
Puede ver mi biblioteca aquí: https://github.com/troywatson/Lawrence-Style-Checker
¡Acabo de probar mi algoritmo y obtuve una tasa de ataque del 99.4%!
Salida:
fuente
Después de hacer muchas pruebas y probar también los paquetes de separación de sílabas, escribí el mío basado en una serie de ejemplos. También probé los paquetes
pyhyphen
ypyphen
que interactúan con los diccionarios de separación silábica, pero en muchos casos producen un número incorrecto de sílabas. losnltk
paquete era simplemente demasiado lento para este caso de uso.Mi implementación en Python es parte de una clase que escribí, y la rutina de conteo de sílabas se pega a continuación. Sobreestima un poco la cantidad de sílabas, ya que todavía no he encontrado una buena manera de explicar las terminaciones de palabras silenciosas.
La función devuelve la proporción de sílabas por palabra, ya que se utiliza para una puntuación de legibilidad Flesch-Kincaid. El número no tiene que ser exacto, solo lo suficientemente cerca para una estimación.
En mi CPU i7 de séptima generación, esta función tomó 1.1-1.2 milisegundos para un texto de muestra de 759 palabras.
fuente
Solía jsoup para hacer esto una vez. Aquí hay un analizador de sílabas de muestra:
fuente