【发布时间】:2015-05-02 20:49:45
【问题描述】:
我有这个函数可以计算一本书的 consonanceScore。首先,我导入语音字典from CMU(它形成了一个大约 134000 行和 33 个列变量的数据框;CMUdictionary 中的任何行基本上都是 CLOUDS K L AW1 D Z 的形式。第一列是单词,其余列有他们的语音等价物)。拿到CMU字典后,我把一本书解析成一个包含所有单词的向量;任何一本书的最大长度(到目前为止):218711。每个单词的语音都与连续单词中的语音进行比较,并且连续+1个单词。然后将 TRUE 匹配值组合成一个总和。我的功能是这样的:
getConsonanceScore <- function(book, consonanceScore, CMUdict) {
for (i in 1:((length(book)) - 2)) {
index1 <- replaceIfEmpty(which (toupper(book[i]) == CMUdict[,1]))
index2 <- replaceIfEmpty(which (toupper(book[i + 1]) == CMUdict[,1]))
index3 <- replaceIfEmpty(which (toupper(book[i + 2]) == CMUdict[,1]))
word1 <- as.character(CMUdict[index1, which(CMUdict[index1,] != "")])
word2 <- as.character(CMUdict[index2, which(CMUdict[index2,] != "")])
word3 <- as.character(CMUdict[index3, which(CMUdict[index3,] != "")])
consonanceScore <- sum(word1 %in% word2)
consonanceScore <- consonanceScore + sum(word1 %in% word3)
consonanceScore <- consonanceScore / length(book)
}
return(consonanceScore)
}
如果在 CMU 字典中找不到书中任何单词的匹配项,replaceIfEmpty 函数基本上只是返回一个虚拟值的索引(已在数据帧的最后一行中声明)。它是这样的:
replaceIfEmpty <- function(x) {
if (length(x) > 0)
{
return (x)
}
else
{
x = 133780
return(x)
}
}
我面临的问题是 getConsonanceScore 函数需要 很多 时间。如此之多,以至于在循环中,我不得不将书本长度除以 1000,以检查该功能是否正常工作。我是 R 新手,非常感谢您提供一些帮助来提高此功能的效率并减少时间消耗,有什么方法可以做到这一点吗? (我必须稍后在可能 50-100 本书上调用此函数)非常感谢!
【问题讨论】:
-
我是否正确,您尝试查找具有相同发音且它们之间的距离 data.frame:拼写和发音,然后您可以将第二列视为向量并非常简单地进行必要的比较。
-
是的,是的。但基本上我想做的是将一个单词中的每个单独的声音成分与另一个单词中的每个单独的声音成分进行比较。例如,如果有两个单词 sun 和 sky 紧挨着,那么只有它们的 's' 音会匹配。那么,我应该分别对待它们吗?它们是一种可以比较两个字符串的方式,并且我以某种方式获得了它们各个组件的相似性?我的猜测是普通的 '==' 会比较整个字符串。
标签: r text-processing text-parsing