您在上面显示的字符串几乎是正确的R代码。因此,只需最少的修改,我们就可以直接将数据读入R:
txt1 <- 'list(text = \"incredible hosts\", relevance = 0.87518, count = 1), list(text = \"Japan\", relevance = 0.675236, count = 1), list(text = \"support\", relevance = 0.625663, count = 1), list(text = \"result\", relevance = 0.359757, count = 1)'
txt2 <- 'list(text = \"British fleet\", relevance = 0.912888, count = 1), list(text = \"worst maritime disasters\", relevance = 0.904047, count = 1), list(text = \"British history\", relevance = 0.755491, count = 1), list(text = \"Scilly Isles\", relevance = 0.716508, count = 1), list(text = \"sailors\", relevance = 0.691141, count = 1), list(text = \"evening\", relevance = 0.597375, count = 1), list(text = \"Tragedy\", relevance = 0.577141, count = 1), list(text = \"prize\", relevance = 0.565035, count = 1), list(text = \"rocks\", relevance = 0.543257, count = 1), list(text = \"innovation\", relevance = 0.529463, count = 1), list(text = \"longitude\", relevance = 0.335207, count = 1)'
txt1 <- gsub("text = ", "id = 1, text = ", txt1) # this is just if you want to have an ID later on
txt2 <- gsub("text = ", "id = 2, text = ", txt2)
list1 <- eval(parse(text = paste0("list(", txt1, ")")))
list2 <- eval(parse(text = paste0("list(", txt2, ")")))
df <- dplyr::bind_rows(list1, list2)
df
#> # A tibble: 15 x 4
#> id text relevance count
#> <dbl> <chr> <dbl> <dbl>
#> 1 1 incredible hosts 0.875 1
#> 2 1 Japan 0.675 1
#> 3 1 support 0.626 1
#> 4 1 result 0.360 1
#> 5 2 British fleet 0.913 1
#> 6 2 worst maritime disasters 0.904 1
#> 7 2 British history 0.755 1
#> 8 2 Scilly Isles 0.717 1
#> 9 2 sailors 0.691 1
#> 10 2 evening 0.597 1
#> 11 2 Tragedy 0.577 1
#> 12 2 prize 0.565 1
#> 13 2 rocks 0.543 1
#> 14 2 innovation 0.529 1
#> 15 2 longitude 0.335 1
从这里可以更容易地将它们整理成您可能想要的任何形式。
更新
在您发表评论后,我更改了答案以展示如何将这种方法与更大的数据集一起使用并将其放入 quanteda:
假设您读取了数据,并且每个文本现在都是向量中的值:
txt <- c('list(text = \"incredible hosts\", relevance = 0.87518, count = 1), list(text = \"Japan\", relevance = 0.675236, count = 1), list(text = \"support\", relevance = 0.625663, count = 1), list(text = \"result\", relevance = 0.359757, count = 1)',
'list(text = \"British fleet\", relevance = 0.912888, count = 1), list(text = \"worst maritime disasters\", relevance = 0.904047, count = 1), list(text = \"British history\", relevance = 0.755491, count = 1), list(text = \"Scilly Isles\", relevance = 0.716508, count = 1), list(text = \"sailors\", relevance = 0.691141, count = 1), list(text = \"evening\", relevance = 0.597375, count = 1), list(text = \"Tragedy\", relevance = 0.577141, count = 1), list(text = \"prize\", relevance = 0.565035, count = 1), list(text = \"rocks\", relevance = 0.543257, count = 1), list(text = \"innovation\", relevance = 0.529463, count = 1), list(text = \"longitude\", relevance = 0.335207, count = 1)')
您可以循环遍历每个元素,而不是更改每个对象:
txt <- lapply(seq_along(txt), function(i) { # this is just if you want to have an ID later on
gsub("text = ", paste0("id = ", i, ", text = "), txt[i])
})
list <- lapply(txt, function(x) {
dplyr::bind_rows(eval(parse(text = paste0("list(", x, ")"))))
})
df <- dplyr::bind_rows(list)
一旦你有了data.frame,在你可以在 quanteda 中工作之前,只剩下一点点数据整理工作要做:
library(dplyr)
df_wide <- df %>%
group_by(id) %>%
summarise(text = paste(text, collapse = " "), relevance = list(relevance))
library(quanteda)
corp <- corpus(df_wide, docid_field = "id", text_field = "text")
corp
#> Corpus consisting of 2 documents and 1 docvar.
corp$documents$relevance
#> [[1]]
#> [1] 0.875180 0.675236 0.625663 0.359757
#>
#> [[2]]
#> [1] 0.912888 0.904047 0.755491 0.716508 0.691141 0.597375 0.577141
#> [8] 0.565035 0.543257 0.529463 0.335207