Я бы использовал Пифен . Этот модуль имеет класс Pyphen
, используемый для переноса слов. Один из его методов, positions()
, возвращает количество мест в слове, где оно может быть разделено:
>>> from pyphen import Pyphen
>>> p = Pyphen(lang='en_US')
>>> p.positions('exclamation')
[2, 5, 7]
Если слово «восклицательный знак» можно разделить на три части, оно состоит из четырех слогов, поэтому вам просто нужно отфильтровать все слова по нескольким разделенным местам.
. , .
Но я заметил, что вы отметили его как вопрос [t: nltk]. Я не имел опыта работы с NLTK, но вопрос , предложенный @Jules, имеет хорошее предложение в этом аспекте: использовать модуль cmudict
. Он дает вам список произношения слова в американском английском:
>>> from nltk.corpus import cmudict
>>> d = cmudict.dict()
>>> pronounciations = d['exasperation']
>>> pronounciations
[['EH2', 'K', 'S', 'AE2', 'S', 'P', 'ER0', 'EY1', 'SH', 'AH0', 'N']]
К счастью, у нашего первого слова есть только одно произношение. Он представлен в виде списка строк, каждая из которых представляет фонему:
>>> phonemes = pronounciations[0]
>>> phonemes
['EH2', 'K', 'S', 'AE2', 'S', 'P', 'ER0', 'EY1', 'SH', 'AH0', 'N']
Обратите внимание, что гласные фонемы имеют номер в конце, обозначающий ударение :
Гласные отмечены для ударения (1 = основной, 2 = вторичный, 0 = без стресса). Например: ЕСТЕСТВЕННЫЙ 1 N AE1 CH ER0 AH0 L
Итак, нам просто нужно посчитать количество фонем с цифрами в конце:
>>> vowels = [ph for ph in phonemes if ph[-1].isdigit()]
>>> vowels
['EH2', 'AE2', 'ER0', 'EY1', 'AH0']
>>> len(vowels)
5
. , ,
Не уверен, что это лучший вариант, но я думаю, что вы можете решить вашу проблему отсюда.