是否有用于计算单词中音节数的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吗? 再次感谢你。
答案 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;
}
}