Использование cmudict для подсчета слогов

Я пытаюсь написать программу, которая использует словарь произношения 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;
        }


    }

Что вы сделали или пробовали до сих пор?

Nielsvh 30.03.2018 23:46

Программа должна анализировать некоторые предоставленные текстовые файлы, подсчитывая количество слов, предложений и символов. Я смог закончить эти части без каких-либо проблем. Теперь я пытаюсь понять, как использовать предоставленный cmudict.txt для подсчета количества слогов. Я не уверен, с чего начать.

C0DeX 30.03.2018 23:49

Но что вы пробовали? Какую работу вы проделали? Просмотрите как задать вопрос. Покажи код или работай.

Nielsvh 31.03.2018 01:08

Я обновил пост. Спасибо!

C0DeX 31.03.2018 01:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
369
1

Ответы 1

Чтобы использовать 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), чтобы разделить весь вводимый текст на пробелы и знаки препинания. Это должно дать вам все слова. Затем вы можете запускать каждое слово по одному в описанной выше процедуре, чтобы вычислить количество слогов в слове и суммировать количество слогов по мере продвижения. Вы также можете использовать указанное выше, чтобы проверить свой предыдущий подсчет слов. Но ваша текущая процедура подсчета слов, вероятно, обнаруживает только начало каждого слова, а не конец, и может не помочь вам в этом, если вы не расширите ее, чтобы также обнаружить конец слова. Если вы это сделаете, вы можете игнорировать регулярное выражение для разделения.

Обратите внимание, что в некоторых словах может быть разное количество слогов. Прекрасным примером является слово «резюме», как в предложении «Пожалуйста, продолжайте писать свое резюме». Первое появление состоит из двух слогов, а второе - из трех. Таким образом, приведенный выше код можно переписать, чтобы проверить все фонетические представления и вернуть одно значение, если все они одинаковы, или вернуть (наименьший, наибольший) кортеж в противном случае.

Gary02127 04.12.2020 21:29

Хотя ваш код написан на Java, я надеюсь, что вы достаточно хорошо понимаете синтаксис Python, чтобы извлечь логику ...

Gary02127 24.12.2020 00:41

Другие вопросы по теме