Preciso encontrar uma maneira bastante eficiente de detectar sílabas em uma palavra. Por exemplo,
Invisível -> in-vi-sib-le
Existem algumas regras de silabificação que podem ser usadas:
V CV VC CVC CCV CCCV CVCC
* onde V é uma vogal e C é uma consoante. Por exemplo,
Pronúncia (5 Pro-freira-cação; CV-CVC-CV-V-CVC)
Eu tentei alguns métodos, entre os quais estavam usando regex (que ajuda apenas se você quiser contar sílabas) ou definição de regra codificada (uma abordagem de força bruta que se mostra muito ineficiente) e finalmente usando um autômato de estado finito (que fez não resultar em nada útil).
O objetivo do meu aplicativo é criar um dicionário de todas as sílabas em um determinado idioma. Este dicionário será usado posteriormente para aplicativos de verificação ortográfica (usando classificadores bayesianos) e síntese de texto para fala.
Eu apreciaria se alguém pudesse me dar dicas de uma maneira alternativa de resolver esse problema, além das abordagens anteriores.
Eu trabalho em Java, mas qualquer dica em C / C ++, C #, Python, Perl ... funcionaria para mim.
fonte
Respostas:
Leia sobre a abordagem TeX para esse problema para fins de hifenização. Veja, em especial, a dissertação da tese de Frank Liang, Word Hy-phen-a-by, do autor . Seu algoritmo é muito preciso e inclui um pequeno dicionário de exceções para casos em que o algoritmo não funciona.
fonte
Eu tropecei nesta página procurando a mesma coisa e encontrei algumas implementações do documento de Liang aqui: https://github.com/mnater/hyphenator ou o sucessor: https://github.com/mnater/Hyphenopoly
Ou seja, a menos que você goste de ler uma tese de 60 páginas em vez de adaptar o código disponível gratuitamente para problemas não exclusivos. :)
fonte
Aqui está uma solução usando o NLTK :
fonte
Estou tentando resolver esse problema em um programa que calcula a pontuação de leitura de um bloco de texto flesch-kincaid e flesch. Meu algoritmo usa o que encontrei neste site: http://www.howmanysyllables.com/howtocountsyllables.html e fica razoavelmente próximo. Ele ainda tem problemas com palavras complicadas, como invisível e hifenização, mas descobri que isso entra no campo dos meus propósitos.
Ele tem a vantagem de ser fácil de implementar. Eu descobri que os "es" podem ser silábicos ou não. É uma aposta, mas decidi remover os es no meu algoritmo.
fonte
Este é um problema particularmente difícil que não é completamente resolvido pelo algoritmo de hifenização LaTeX. Um bom resumo de alguns métodos disponíveis e dos desafios envolvidos pode ser encontrado no artigo Avaliando algoritmos de silabificação automática para inglês (Marchand, Adsett e Damper 2007).
fonte
Por que calculá-lo? Todo dicionário on-line tem essa informação. http://dictionary.reference.com/browse/invisible em · vis · i · ble
fonte
Obrigado Joe Basirico, por compartilhar sua implementação rápida e suja em C #. Eu usei as grandes bibliotecas, e elas funcionam, mas geralmente são um pouco lentas e, para projetos rápidos, seu método funciona bem.
Aqui está o seu código em Java, junto com os casos de teste:
O resultado foi o esperado (funciona suficientemente bem para Flesch-Kincaid):
fonte
Bumping @Tihamer e @ joe-basirico. Função muito útil, não perfeita , mas boa para a maioria dos projetos de pequeno a médio porte. Joe, reescrevi uma implementação do seu código em Python:
Espero que alguém ache isso útil!
fonte
Perl tem o Lingua :: Fonologia :: Sílaba módulo . Você pode tentar isso ou tentar analisar seu algoritmo. Também vi outros módulos antigos lá.
Não entendo por que uma expressão regular fornece apenas uma contagem de sílabas. Você deve conseguir as sílabas usando parênteses de captura. Supondo que você possa construir uma expressão regular que funcione, ou seja.
fonte
Hoje encontrei essa implementação em Java do algoritmo de hifenização de Frank Liang com padrão para inglês ou alemão, que funciona muito bem e está disponível no Maven Central.
Cave: É importante remover as últimas linhas dos
.tex
arquivos de padrão, pois, caso contrário, esses arquivos não poderão ser carregados com a versão atual no Maven Central.Para carregar e usar o
hyphenator
, você pode usar o seguinte snippet de código Java.texTable
é o nome dos.tex
arquivos que contêm os padrões necessários. Esses arquivos estão disponíveis no site do projeto github.Depois o
Hyphenator
está pronto para uso. Para detectar sílabas, a idéia básica é dividir o termo nos hífens fornecidos.Você precisa se separar
"\u00AD
", pois a API não retorna um normal"-"
.Essa abordagem supera a resposta de Joe Basirico, uma vez que suporta muitos idiomas diferentes e detecta a hifenização alemã mais precisa.
fonte
Encontrei exatamente esse mesmo problema há pouco tempo.
Acabei usando o Dicionário de Pronúncia da CMU para pesquisas rápidas e precisas da maioria das palavras. Para palavras que não estão no dicionário, voltei a um modelo de aprendizado de máquina com ~ 98% de precisão na previsão da contagem de sílabas.
Eu envolvi tudo em um módulo python fácil de usar aqui: https://github.com/repp/big-phoney
Instalar:
pip install big-phoney
Contagem de sílabas:
Se você não está usando Python e deseja tentar a abordagem baseada no modelo ML, escrevi bastante detalhadamente como o modelo de contagem de sílabas funciona no Kaggle .
fonte
Obrigado @ joe-basirico e @tihamer. Portei o código do @ tihamer para Lua 5.1, 5.2 e luajit 2 ( provavelmente também será executado em outras versões do lua ):
countsyllables.lua
E alguns testes divertidos para confirmar que funciona ( tanto quanto deveria ):
countsyllables.tests.lua
fonte
Não consegui encontrar uma maneira adequada de contar sílabas, então eu mesmo projetei um método.
Você pode ver meu método aqui: https://stackoverflow.com/a/32784041/2734752
Eu uso uma combinação de um método de dicionário e algoritmo para contar sílabas.
Você pode ver minha biblioteca aqui: https://github.com/troywatson/Lawrence-Style-Checker
Acabei de testar meu algoritmo e tinha uma taxa de ataque de 99,4%!
Resultado:
fonte
Depois de fazer muitos testes e experimentar pacotes de hifenização, escrevi os meus com base em vários exemplos. Eu também tentei os pacotes
pyhyphen
epyphen
que fazem interface com os dicionários de hifenização, mas eles produzem o número errado de sílabas em muitos casos. Onltk
pacote estava muito lento para este caso de uso.Minha implementação em Python faz parte de uma classe que escrevi e a rotina de contagem de sílabas é colada abaixo. Superestima um pouco o número de sílabas, pois ainda não encontrei uma boa maneira de explicar as terminações de palavras silenciosas.
A função retorna a proporção de sílabas por palavra, conforme é usada para uma pontuação de legibilidade de Flesch-Kincaid. O número não precisa ser exato, apenas perto o suficiente para uma estimativa.
Na minha CPU i7 de 7ª geração, essa função levou 1,1-1,2 milissegundos para um texto de amostra de 759 palavras.
fonte
Eu usei o jsoup para fazer isso uma vez. Aqui está um exemplo de analisador de sílaba:
fonte