Como obter o número de sílabas em uma palavra?

8

Eu já passei por este post que usa nltk's cmudictpara contar o número de sílabas em uma palavra:

from nltk.corpus import cmudict
d = cmudict.dict()
def nsyl(word):
  return [len(list(y for y in x if y[-1].isdigit())) for x in d[word.lower()]] 

No entanto, para palavras fora do dicionário do cmu, como nomes por exemplo:, Rohitele não fornece um resultado.

Então, existe alguma outra / melhor maneira de contar sílabas para uma palavra?

Dawny33
fonte
11
Bem, o wordcalc.com pode lidar com "Rohit", então parece que é possível. Eu não sei como está fazendo isso. . . e não é perfeito.
Neil Slater
wordcalc.com deu à "sílaba" uma contagem de 1 (eu chamaria de 3). Eu acho que pode estar usando as regras de hifenização da sua pergunta vinculada. Parece que coincidem com sílabas pronunciadas a maior parte do tempo, mas não 100%.
Neil Slater

Respostas:

10

Você pode tentar outra biblioteca Python chamada Pyphen . É fácil de usar e suporta muitos idiomas.

import pyphen
dic = pyphen.Pyphen(lang='en')
print dic.inserted('Rohit')
>>'Ro-hit'
Tasos
fonte
Isso é bastante útil, mas fornece muitos resultados errados. Por exemplo, conta 'mais pronto' como 2 sílabas em vez de 3, 'karatê' como 1 em vez de 3, 'despreocupação' como 3 em vez de 4, 'Sibéria' como 1 em vez de 4 e muito mais.
Hayze 6/03/19
4

Eu estava enfrentando exatamente o mesmo problema, foi o que fiz:
Capture o erro de chave que você recebe quando a palavra não é encontrada no dicionário do cmu, como abaixo:

from nltk.corpus import cmudict
d = cmudict.dict()

def nsyl(word):
    try:
        return [len(list(y for y in x if y[-1].isdigit())) for x in d[word.lower()]]
    except KeyError:
        #if word not found in cmudict
        return syllables(word)

Chame a função de sílabas abaixo

def syllables(word):
    #referred from stackoverflow.com/questions/14541303/count-the-number-of-syllables-in-a-word
    count = 0
    vowels = 'aeiouy'
    word = word.lower()
    if word[0] in vowels:
        count +=1
    for index in range(1,len(word)):
        if word[index] in vowels and word[index-1] not in vowels:
            count +=1
    if word.endswith('e'):
        count -= 1
    if word.endswith('le'):
        count += 1
    if count == 0:
        count += 1
    return count
shantanuSpark
fonte