将文本解析为音素-Javascript

将文本解析为音素-Javascript,javascript,string,algorithm,sorting,parsing,Javascript,String,Algorithm,Sorting,Parsing,我有一个问题,在过去几天里我一直在广泛地研究这个问题,正如你可以从标题中看出的,这个问题与将字符串解析为音素的文本到语音类型算法有关 我不打算将其用于文本到语音的转换,主要是为我即将进行的项目进行文本分析。我在这里找到了一些有用的信息: 利用这些信息,我希望创建一个类似的工具。以下是上述软件的工作方式: 本质上,从字符串的第一个字符开始,我们检查字符串左右两侧的字符 (对于单词开头的字符,左边的字符将是空白) 我们根据44个英语音素和每个音素下的字母设置规则 这里是我获得数据来制定这些规则的地

我有一个问题,在过去几天里我一直在广泛地研究这个问题,正如你可以从标题中看出的,这个问题与将字符串解析为音素的文本到语音类型算法有关

我不打算将其用于文本到语音的转换,主要是为我即将进行的项目进行文本分析。我在这里找到了一些有用的信息:

利用这些信息,我希望创建一个类似的工具。以下是上述软件的工作方式:

本质上,从字符串的第一个字符开始,我们检查字符串左右两侧的字符

(对于单词开头的字符,左边的字符将是空白)

我们根据44个英语音素和每个音素下的字母设置规则

这里是我获得数据来制定这些规则的地方: -我相信这与之前文章中的一些规则是不同的

以下是我迄今为止创建的规则对象的一个示例:

        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)中的一个:sibilant

(T,S,R,D,L,Z,N,J,TH,CH,SH)中的一个:影响发音的辅音 跟随长u的声音(参见规则和骡子)

“^”一个辅音

(E,I,Y)中的“+”一个:前元音

“:”零个或多个辅音

我的第一个问题是:

是否有人认为这是处理这些规则的适当方式?请提供建议。

继续

一旦我们知道了主要字符是什么,以及左边和右边的字符,我们就会检查适用于这个字符组的所有规则。发布的第一篇文章解释了

翻译算法从左到右扫描输入文本,对于扫描的每个字符,依次搜索与该字符相关的规则,,直到找到其左侧与文本在正确位置匹配的规则。

这就是我目前所处的困境。我有我的代码设置,这样它可以收集字符组应用的所有规则,但一旦我有了这些规则,我就不知道如何选择正确的音素。例如,我一直用“谨慎”这个词作为例子。这个词中的“au”组合符合“a”规则和“o”规则

这将在笑中产生a音,或者在教学中产生o音。很明显,如所教的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");
欢迎任何回复


谢谢。

我认为您误读了文章中的表2:

“#”一个或多个元音

“*”(星)一个或多个辅音

“*”(圈)B、D、V、G、J、L、M、N、R、W和Z中的一个:a浊音 辅音

“$”一个辅音后跟一个E或I

(ER,E,ES,ED,ING,ELY)中的“%”一个后缀

(S,C,G,Z,X,J,CH,SH)中的一个:sibilant

(T,S,R,D,L,Z,N,J,TH,CH,SH)之一:辅音 影响后面长u的声音(参见rule和mule)

“^”一个辅音

(E,I,Y)中的“+”一个:前元音

“:”零个或多个辅音

该表的标题是:

英文到IPA翻译规则中出现的特殊符号

换句话说,这些不是规则,而是对符号的描述

真正的规则从文章的第51页开始。根据我对算法的理解,它将从解析“t”开始,然后转到TRULE.ENG部分(第58页)。这里唯一适用的规则是
[T]=/T/
。然后它解析“a”,并在ARULE.ENG(第51页)中查找。扫描这里的规则,我看到的第一个适用的规则是
[AU]=/AO/
,它给出了“AU”作为“teached”。从那里,它进入GRULE.ENG列表,为“gh”生成
/
,然后再次为最后的“T”生成
/T/


至于“笑”,根据规则,我会说“au”的发音和“teached”一样。因为规则是
#[GH]=/
,所以不会有其他声音。“笑”可能听起来像“定律”。

文章说(你引用它)算法“顺序搜索与该字符相关的规则”。换言之,它会按照规则呈现的顺序一次尝试一条规则,第一条匹配的规则获胜。我很感谢您的回复,但事实并非如此。当单词toucted被传递时,函数(若函数按照您的建议工作),然后当AU组合和“laugh”中的A音匹配时,它将结束,因为A出现在O之前。“toucted”中的AU显然和“laugh”中的AU发音不一样。“toucted”中的AU显然和“laugh”中的AU发音不一样“笑”。你确定吗?你运行过代码并听过它的输出吗?使用过
(16) ["k", "k", "a", "o", "a", "o", "u", "t", "sh", "i", "y", "o", "u", "u", "s", "zh"]