推荐(Recommended) 介绍好的人或事物,希望被任用或接受。在目前的数据挖掘领域, 推荐包括相似推荐以及协同过滤推荐。 相似推荐(Similar Recommended) 当用户表现出对某人或者某物感兴趣时,为它推荐与之相类似的人,或者物, 它的核心定理是:人以群分,物以类聚。
利用已有用户群过去的行为或意见,预测当前用户最可能喜欢哪些东西 或对哪些东西感兴趣。 ★相似推荐是基于物品的内容,协同过滤推荐是基于用户群过去的行为, 这是两者最大的区别。 相关文章推荐主要的原理是余弦相似度(Cosine Similarity)
利用余弦相似度进行相似文章推荐的代码实现:
library(tm)
library(tmcn)
library(Rwordseg)
docs <- Corpus(
DirSource(
c(
"SogouC.mini/Sample/C000007", "SogouC.mini/Sample/C000008",
"SogouC.mini/Sample/C000010", "SogouC.mini/Sample/C000013",
"SogouC.mini/Sample/C000014", "SogouC.mini/Sample/C000016",
"SogouC.mini/Sample/C000020", "SogouC.mini/Sample/C000022",
"SogouC.mini/Sample/C000023", "SogouC.mini/Sample/C000024"
)
),
readerControl = list(
language='UTF-8'
)
)
#移除空白
docs <- tm_map(docs, stripWhitespace)
#移除标点
docs <- tm_map(docs, removePunctuation)
docs <- tm_map(docs, content_transformer(segmentCN), returnType="tm")
tdm <- DocumentTermMatrix(
docs,
control = list(
wordLengths= c(1, 4),
stopwords = stopwordsCN()
)
)
TF <- as.matrix(tdm)
#使用矩阵的方式计算
cosineDist <- function(x){
return(x%*%t(x)/(sqrt(rowSums(x^2) %*% t(rowSums(x^2)))))
}
cosSimilar <- cosineDist(TF)
cosineDist <- function(textMatrix) {
cosSimilar <- matrix(nrow=nrow(textMatrix), ncol=nrow(textMatrix))
for(i in 1:nrow(textMatrix)) {
#对角线数据
cosSimilar[i, i] <- 1;
#处理i到了nrow(textMatrix)的异常
if(i==nrow(textMatrix)) {
break;
}
for(j in (i+1):nrow(textMatrix)) {
cosSimilar[i, j] <-
sum(textMatrix[i, ] * textMatrix[j, ]) /
(sqrt(sum(textMatrix[i, ]^2)) * sqrt(sum(textMatrix[j, ]^2)));
cosSimilar[j, i] <- cosSimilar[i, j];
}
}
return(cosSimilar)
}
cosSimilar <- cosineDist(TF)
resultIndex <- apply(cosSimilar, 2, function(col) {
return(order(col, decreasing=TRUE)[2:6]);
})
resultName <- apply(cosSimilar, 2, function(col) {
return(names(col)[order(col, decreasing=TRUE)[2:6]]);
})