楼主: snowdustdj
跳转到指定楼层
上一主题 下一主题
收起左侧

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

🔗
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的频数。。。太感谢你了。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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