计算音节数

19

我想在R中为文本分配一些不同的可读性评分,比如Flesh Kincaid。

有人知道使用R将单词分割成音节的方法吗?我不一定需要音节本身,只需要计数。

例如:

x <- c('dog', 'cat', 'pony', 'cracker', 'shoe', 'Popsicle')

会产生以下结果:

1, 1, 2, 2, 1, 3

每个数字对应单词中的音节数。

4个回答

12

qdap版本1.1.0可以完成这项任务:

library(qdap)
x <- c('dog', 'cat', 'pony', 'cracker', 'shoe', 'Popsicle')
syllable_sum(x)

## [1] 1 1 2 2 1 3

8

gsk3是正确的:如果你想要一个正确的解决方案,那就是非常不容易的。

例如,你必须注意一些奇怪的事情,比如单词末尾的沉默字母“e”(例如pane),或者知道它不是沉默的,比如finale

然而,如果你只想要一个快速而简单的近似解,这个方法就可以:

> nchar( gsub( "[^X]", "", gsub( "[aeiouy]+", "X", tolower( x ))))
[1] 1 1 2 2 1 3

为了理解这些部分是如何工作的,只需从外向内剥离函数调用,从nchar开始,然后是gsub,等等......直到表达式对你有意义为止。
但我猜想,考虑到R语言的强大和英语语言中异常词汇的丰富性之间的斗争,你可以通过解析常规文本得到一个不错的答案(也许99%正确?)而不需要太多的工作。事实上,上面的简单解析器可能会获得90%以上的正确率。如果你愿意,还可以做更多工作来处理silent e's。
所有这一切都取决于你的应用程序——无论这是否足够好,或者你需要更准确的东西。

ty - 必须得爱正则表达式 8^) - kfmfe04
2
同样的近似计算方法更高效、更简单的版本是 sapply(gregexpr("[aeiouy]+", x, ignore.case=TRUE), length) - Ken Williams
1
@kfmfe04,我实际上使用了你的基础并添加了一些修改,目前准确率约为95%。我现在正在寻找一个字典,在算法之前运行(正如gsk3提供的链接中建议的那样)。如果我可以将两个答案都标记为正确,我会这么做,但不幸的是我不能。感谢你周到的回复。 - Tyler Rinker

5

5

koRpus包可以极大地帮助您,但使用起来有些困难。

stopifnot(require(koRpus))
tokens <- tokenize(text, format="obj", lang='en')
flesch.kincaid(tokens)

1
我现在有一个非常准确计算音节和执行Flesch-Kincaid的函数。我计划在今年夏天发布它。 - Tyler Rinker
@Tyler Rinker 太棒了!发布后在这里回复评论。你的函数有多快? - Zach
我曾经进行过基准测试(得到了talkstats.com的人使用哈希表的很多帮助),但是现在想不起来了。我们只能说它和在线音节计数器一样快,但更加准确。我采用了字典/算法相结合的方法。哈希表让它飞快地运行。 - Tyler Rinker
在GitHub上: # 安装软件包(“devtools”); library(devtools); install_github("qdap", "trinker") - Tyler Rinker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接