Beta

It’s a beautiful thing when free data meets free algorithm.

思路可借鉴,但内容已经过时,请忽视。可转向 https://github.com/rexyai/RestRserve

使用R提供一个高可用的服务一直对R来说都是弱点,比如JRI(Java)或Rserve这些都不是太友好。 OpenCPU的出现彻底解决了这个问题,援引OpenCPU介绍

  • Interoperable HTTP for data analysis
  • RPC and object management
  • I/O: JSON, Protocol Buffers, CSV
  • Support for parallel/async requests
  • Highly configurable security policies
  • Native reproducibility
  • Client libraries: JavaScript, Ruby, ...

一言以蔽之:可以快速搭建灵活的高可用服务。比如说,对于线上预测的请求,大概在200毫秒左右,很多场景基本上也够用了。

阅读全文 »

更新在最前面:

以下工作已经被团队小伙伴打成了 R 包,具体安装可以参考 lengyuyeke 的 github 项目,位置是这里 https://github.com/lengyuyeke/RHJDBC

一次更新

几年前写过一篇简单的博客来讲如何利用 RHive 协同操作 Hive 和 R。这个包貌似很久未做维护,不是太好用,其实 RHive 包底层通过 JDBC 调用数据,所以通过 RJDBC 其实是更简单的方式。废话少说,直接贴代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
library("DBI")
library("rJava")
library("RJDBC")
for(l in list.files('/opt/org/apache/hive/1.1.1/hive-on-mr/lib/', full.names = TRUE)){ .jaddClassPath(l)}
drv <- JDBC("org.apache.hive.jdbc.HiveDriver", "/opt/org/apache/hive/1.1.1/hive-on-mr/lib/hive-jdbc-1.1.1-standalone.jar")
for(l in list.files('/opt/org/apache/hadoop/2.7.3/share/hadoop/common/', full.names = TRUE)){ .jaddClassPath(l)}
conn <- dbConnect(drv, "jdbc:hive2://10.0.2.9:10000/default", "", "")

show_databases <- dbGetQuery(conn, "describe dwd.dwd_user_dim_user_base")
library(knitr)
kable(show_databases) # table's meta data, for gollum wiki

## Get data from hive
d <- dbGetQuery(conn, 'select * from ods.user limit 10')
阅读全文 »

最近有几位同学问到我如何利用tm包做文本挖掘,比较抱歉的是时间不太充足,不能完整更新文档。在这里只好给大家一些 tips,来利用R的原生函数来完成文本挖掘的核心步骤。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
setwd('C:/Users/Administrator/Downloads')
options(width = 150)
library(data.table)
x <- fread('comment.txt', sep = '\t', header = FALSE)
x$V3 <- iconv(x$V3, 'UTF-8', 'GBK') # 第三类为文本内容,字符集转化
x <- x[which(nchar(x$V3) > 3),]
n <- 10000 # 设置抽样数量,保证计算时长
x <- x[sample(1:nrow(x),n),]

library(jiebaR)
library(Matrix)

JR = worker(user = 'D:/source/RecModels/prototype/TagGen/userdict.txt')
seg_raw <- sapply(x$V3, segment, JR) # 执行分词

id <- unique(unlist(seg_raw)) # 生成Term
id <- id[nchar(id) >=2 & nchar(id) <= 5] # 将Term太长和太短的去掉,比如“强”
col_id <- as.vector(unlist(sapply(seg_raw, match, id)))
NA_index <- !is.na(col_id)
col_id <- col_id[NA_index] # 去除列的空值位置号
row_num <- sapply(seg_raw, length)
row_id <- rep(1:length(seg_raw), times = row_num)
row_id <- row_id[NA_index] # 去除行的空值位置号
## 生成DTMatirx
m <- sparseMatrix(i = row_id, j = col_id)

核心思想是创造 Term 和原始文档分词之后对应的索引,来创造 Document Term Matrix。当然中间涉及各种 Term 的预处理,这时候使用标准函数即可操作。

DTM有了之后,接下来就请enjoy it

业务背景

出于用户体验、吸引用户角度的考量,经过多年发展,推荐系统其实已经在各类型网站或app上称为标准服务,不论是新闻、音乐、电商、电影等内容。当然,通过人工编辑也可以形成简单的推荐引擎,但这种方式的效率非常低,且比较生硬。如何通过用户的行为自动化地产生适合清单,是我们一直追求的目标。

设想一下:你现在正在登录到 JD.com(京东),虽然我们拥有海量的商品可供选择,但你可能正在漫无目的的闲逛;也有可能是昨天秒杀了一件商品,回到京东正在回味自己的英明决策;或者最近几款新式手机上市,你正在兴致勃勃的对比参数性能……

一万个读者有一万个哈姆雷特,一亿个用户就有一亿个京东

“一亿个京东”背后强有力的支持便是推荐系统。在京东Web、app、微信、手机QQ等各个环节均会存在商品推荐。贯穿了用户全流程购物环节,包括首页、商品详情页、购物车、我的京东等。

阅读全文 »

最近duoshuo社会化评论崩溃了,上千条评论就这么没了,各种手段恢复无果。只能怪我太懒,不爱经常做备份。果断将博客评论迅速转移到disqus,希望以后不会有事(后来还是有事了,所有评论都没了,额)。

表意一致问题

言归正传,最近和工程师讨论词向量表征商品特征的思路时,遇到一个很有意思的现象:一个商品很可能标记了

  • 维达纸巾
  • 纸巾维达

这两个特征的意义实际一致,从权重角度考虑,应该做合并处理。工程师给了一个 Python 版本,我也忍不住给了一个 R 版本,大家可以看看使用 match 索引和 duplicated 函数的作用。

阅读全文 »
0%