1

在编辑了我之前发布的问题的 2 次后,我问了同样的问题。对于本网站的使用不当,我深表歉意。我已将其标记为删除,并在此处发布了一个适当的新问题。请调查一下。

我基本上正在研究推荐系统代码。输出必须转换为 JSON 对象序列。我有一个矩阵,其中包含每个项目 ID 的查找表,其中包含与其相关的最接近项目的列表以及与其组合相关的相似度分数。

让我通过一个例子来解释。

假设我有一个矩阵在下面的示例中,项目 1 与项目 22 和 23 相似,相似度分数分别为 0.8 和 0.5。其余行遵循相同的结构。

X1 X2 X3 X4 X5 
1 22 23  0.8 0.5
34 4 87  0.4 0.4
23 7 92  0.6 0.5

我想要每个项目的 JSON 结构(每行的每个 X1)以及推荐的项目和每个组合的相似度分数作为单独的 JSON 实体,并且按顺序完成。我不想要包含这些单独对象的整个 JSON 对象。假设还有一个名为“coid”的实体将作为代码的输入。我假设它是 XYZ 并且所有行都相同。

{ "_id" : { "coid" : "XYZ", "iid" : "1"}, "items" : [ { "item" : "22", "score" : 0.8},{ "item": "23", "score" : 0.5}] }
{ "_id" : { "coid" : "XYZ", "iid" : "34"},"items" : [ { "item" : "4", "score" : 0.4},{ "item": "87", "score" : 0.4}] }
{ "_id" : { "coid" : "XYZ", "iid" : "23"},"items" : [ { "item" : "7", "score" : 0.6},{ "item": "92", "score" : 0.5}] }

如上所述,每个实体都是一个有效的 JSON 结构/对象,但它们并没有作为一个整体组合成一个单独的 JSON 对象。

我感谢为上一个问题所做的所有帮助,但不知何故,我觉得我在这里所做的新更改与它们无关,因为最后,如果您执行 toJSON(某个实体),那么它将整个事物转换为一个 JSON 对象. 我不想要那个。我希望将像这样的单个文件写入文件。

对于我的无知和不便,我深表歉意。请帮忙。谢谢。

4

1 回答 1

1
library(rjson)
## Your matrix
mat <- matrix(c(1,34,23,
               22, 4, 7,
               23,87,92,
               0.8, 0.4, 0.6,
               0.5, 0.4, 0.5), byrow=FALSE, nrow=3)

我使用了一个函数(不是很有趣的名字makejson),它接受矩阵的一行并返回一个 JSON 对象。它生成两个list对象,_iditems,并将它们组合成一个 JSON 对象

makejson <- function(x, coid="ABC") {
    `_id` <- list(coid = coid, iid=x[1])
    nitem <- (length(x) - 1) / 2 # Number of items
    items <- list()
    for(i in seq(1, nitem)) {
        items[[i]] <- list(item = x[i + 1], score = x[i + 1 + nitem])
    }
    toJSON(list(`_id`=`_id`, items=items))
}

然后使用apply(或for循环)我对矩阵的每一行使用该函数。

res <- apply(mat, 1, makejson, coid="XYZ")
cat(res, sep = "\n")
## {"_id":{"coid":"XYZ","iid":1},"items":[{"item":22,"score":0.8},{"item":23,"score":0.5}]}
## {"_id":{"coid":"XYZ","iid":34},"items":[{"item":4,"score":0.4},{"item":87,"score":0.4}]}
## {"_id":{"coid":"XYZ","iid":23},"items":[{"item":7,"score":0.6},{"item":92,"score":0.5}]}

cat通过指定file参数,可以将结果保存到文件中。

## cat(res, sep="\n", file="out.json")

你的输出和我的有一点不同,数字用引号(“)。如果你想这样,mat必须是字符。

## mat <- matrix(as.character(c(1,34,23, ...

希望能帮助到你,

亚历克斯

于 2014-07-22T12:32:15.863 回答