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

How to compute number of syllables in a word in javascript?

本文关键字:单词 计算 javascript      更新时间:2023-09-26

是否有javascript库用于计数单词中的音节数?如何计数?

感谢

编辑

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

我在这个论坛上找到了Pesto的代码,但它是用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吗?再次感谢。

翻译成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'))

我可以看到这是一个旧的帖子,但我偶然发现这个函数,并发现它的良好用途。

我想补充一点,这将提高音节帐户的准确性-(据我所知)。

我注意到字符串"changes"显示为只有一个音节。

我把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

我只是想与任何可能发现并决定使用它的人分享我的发现。

你可以使用这个库proncingjs来计算使用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

嗯…你拿一本语法书,开始一个字母一个字母地读这个字符串,如果有一个规则是匹配的,那么你在计数器上加一个+1。因为每种语言的规则都不一样,所以我不能告诉你怎么做。我这么做是为了罗马尼亚人……

Jonathan Hinds的代码工作得很好,除了这些词:something, sometimes, sometimes and somewhere。我更新了他的代码来解决这些问题:

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;
    }
}