Создайте список английских слов, содержащих последовательные согласные звуки - PullRequest
4 голосов
/ 19 февраля 2010

Начните с этого:

[G|C] * [T] *

Напишите программу, которая генерирует это:

Cat
Cut
Cute
City <-- NOTE: this one is wrong, because City has an "ESS" sound at the start.
Caught
...
Gate
Gotti
Gut
...
Kit
Kite
Kate
Kata
Katie

Другой пример, это:

[C] * [T] * [N]

Должен произвести это:

Хлопок Котенок

С чего мне начать исследование, когда я пойму, как написать программу / скрипт, который это делает?

Ответы [ 6 ]

4 голосов
/ 19 февраля 2010

Вам нужен список слов или словарь, который использует что-то вроде международного фонетического алфавита или какой-либо другой стандартный фонетический способ написания слов. Это должно было бы иметь список английских слов и их соответствующих фонетических написаний. Я понятия не имею, где вы могли бы получить его, потому что я не думаю, что производители стандартных словарей просто раздают такую ​​информацию.

4 голосов
/ 19 февраля 2010

Вы можете сделать это, используя регулярные выражения для словаря, содержащего фонетические версии слов.

Вот пример в Javascript:

     <html>
    <head>
        <title>Test</title>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <script>

            $.get('cmudict0.3',function (data) {
                matches = data.match(/^(\S*)\s+K.*\sT.*\sN$/mg);
                $('body').html('<p>'+matches.join('<br/> ')+'</p>');
            })

        </script>
    </head>
    <body>
    </body>
</html>

Вам нужно будет загрузить списоквсе слова из http://icon.shef.ac.uk/Moby/mpron.tar.Z и поместить его (без сжатия) в ту же папку, что и файл HTML.Я только перевел [C] * [T] * [N] версию в регулярное выражение, и результат не очень хороший, но он даст вам идею.Вот пример вывода:

CALTON K AE1 L T AH0 N
CAMPTON K AE1 M P T AH0 N
CANTEEN K AE0 N T IY1 N
CANTIN K AA0 N T IY1 N
CANTLIN K AE1 N T L IH0 N
CANTLON K AE1 N T L AH0 N
...
COTTERMAN K AA1 T ER0 M AH0 N
COTTMAN K AA1 T M AH0 N
COTTON K AA1 T AH0 N
COTTON(2) K AO1 T AH0 N
COULSTON K AW1 L S T AH0 N
COUNTDOWN K AW1 N T D AW2 N
..
KITSON K IH1 T S AH0 N
KITTELSON K IH1 T IH0 L S AH0 N
KITTEN K IH1 T AH0 N
KITTERMAN K IH1 T ER0 M AH0 N
KITTLESON K IH1 T L IH0 S AH0 N
...
2 голосов
/ 19 февраля 2010

Вы хотите публичное произнесение. Это часть проекта «толпы».

Вы найдете объяснение и ссылки на документы здесь: http://en.wikipedia.org/wiki/Moby_Project

Произношение Moby - это список из около 170 тысяч слов и их фонетических произношений.

Оттуда должен быть относительно простой процесс создания программы.

1 голос
/ 25 февраля 2010

Вы можете сделать это, используя шаги, которые я обрисовал. Сначала я опишу алгоритм, за которым следует некоторый ( непроверенный и, возможно, неработающий ) Java-код.

Примечание: я буду использовать библиотеку apache commons-codec.


Алгоритм:

  1. Используйте регулярное выражение для представления вашего шаблона ввода.
  2. Из словаря "допустимых известных слов" отфильтруйте подмножество, соответствующее вашему регулярному выражению. Давайте назовем это согласованным подмножеством (MS)
  3. Используйте алгоритм двойного метафона для кодирования этих слов из MS.
  4. Примените фонетическую фильтрацию для сокращения MS в соответствии с вашими потребностями.

Чтобы проиллюстрировать, как работают шаги 3 и 4, я сначала покажу вам вывод алгоритма двойного метафона для пяти слов, которые вы предложили в качестве примеров: Cute, Cat, Cut, Caught, City

Код A (иллюстрирующий двойной метафон):

private static void doubleMetaphoneTest() {
    org.apache.commons.codec.language.DoubleMetaphone dm = new DoubleMetaphone();
    System.out.println("Cute\t"+dm.encode("Cute"));
    System.out.println("Cat\t"+dm.encode("Cat"));
    System.out.println("Cut\t"+dm.encode("Cut"));
    System.out.println("Caught\t"+dm.encode("Caught"));
    System.out.println("City\t"+dm.encode("City"));
}

Вывод кода A

Cute   KT
Cat    KT
Cut    KT
Caught KFT
City   ST

Теперь в своем вопросе вы заявили, что Сити не является правильным решением, потому что он начинается со звука "ESS". Double Metaphone поможет вам точно идентифицировать этот тип проблемы (хотя я уверен, что будут случаи, когда он не поможет). Теперь вы можете применить шаг 4 в алгоритме, используя этот принцип.


В следующем коде для шага 4 (примените некоторую фонетическую фильтрацию) я предполагаю, что вы уже знаете, что вам нужен только звук "K", а не звук "S".

Код B (прототип решения всего вопроса)

Примечание. Этот код предназначен для иллюстрации использования алгоритма DoubleMetaphone для ваших целей. Я не запускал код Регулярное выражение может быть нарушено или может быть очень неудачным, или мое использование Pattern Matcher может быть неправильным (сейчас 2 часа ночи). Если это не так, пожалуйста, улучшите / исправьте это.

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.codec.language.DoubleMetaphone;

public class GenerateWords {

    /**
     * Returns a set of words that conform to the input pattern
     * @param inputPattern a regular expression
     * @param lexicon a list of valid words
     */
    public static List<String> fetchMatchingWordsFromLexicon(String inputPattern, List<String> lexicon){
        /* E.g. for the case           [C] * [T] * [N] 
         * the regex is:
         *  [Cc]+[aeiouyAEIOUY]+[Tt]+[aeiouyAEIOUY]+[Nn]+[aeiouyAEIOUY]+
         */
        Pattern p = Pattern.compile(inputPattern);
        List<String> result = new ArrayList<String>();
        for(String aWord:lexicon){
            Matcher m = p.matcher(aWord);
            if(m.matches()){
                result.add(aWord);
            }
        }
        return result; 
    }

    /**
     * Returns the subset of the input list that "phonetically" begins with the character specified.
     * E.g. The word 'cat' begins with 'K' and the word 'city' begins with 'S'
     * @param prefix
     * @param possibleWords
     * @return
     */
    public static List<String> filterWordsBeginningWithMetaphonePrefix(char prefix, List<String> possibleWords){
        List<String> result = new ArrayList<String>();
        DoubleMetaphone dm = new DoubleMetaphone();
        for(String aWord:possibleWords){
            String phoneticRepresentation = dm.encode(aWord); // this will always return in all caps
            // check if the word begins with the prefix char of interest
            if(phoneticRepresentation.indexOf(0)==Character.toUpperCase(prefix)){
                result.add(aWord);
            }
        }
        return result;
    }

    public static void main(String args[]){

        // I have not implemented this method to read a text file etc.
        List<String> lexicon = readLexiconFromFileIntoList();
        String regex = "[Cc]+[aeiouyAEIOUY]+[Tt]+[aeiouyAEIOUY]+[Nn]+[aeiouyAEIOUY]+";
        List<String> possibleWords = fetchMatchingWordsFromLexicon(regex,lexicon);

        // your result
        List<String> result = filterWordsBeginningWithMetaphonePrefix('C', possibleWords);

        // print result or whatever

    }
}
1 голос
/ 19 февраля 2010

A phoneme - «самая маленькая сегментальная единица звука, используемая для формирования значимых контрастов между высказываниями».Насколько я понимаю, это основа систем коррекции орфографии на основе произношения.Неправильная написание газеты как noospaypr может привести к правильной коррекции, несмотря на большое расстояние редактирования между двумя словами, потому что соответствующие сегменты в каждом слове (oo и ew, pa и pay, per и pr) могут быть преобразованы в одну и ту же фонему.

К сожалению, через пару минут я не нашел ни одной библиотеки, которая будет выполнять преобразование английских слов, но именно с этого я и начну.

1 голос
/ 19 февраля 2010

Один из подходов состоит в том, чтобы преобразовать словарь английского произношения в конечный автомат и затем искать его с помощью регулярного выражения или простого подстановочного механизма. Вы также можете составить такой словарь самостоятельно, запустив список английских слов в программе, которая производит фонетические транскрипции, например, как найденные на этих сайтах:

Найти механизм обратного преобразования фонетической транскрипции в стандартное написание должно быть легко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...