0

假设我有以下类似的数据结构,其中 doc_id 是文档标识符, text_id 是唯一的文本/版本标识符, text 是字符串:

df <- cbind(doc_id=as.numeric(c(1, 1, 2, 2, 3, 4, 4, 4, 5, 6)), 
                text_id=as.numeric(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)), 
                  text=as.character(c("string1", "str2ing", "3string", 
                                      "string6", "s7ring", "string8", 
                                      "string9", "string10")))

我试图在循环结构中做的是字符串编辑距离比较,但仅适用于同一文档的不同版本。简而言之,我想找到匹配的 doc_ids 并成对比较同一文档的不同版本(text_ids)。

#Results matrix
result <- matrix(ncol=10, nrow=10)

#Loop
i=1
for (j in 1:length(df[,2])) {
  for (i in 1:length(df[,2])) {
#Conditional Statements
    if(df[i,1]==df[j,1]){
      result[i,j]<-levenshteinDist(df[j,3], df[i,3])}
    else(result[i,j]<-"Not Compared")
  }
  print(result[i,j])
  flush.console()
}

回报:

[1] "Not Compared"
[1] "Not Compared"
[1] "Not Compared"
[1] "Not Compared"
[1] "Not Compared"
[1] "Not Compared"
[1] "Not Compared"
[1] "Not Compared"
[1] "Not Compared"
[1] "0"

levenshteinDist()功能可以在RecordLinkage包中找到,但类似的功能也捆绑在utils包中adist()

我的问题是为什么我的第一个条件语句 (if) 被忽略,而只返回 else 部分?

任何有关编码或处理时间效率增益的进一步建议将不胜感激。

4

2 回答 2

0

你没有正确输出。运行此版本并查看发生的比较。message()一旦您对一切正常工作感到满意,请注释掉。

library(RecordLinkage)

df <- structure(c("1", "1", "2", "2", "3", "4", "4", "4", "5", "6", 
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "string1", 
"str2ing", "3string", "string6", "s7ring", "string8", "string9", 
"string10", "string1", "str2ing"), .Dim = c(10L, 3L), .Dimnames = list(
    NULL, c("doc_id", "text_id", "text")))

result <- matrix(ncol = 10, nrow = 10)
# nrow() and ncol() are more elegant ways of getting row/column counts.
for(j in 1:nrow(df)) {
    for(i in 1:nrow(df)) {
        message(sprintf("comparing i=%s (%s), j=%s (%s)\n", j, df[i, 1], i, df[j, 1]))
        if(identical(df[i, 1], df[j, 1])) {
            result[i, j] <- levenshteinDist(df[j, 3], df[i, 3])
        } else {
            result[i, j] <- "Not Compared"
        }
           # printing inside the inner for loop
        print(result[i, j])
    }

}
于 2013-11-01T00:20:44.533 回答
0

对于初学者,如果我了解您的目标,则if-statement应该阅读if (df[i,1]==df[j,2]),以便您在两列的值之间进行比较。

这里的问题不是您的条件被忽略,而是您将错误地输出结果。result这里由一个 10x10 矩阵组成,但您只result[i,j]在迭代的循环内打印j。我认为代码应该看起来更像这样:

for (i in 1:length(df[,2])) {
    for (j in 1:length(df[,2])) {

        if(df[i,1]==df[j,2]) {
            result[i,j]<-adist(df[j,3], df[i,3])
        } else {
            (result[i,j]<-"Not Compared")
        }
    }
}

这将构建结果矩阵,然后您可以根据需要查看所有 100 次比较的结果。

于 2013-11-01T00:19:10.083 回答