如何在javascript中计算单词中的音节数?

时间:2011-04-16 12:31:17

标签: javascript

是否有用于计算单词中音节数的javascript库?怎么算?

由于

修改

感谢Sydenam和zozo提供有用的信息和可能的答案。

我找到了Pesto at this forum的代码,但它是在Ruby中。其中一个简洁版本如下:

def new_count(word)
  word.downcase!
  return 1 if word.length <= 3
  word.sub!(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '')
  word.sub!(/^y/, '')
  word.scan(/[aeiouy]{1,2}/).size
end 

这似乎很短但很复杂。你能把这个功能翻译成javascript吗? 再次感谢你。

6 个答案:

答案 0 :(得分:32)

转换为javascript:

function new_count(word) {
  word = word.toLowerCase();                                     //word.downcase!
  if(word.length <= 3) { return 1; }                             //return 1 if word.length <= 3
    word = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '');   //word.sub!(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '')
    word = word.replace(/^y/, '');                                 //word.sub!(/^y/, '')
    return word.match(/[aeiouy]{1,2}/g).length;                    //word.scan(/[aeiouy]{1,2}/).size
}

console.log(new_count('she'));
console.log(new_count('spain'))
console.log(new_count('softball'))
console.log(new_count('contagion'))

答案 1 :(得分:2)

您可以查看:AJAX Syllable Calendar

答案 2 :(得分:2)

嗯...你拿一本语法书,如果其中一条规则匹配,就开始逐字母地读字符串然后你给一个计数器加一个+1。由于规则因语言而异,我无法真正告诉您如何做到这一点。我是为罗马尼亚人做的......但我怀疑它会对你有所帮助。

答案 3 :(得分:2)

我可以看到这是一篇老文章,但偶然发现了该功能,并发现了很好的用法。

我想补充一件事,它将增加音节帐户的准确性-(据我所知)。

我注意到字符串“ changes”显示仅为1个音节。

我从es中删除了(?:[^laeiouy]es|ed|[^laeiouy]e)$,现在变成了?:[^laeiouy]|ed|[^laeiouy]e)$

这似乎为以“ es”结尾的单词增加了额外的音节计数。另外,为简化起见,我将匹配单词的数组放入一个单独的变量中,通过这种方式,您可以在给出任何输出之前检查是否计数了任何音节:

var count = function(word) 
{
    word = word.toLowerCase();                                     
    word = word.replace(/(?:[^laeiouy]|ed|[^laeiouy]e)$/, '');   
    word = word.replace(/^y/, '');                                 
    //return word.match(/[aeiouy]{1,2}/g).length;   
    var syl = word.match(/[aeiouy]{1,2}/g);
    console.log(syl);
    if(syl)
    {
        //console.log(syl);
        return syl.length;
    }
}

我发现这比必需的更为方便。如果您有在事件侦听器中运行的功能,该功能可能在没有任何单词要检查之前触发,则这将很有用,并可以防止出现诸如Cannot read property 'length' of null之类的错误。

我只想与其他可能发现并决定使用它的人分享我的发现。

答案 4 :(得分:1)

您可以使用这个库 pronouncingjs 使用 CMU 发音词典进行计算:

pronouncing.syllableCount(pronouncing.phonesForWord("adverse")[0])
2

看这里:

abandon,3
abolish,3
absorb,2
accelerate,4
accept,2
access,2
accommodate,4
accompany,4
account,2
accumulate,4
accuse,2
ache,1
achieve,2
acknowledge,3
acquire,3
act,1
adapt,2
add,1
address,2
adhere,2
adjust,2
administer,4
admire,2

答案 5 :(得分:0)

Jonathan Hinds 的代码效果很好,除了单词:something,sometime,timesandwhere。我更新了他的代码以解决这些问题:

var syllableCount = function(word) 
{
    word = word.toLowerCase();
    var t_some = 0;
    if(word.length>3)
        {
        if(word.substring(0,4)=="some")
            {
            word = word.replace("some","");
            t_some++;
            }
        }
    word = word.replace(/(?:[^laeiouy]|ed|[^laeiouy]e)$/, '');   
    word = word.replace(/^y/, '');                                 
    //return word.match(/[aeiouy]{1,2}/g).length;   
    var syl = word.match(/[aeiouy]{1,2}/g);
    console.log(syl);
    if(syl)
    {
        //console.log(syl);
        return syl.length+t_some;
    }
}