Wie erhalte ich die Anzahl der Silben in einem Wort?


8

Ich habe bereits durchgemacht diesen Beitrag die Anwendungen nltk‚s cmudictzum Zählen der Anzahl von Silben in einem Wort:

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()]] 

Für Wörter außerhalb des cmu-Wörterbuchs wie z. B. Namen Rohitgibt es jedoch kein Ergebnis.

Gibt es eine andere / bessere Möglichkeit, Silben für ein Wort zu zählen?


1
Nun, wordcalc.com kann mit "Rohit" umgehen, also scheint es möglich zu sein. Ich weiß allerdings nicht, wie es geht. . . und es ist nicht perfekt.
Neil Slater

wordcalc.com gab "Silbe" eine Zählung von 1 (ich würde es 3 nennen). Ich denke, es werden möglicherweise die Silbentrennungsregeln aus Ihrer verknüpften Frage verwendet. Es scheint, dass diese häufig mit ausgesprochenen Silben übereinstimmen, jedoch nicht zu 100%.
Neil Slater

Antworten:


10

Sie können eine andere Python-Bibliothek namens Pyphen ausprobieren . Es ist einfach zu bedienen und unterstützt viele Sprachen.

import pyphen
dic = pyphen.Pyphen(lang='en')
print dic.inserted('Rohit')
>>'Ro-hit'

Dies ist ziemlich nützlich, führt aber zu vielen falschen Ergebnissen. Zum Beispiel zählt "Readier" als 2 Silben anstelle von 3, "Karate" als 1 statt 3, "Unbekümmertheit" als 3 statt 4, "Sibirien" als 1 statt 4 und viele mehr.
Hayze

4

Ich hatte genau das gleiche Problem, das habe ich getan:
Fangen Sie den Schlüsselfehler ab, den Sie erhalten, wenn das Wort nicht wie folgt im Wörterbuch von cmu gefunden wird:

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)

Rufen Sie die folgende Silbenfunktion auf

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.