Làm thế nào để có được số lượng âm tiết trong một từ?


8

Tôi đã trải qua bài này mà sử dụng nltkcmudictcho đếm số lượng âm tiết trong một từ:

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

Tuy nhiên, đối với các từ bên ngoài từ điển của cmu như tên chẳng hạn : Rohit, nó không mang lại kết quả.

Vì vậy, có cách nào khác / tốt hơn để đếm âm tiết cho một từ không?


1
Chà, wordcalc.com có thể xử lý "Rohit", nên có vẻ như điều đó là có thể. Tôi không biết làm thế nào nó làm điều đó mặc dù. . . và nó không hoàn hảo.
Neil Slater

wordcalc.com đã cho "âm tiết" đếm 1 (tôi gọi nó là 3). Tôi nghĩ rằng nó có thể đang sử dụng các quy tắc gạch nối từ câu hỏi được liên kết của bạn. Có vẻ như những điều này trùng với các âm tiết phát âm rất nhiều thời gian, nhưng không phải là 100%.
Neil Slater

Câu trả lời:


10

Bạn có thể thử một thư viện Python khác có tên Pyphen . Thật dễ dàng để sử dụng và hỗ trợ rất nhiều ngôn ngữ.

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

Điều này khá hữu ích nhưng nó cho rất nhiều kết quả sai. Chẳng hạn, nó tính 'readier' ​​là 2 âm tiết thay vì 3, 'karate' là 1 thay vì 3, 'insciance' là 3 thay vì 4, 'Siberia' là 1 thay vì 4, và nhiều hơn nữa.
Hayze

4

Tôi đã phải đối mặt với cùng một vấn đề, đây là điều tôi đã làm:
Nắm bắt lỗi chính bạn gặp phải khi không tìm thấy từ trong từ điển của cmu như dưới đây:

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)

Gọi chức năng âm tiết dưới đây

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.