Я пытаюсь написать программу, которая использует словарь произношения CMU (cmudict.txt) для подсчета всех слогов из текстового файла, содержащего английские слова. Какой будет лучший подход? Программа должна анализировать некоторые предоставленные текстовые файлы, подсчитывая количество слов, предложений и символов. Я смог закончить эти части без каких-либо проблем. Теперь я пытаюсь понять, как использовать предоставленный cmudict.txt для подсчета количества слогов. Я не уверен, с чего начать. Спасибо!
while ((line = reader.readLine()) != null) {
if (line.equals("")) {
numParagraph++;
}
if (!(line.equals(""))) {
// Count number of Characters in file
numChar += line.length();
// Count number of words in file
String[] wordList = line.split("\\s+");
numWords += wordList.length;
// Count number of sentences in a file
for(int i = 0; i < line.length(); i++) {
if (delimiters.indexOf(line.charAt(i)) != -1) {
sentenceCount++;
}
}
//Average number of Characters per word
wordListLength = wordList.length;
}
}
Программа должна анализировать некоторые предоставленные текстовые файлы, подсчитывая количество слов, предложений и символов. Я смог закончить эти части без каких-либо проблем. Теперь я пытаюсь понять, как использовать предоставленный cmudict.txt для подсчета количества слогов. Я не уверен, с чего начать.
Но что вы пробовали? Какую работу вы проделали? Просмотрите как задать вопрос. Покажи код или работай.
Я обновил пост. Спасибо!




Чтобы использовать CMUdict для подсчета слогов, вам просто нужно найти запись CMUdict, соответствующую слову, которое вы анализируете. Когда у вас есть запись, вы можете посчитать в ней гласные звуки. Гласные звуки всегда оканчиваются цифрой 0, 1 или 2.
Существует модуль под названием cmudict, который автоматически импортирует библиотеку CMUdict и выполняет ее предварительную обработку. Вам следует начать с этого.
import cmudict
def lookup_word(word_s):
return cmudict.dict().get(word_s)
def count_syllables(word_s):
count = 0
phones = lookup_word(word_s) # this returns a list of matching phonetic rep's
if phones: # if the list isn't empty (the word was found)
phones0 = phones[0] # process the first
count = len([p for p in phones0 if p[-1].isdigit()]) # count the vowels
return count
word_s = 'hello'
phones = cmudict.dict().get(word_s)
count = count_syllables(word_s)
print(f"PHONES({word_s!r}) yields {phones}\nCOUNT is {count}")
Вы можете сделать с CMUdict гораздо больше, чем указано выше, но это только начало ... Удачного кодирования!
PS - Перечитывая ваш пост, вижу, что пропустил его часть. Вы можете использовать регулярное выражение (regex), чтобы разделить весь вводимый текст на пробелы и знаки препинания. Это должно дать вам все слова. Затем вы можете запускать каждое слово по одному в описанной выше процедуре, чтобы вычислить количество слогов в слове и суммировать количество слогов по мере продвижения. Вы также можете использовать указанное выше, чтобы проверить свой предыдущий подсчет слов. Но ваша текущая процедура подсчета слов, вероятно, обнаруживает только начало каждого слова, а не конец, и может не помочь вам в этом, если вы не расширите ее, чтобы также обнаружить конец слова. Если вы это сделаете, вы можете игнорировать регулярное выражение для разделения.
Обратите внимание, что в некоторых словах может быть разное количество слогов. Прекрасным примером является слово «резюме», как в предложении «Пожалуйста, продолжайте писать свое резюме». Первое появление состоит из двух слогов, а второе - из трех. Таким образом, приведенный выше код можно переписать, чтобы проверить все фонетические представления и вернуть одно значение, если все они одинаковы, или вернуть (наименьший, наибольший) кортеж в противном случае.
Хотя ваш код написан на Java, я надеюсь, что вы достаточно хорошо понимаете синтаксис Python, чтобы извлечь логику ...
Что вы сделали или пробовали до сих пор?