Hive for bag of words(字典中每个单词的字数)

Posted

技术标签:

【中文标题】Hive for bag of words(字典中每个单词的字数)【英文标题】:Hive for bag of words (word count for each word in the dictionary) 【发布时间】:2016-03-06 11:21:46 【问题描述】:

我有一个这样结构的表:

user_id | message_id | content
   1    |      1     | "I like cats"
   1    |      1     | "I like dogs"

以及dictionary.txt(或外部 hive 表)中的有效单词列表,例如:

I,like,dogs,cats,lemurs

我的目标是为每个用户生成一个字数统计表

user_id  |  "I"  |  "like"  |  "dogs"  |  "cats"  |  "lemurs"
   1     |   2   |     2    |     1    |     1    |     0

这是我迄今为止尝试过的:

SELECT user_id, word, COUNT(*) 
FROM messages LATERAL VIEW explode(split(content, ' ')) lTable as word 
GROUP BY user_id,word;

【问题讨论】:

为什么投票失败?一个解释会更有帮助 您的查询有什么问题? 如何合并预定义的字典文件并生成具有恒定长度的行(不取决于唯一词的数量) 【参考方案1】:

检查一下:

select ename, 
length(ename)-length(replace(ename,'A', '')) A,
length(ename)-length(replace(ename,'W', '')) W 
FROM EMP;

否则,您可以定义一个变量(您的搜索字符串)并将其放置在“A”、“W”等位置

【讨论】:

这个技巧计算被替换的字符数量,而不是替换的数量【参考方案2】:

我对在 Hive 上做 Pivot 不是很熟悉,但在 pig 中可以做到。

DEFINE GET_WORDCOUNTS com.***.pig.GetWordCounts('$dictionary_path');

A = LOAD .... AS user_id, message_id, content; 

C = GROUP B BY (user_id);

D = FOREACH C GENERATE group, FLATTEN(GET_WORDCOUNTS(B.content));

您将必须编写一个简单的 UDF GetWordCounts 来标记每个分组记录的输入内容,并检查输入字典。

【讨论】:

以上是关于Hive for bag of words(字典中每个单词的字数)的主要内容,如果未能解决你的问题,请参考以下文章

Bag of features:图像检索

视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析

kaggle实战之 bag of words meet bag of poopcorn

python [Bag of Visual Words] #python

Bag of words模型

词袋模型(bag of words)构建实战