一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 1600|回复: 32
收起左侧

[BigData] 非cs人求问如何统计每个词的频率

[复制链接] |试试Instant~ |关注本帖
snowdustdj 发表于 2014-4-9 00:19:50 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
有一个1g的数据,每一行是一个人的爱好,比如iron man, c++, baseball,各种各样的字符串。但是这5万个人的爱好是有重复的,目的就是build a histogram of every 'likes', I can choose a cut off in order to ignore some low frequency ones.....
the second one is build a histogram for pair wise 'likes', for example, I want the frequency of the pairs (basketball, baseball)...there are too many pairs for me to consider, not even record the frequencies.
I'm from stat and I only know R. it's not possible for me to read the whole data in to R all at once.
Anyone has some suggestions on which direction I should work on?
Thanks....
blueiceni 发表于 2014-4-9 01:08:04 | 显示全部楼层
去看下 MapReduce 吧,通常的大数据题都是用 MR 来做处理

也有用 R 来写 MapReduce 程序的方法:

http://blog.kuan0.com/2013/09/ba ... example-with-r.html
回复 支持 反对

使用道具 举报

 楼主| snowdustdj 发表于 2014-4-9 01:18:32 来自手机 | 显示全部楼层
blueiceni 发表于 2014-4-9 01:08
去看下 MapReduce 吧,通常的大数据题都是用 MR 来做处理

也有用 R 来写 MapReduce 程序的方法:

谢谢,这就去看看
回复 支持 反对

使用道具 举报

tobyljj 发表于 2014-4-9 01:28:20 | 显示全部楼层
才1G的话完全不用map reduce。。如果只有这个需求的话直接随便写个小东西parse一下就行了
回复 支持 反对

使用道具 举报

 楼主| snowdustdj 发表于 2014-4-9 02:25:16 来自手机 | 显示全部楼层
tobyljj 发表于 2014-4-9 01:28
才1G的话完全不用map reduce。。如果只有这个需求的话直接随便写个小东西parse一下就行了

能具体些吗。。或者哪方面知识
回复 支持 反对

使用道具 举报

 楼主| snowdustdj 发表于 2014-4-9 02:33:08 来自手机 | 显示全部楼层
tobyljj 发表于 2014-4-9 01:28
才1G的话完全不用map reduce。。如果只有这个需求的话直接随便写个小东西parse一下就行了

我目前的想法是一个数据一个数据读
if 新数据 in 已有的数据 then 对应数据count +1
else 把新的数据加入原来list构成新的list 对应count为0
但是考虑到有几十万个数据 这个应该行不通。。所以看看有什么新的思路

另外一个想法是能不能把1G的csv文件一行一行读, 每一行对应一个histogram,然后想想看有没有办法把这5w个histogram整个起来
求指导。。
回复 支持 反对

使用道具 举报

小K 发表于 2014-4-9 07:44:16 | 显示全部楼层
map reduce would do
can be implemented in any language, both py and R can do this

may need >1 passes
1 to get word count
2 to .... calculate histogram

i suspect the data will be long tailed and too sparse for histogram to look informative?
回复 支持 反对

使用道具 举报

 楼主| snowdustdj 发表于 2014-4-9 09:40:39 来自手机 | 显示全部楼层
本帖最后由 snowdustdj 于 2014-4-9 10:34 编辑
小K 发表于 2014-4-9 07:44
map reduce would do
can be implemented in any language, both py and R can do this



对的,会把一些频率很低的词条剔除掉。今天网上查了一天了,K姐有木有mapreduce简单应用的资料?我知道那个udacity公开课有教怎么写mapreduce,但是可能来不及了。所以有那种看一天能写出点东西的教程吗

更新下:刚找到rmr package的tutorial了,现在研究下,谢谢姐
回复 支持 反对

使用道具 举报

EroicaCMCS 发表于 2014-4-9 18:26:40 | 显示全部楼层

udacity的MR课就4个lesson,几个小时可以看完了
回复 支持 反对

使用道具 举报

readman 发表于 2014-4-9 23:20:07 | 显示全部楼层
一个G 太小了, 不用mapreduce.
直接分割下可以了.
回复 支持 反对

使用道具 举报

tomtang0514 发表于 2014-4-9 23:54:56 | 显示全部楼层
一个G的数据完全不需要mapreduce,按你的方法一个一个词读就行了,用hashmap 储存已有词,词做key,出现次数做value
回复 支持 反对

使用道具 举报

danielgao 发表于 2014-4-10 00:15:39 | 显示全部楼层
本帖最后由 danielgao 于 2014-4-10 00:17 编辑

1.
首先一个G的数据很小了,现在的大公司服务器内存随便就是几十上百G的,HASH MAP放内存毫无问题。 如果要稍微优化一下storage, maybe可以考虑用trie tree, 然后叶子节点算频率,这样实际上应该不会比HASH MAP 慢太多,仍然勉强算是常数,虽然那个常数可能和你最长的词长度一样大。。。。

2不清楚你的问题啊。。,那个pair wise的两个兴趣A和B之间是OR还是AND的关系

例如你input是

A
A
B

完整结果是什么?
回复 支持 反对

使用道具 举报

 楼主| snowdustdj 发表于 2014-4-10 02:18:06 来自手机 | 显示全部楼层
readman 发表于 2014-4-9 23:20
一个G 太小了, 不用mapreduce.
直接分割下可以了.

我试过,但里面有17w个不同的字符串,如何有效找到对应频率呢?有没有什么可行的方法?我自己写的程序有17w乘16w的match比较,肯定是跑不出来的。。
回复 支持 反对

使用道具 举报

m4reiiy 发表于 2014-4-10 02:55:54 | 显示全部楼层
直接一个pass过去把所有的词先找出来(肯定远少于17w),扔在hashmap里(java/py/cpp/whatever),然后第二个pass数一下cross term就行了吧,似乎这么简单的任务上mapreduce有伤敌一千自伤八百的嫌疑
回复 支持 反对

使用道具 举报

 楼主| snowdustdj 发表于 2014-4-10 03:17:30 | 显示全部楼层
本帖最后由 snowdustdj 于 2014-4-10 03:26 编辑
tomtang0514 发表于 2014-4-9 23:54
一个G的数据完全不需要mapreduce,按你的方法一个一个词读就行了,用hashmap 储存已有词,词做key,出现次数 ...

看来好多人推荐hashmap,我查查看现在学习来得及不。。我现在做到

#把数据按照行读出来
likes <- readLines("likes.csv", n = -1L)
#由于是csv,但照逗号分割,lks是一个list, lks[[1]]就是第一个observation,。。。
lks =strsplit(likes, split = ",")
rm(list=likes)
un=unique(unlist(lks))#找出不重复的字符,大概17w个
#对list里面每个list apply,判断是否match, 把True加起来
nm=lapply(un,function(x) sapply(lks,function(y) sum(y==x)))
上面是拿R 写的,最后一行跑到两个小时的时候报错,内存不够。。。这种情况hashmap可以解决吗?有什么入门hashmap的东西吗?cs小白一个,但将来会学习的。

刚才又读了下数据:
there are 4019419 unique strings, 177797 observations, or in the list lks, there are 177797 elements, each elements consistets of some strings for that person. Since when I count the strings, the user ID is included, so the actural number of differet strings is (4019419-177797 ).
right now, they takt 85% memory, so I cant run :
nm=lapply(un,function(x) sapply(lks,function(y) sum(y==x)))


回复 支持 反对

使用道具 举报

 楼主| snowdustdj 发表于 2014-4-10 03:17:57 | 显示全部楼层
m4reiiy 发表于 2014-4-10 02:55
直接一个pass过去把所有的词先找出来(肯定远少于17w),扔在hashmap里(java/py/cpp/whatever),然后第二 ...

能帮忙看看楼上吗
回复 支持 反对

使用道具 举报

hetong_007 发表于 2014-4-10 03:36:57 | 显示全部楼层
LZ可以参考一下我的这些想法:

文件是csv的话,用read.table / read.csv 加上一些参数设置会更好更快地读入,见这个帖子:http://stackoverflow.com/questio ... -as-dataframes-in-r。并且操作data.frame实在是比操作list快很多,不需要unlist之类的恼人操作。

lapply套sapply什么的,实在是太慢了…………如果你想做的是一个大的文本A在小的词典B里面的映射的话,用match函数会非常非常快,前提是你的文本A是一个vector,这点用unlist可以做到,或者是用read.csv的话就根本不用unlist了。不要对每个list和每个词来比较,思路就是把整个list和整个词典一次性比较。比如match(c(1,1,2,2,3),c(3,1,2))就会返回c(2,2,3,3,1),你最后对结果做一个table,就出来了。

回复 支持 反对

使用道具 举报

tomtang0514 发表于 2014-4-10 03:39:05 | 显示全部楼层
snowdustdj 发表于 2014-4-9 13:17
看来好多人推荐hashmap,我查查看现在学习来得及不。。我现在做到

#把数据按照行读出来

用list效率太低了,hashmap大概十几分钟就能跑完。
关于内存不够的问题,你把file分成10个部分(或者每1000行一个部分),每个部分跑完把结果存到一个file里。最后把所有结果merge一下
回复 支持 反对

使用道具 举报

 楼主| snowdustdj 发表于 2014-4-10 03:42:43 | 显示全部楼层
tomtang0514 发表于 2014-4-10 03:39
用list效率太低了,hashmap大概十几分钟就能跑完。
关于内存不够的问题,你把file分成10个部分(或者每1 ...

我去查查hasp map怎么写。。。cs不会点真的找data science的职位太难。
回复 支持 反对

使用道具 举报

 楼主| snowdustdj 发表于 2014-4-10 03:45:50 | 显示全部楼层
本帖最后由 snowdustdj 于 2014-4-10 04:05 编辑
hetong_007 发表于 2014-4-10 03:36
LZ可以参考一下我的这些想法:

文件是csv的话,用read.table / read.csv 加上一些参数设置会更好更快地读 ...

原本是用read.csv或者read.table来的,但是每行的列的个数不一样,而且小到2,大到好几万,所以read.csv没办法把数据正确读出来,比如如果有一行特别长,那么多出的部分就到下一行去了,整个数据就乱了。

我也用count.field()试图去找出最长的obs有多少列,但是一直返回NA,我再检查检查。。

刚才用match跑了下,确实好快,并且table也跑完了。应该能统计出来那些unique string 的频数,然后把频数低的去掉。 现在想想怎么找 pair的频数。。。太感谢你了。

回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-6 02:48

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表