前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R中如何利用余弦算法实现相似文章的推荐

R中如何利用余弦算法实现相似文章的推荐

作者头像
Erin
发布2018-01-09 11:02:16
2K0
发布2018-01-09 11:02:16
举报
文章被收录于专栏:大数据风控大数据风控

推荐(Recommended) 介绍好的人或事物,希望被任用或接受。在目前的数据挖掘领域, 推荐包括相似推荐以及协同过滤推荐。 相似推荐(Similar Recommended) 当用户表现出对某人或者某物感兴趣时,为它推荐与之相类似的人,或者物, 它的核心定理是:人以群分,物以类聚。

协同过滤推荐(Collaborative Filtering Recommendation)

利用已有用户群过去的行为或意见,预测当前用户最可能喜欢哪些东西 或对哪些东西感兴趣。 ★相似推荐是基于物品的内容,协同过滤推荐是基于用户群过去的行为, 这是两者最大的区别。 相关文章推荐主要的原理是余弦相似度(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]]);
})
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年07月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 协同过滤推荐(Collaborative Filtering Recommendation)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档