3

我正在尝试在 R 中实现特征散列以帮助我解决文本分类问题,但我不确定我是否按照应有的方式进行操作。我的部分代码基于这篇文章:Hashing function for mapping integers to a given range?.

我的代码:

random.data = function(n = 200, wlen = 40, ncol = 10){

  random.word = function(n){
    paste0(sample(c(letters, 0:9), n, TRUE), collapse = '')
  } 
  matrix(replicate(n, random.word(wlen)), ncol = ncol)   
}

feature_hash = function(doc, N){

  doc = as.matrix(doc)
  library(digest)

  idx = matrix(strtoi(substr(sapply(doc, digest), 28, 32), 16L) %% (N + 1), ncol = ncol(doc))
  sapply(1:N, function(r)apply(idx, 1, function(v)sum(v == r)))  
}

set.seed(1)
doc = random.data(50, 16, 5)
feature_hash(doc, 3)

       [,1] [,2] [,3]
 [1,]    2    0    1
 [2,]    2    1    1
 [3,]    2    0    1
 [4,]    0    2    1
 [5,]    1    1    1
 [6,]    1    0    1
 [7,]    1    2    0
 [8,]    2    0    0
 [9,]    3    1    0
[10,]    2    1    0

所以,我基本上是使用返回的 md5 哈希的最后 5 个十六进制数字将字符串转换为整数digest。问题:

1 - 有没有可以为我做这个的包?我还没有找到。digest2 -用作散列函数是个好主意吗?如果没有,我该怎么办?

PS:我应该在发布之前测试它是否有效,但是我的文件很大并且需要很多处理时间,所以我认为有人指出我正确的方向会更聪明,因为我确信我正在这样做错误的!

感谢您对此的帮助!

4

1 回答 1

2

我不知道任何现有的 CRAN 包。

但是,我为自己编写了一个包来进行特征散列。源代码在这里:https ://github.com/wush978/FeatureHashing ,但 API 不同。

在我的例子中,我使用它来将 data.frame 转换为CSRMatrix包中的自定义稀疏矩阵。我还实现了一个辅助函数来CSRMatrixMatrix::dgCMatrix. 对于文本分类,我猜稀疏矩阵会更合适。

如果您想尝试一下,请在此处查看测试脚本:https ://github.com/wush978/FeatureHashing/blob/master/tests/test-conver-to-dgCMatrix.R

请注意,我只在 Ubuntu 中使用它,所以我不知道它是否适用于 windows 或 mac。请随时在https://github.com/wush978/FeatureHashing/issues上向我询问有关该软件包的任何问题。

于 2014-10-19T04:18:13.090 回答