Разбор текста на фонемы - Javascript - PullRequest
0 голосов
/ 06 июля 2018

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

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

http://www.dtic.mil/dtic/tr/fulltext/u2/a021929.pdf

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

По сути, начиная с первого символа строки, мы проверяем символы слева и справа от нее.

(для символов в начале слова левый символ будет пробелом)

Мы устанавливаем правила на основе 44 английских фонем и графем, которые подходят под каждую фонему.

Вот откуда я взял данные для составления этих правил: http://www.boardman.k12.oh.us/userfiles/363/Phonological%20Awareness/44Phonemes.pdf - которые, я считаю, отличаются от некоторых правил, изложенных в статье до этого.

Вот пример объекта правила, который я создал до сих пор:

        var rules_syntax = {
            cons_b: {case:["b", "bb"], pro: "b"},
            cons_d: {case:["d", "dd", "ed"], pro: "d"},
            cons_f: {case:["f", "ph"], pro: "f"},
            cons_g: {case:["g", "gg"], pro: "g"},
            cons_h: {case:["h"], pro: "h"},
            cons_j: {case:["j", "g", "ge", "dge"], pro: "j"},
            cons_k: {case:["c", "k", "ck", "ch", "cc", "que"], pro: "k"},
            cons_l: {case:["l", "ll"], pro: "l"},
            cons_m: {case:["m", "mm", "mb"], pro: "m"},
            cons_n: {case:["n", "nn", "kn", "gn"], pro: "n"},
            cons_p: {case:["p", "pp"], pro: "p"},
            cons_r: {case:["r", "rr", "wr"], pro: "r"},
            cons_s: {case:["s", "se", "ss", "ci", "ce", "sc"], pro: "s"},
            cons_t: {case:["t", "tt", "ed"], pro: "t"},
            cons_v: {case:["v", "ve"], pro: "v"},
            cons_w: {case:["w"], pro: "w"},
            cons_y: {case:["y", "oi", "io"], pro: "y"},
            cons_z: {case:["z", "zz", "ze", "se", "x"], pro: "z"},

            cons_diag_th:       {case:["th"], pro: "th"},
            cons_diag_th_voice: {case:["th"], pro: "thh"},
            cons_diag_ng:       {case:["ng", "n"], pro: "n"},
            cons_diag_sh:       {case:["sh", "ss", "ch", "ti", "ci"], pro: "sh"},
            cons_diag_ch:       {case:["ch", "tch"], pro: "ch"},
            cons_diag_zh:       {case:["ge", "s"], pro: "zh"},
            cons_diag_wh:       {case:["wh"], pro: "w"},

            shor_vowe_a: {case: ["a", "au"], pro: "a"},
            shor_vowe_e: {case: ["e", "ea"], pro: "e"},
            shor_vowe_i: {case: ["i"], pro: "i"},
            shor_vowe_o: {case: ["o", "a", "au", "aw", "ough"], pro: "o"},
            shor_vowe_u: {case: ["u", "o"], pro: "u"},

        }

Надеюсь, этого вам хватит, чтобы понять идею.

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

'#' Одна или несколько гласных

'*' (звезда) Одна или несколько согласных

'*' (круг) Один из B, D, V, G, J, L, M, N, R, W и Z: звонкий согласный

'$' Один согласный, за которым следует E или I

'%' Один из (ER, E, ES, ED, ING, ELY): суффикс

'&' Один из (S, C, G, Z, X, J, CH, SH): сибилант

'@' Один из (T, S, R, D, L, Z, N, J, TH, CH, SH): согласный, влияющий на Звук следующего длинного u (ср. правило и мул)

'^' Одна согласная

'+' Один из (E, I, Y): передний гласный

':' Ноль или более согласных

Мой первый вопрос:

Кто-нибудь находит это адекватным способом приблизиться к этим правилам? Предложения, пожалуйста.

Двигаемся дальше,

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

Алгоритм перевода сканирует входной текст слева направо и, для каждого отсканированного символа , последовательно ищет правила, относящиеся к этому символу, пока не найдет тот, чей слева- сторона стороны соответствует тексту в правильном положении.

Это то место, где я сейчас застрял. Я настроил свой код так, чтобы он мог собрать все правила, к которым применяется группа символов, но как только я это сделаю, я не уверен, как выбрать, какая из них является правильной фонемой. Например, я использовал слово «осторожный» в качестве примера. комбинация «au» в этом слове соответствует правилу «a», а также правилу «o».

это создаст звук как во смехе или создаст звук как в учении. Ясно, что правильный ответ, как указано в разделе «учил», но как я могу сделать проверку кода для этого?

как я могу определить, какая фонема является правильной для использования здесь?

Это где второй набор правил, который я еще не использовал, вступает в игру? Если да, то как бы вы предложили использовать эти правила для устранения / сужения применимых правил?

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

    var test01 = function(word)
    {
        var arr = [];
        var arr2 = [];

        //for every letter in the word
        for(var x = 0; x < word.length; x ++)
        {
            //grab the letter
            var index = word[x];
            var pert = [];
            //push the letter to an array
            arr.push(index);

            //create an object which holds the neighboring letters
            var pro = new Object();
            pro.left = word[x - 1];
            pro.org = index;
            pro.right = word[x + 1];
            //store this object in an array
            arr2.push(pro);


            //check to see if any spaces exist (undefined) and replace them with a ""
            for(b in pro)
            {
                if(!pro[b])
                {
                    pro[b] = "";
                }
            }

            //loop through each letter object
            for(var y = 0; y < arr2.length; y ++)
            {
                var letter = arr2[y];
                letter.rules = [];

                //loop through each rule that exists
                for (z in rules_syntax)
                {
                    var rule = rules_syntax[z];

                    //for each rule, loop through its graphemes
                    for(var a = 0; a < rule.case.length; a ++)
                    {

                        var grapheme = rule.case[a];
                        //combine the original letter, and the letter to the left
                        var letterCheck = letter.left + letter.org;

                        //check if the above combo (left + original) exists in the list of graphemes
                        if(letterCheck === grapheme)
                        {
                            //here is where I would put any other conditions to check for any other rules.
                            pert.push(rule.pro);
                            letter.rules.push(rule.pro);
                        } 

                        if(letter.org === grapheme)
                        {
                            //here is where I would put any other conditions to check for any other rules.
                            pert.push(rule.pro);
                            letter.rules.push(rule.pro);

                        } 
                    }
                }
            }

            console.log(pert);

        }
    }

    test01("cautious");

А вот и последняя строка вывода

(16) ["k", "k", "a", "o", "a", "o", "u", "t", "sh", "i", "y", "o", "u", "u", "s", "zh"]

Любые ответы приветствуются.

Спасибо.

1 Ответ

0 голосов
/ 06 июля 2018

Я думаю, вы неправильно читаете Таблицу 2 из статьи:

'#' Одна или несколько гласных

'*' (звезда) Одна или несколько согласных

'*' (кружок) Один из B, D, V, G, J, L, M, N, R, W и Z: голос согласный

'$' Один согласный, за которым следует E или I

'%' Один из (ER, E, ES, ED, ING, ELY): суффикс

'&' Один из (S, C, G, Z, X, J, CH, SH): сибилант

'@' Один из (T, S, R, D, L, Z, N, J, TH, CH, SH): согласный влияние на звук следующего длинного и (ср. правило и мул)

'^' Одна согласная

'+' Один из (E, I, Y): передний гласный

':' Ноль или более согласных

Надпись для этой таблицы гласит:

Специальные символы, присутствующие в правилах перевода с английского на IPA

Другими словами, это не правила, а описания обозначений.

Настоящие правила начинаются на странице 51 статьи. Как я понимаю алгоритм, он будет начинаться с разбора 't' и перейдет в раздел TRULE.ENG (стр. 58). Единственное правило, которое применяется там - [T]=/T/. Затем он анализирует «а» и просматривает ARULE.ENG (стр. 51). Сканируя там правила, первое, что я вижу, применяется [AU]=/AO/, что дает вам «au», как в «научил». Оттуда он попадает в список GRULE.ENG и выдает / / для «gh», а затем снова выдает /T/ для окончательного «t».

Что касается «смеха», из правил я бы сказал, что он будет произносить «au», как в «научил». А поскольку правило #[GH]=/ /, другого звука не будет. «смех», вероятно, будет звучать как «закон».

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