每个国家的热门词汇聚

时间:2017-04-26 07:14:13

标签: mongodb

我们的数据集具有以下结构:

{
  'country': 'United States',
  'text': 'twitter text string...'
},
{
  'country': 'Australia',
  'text': 'a different twitter text string...'
}
...

它包含来自大多数国家/地区的数据。目前有大约150万条目。我们的目标是使用聚合来获取每个国家/地区的文本字段中最常用的单词。使用$ project,$ group,$ split,$ unwind,$ nin(用于停用词)和$ sort的组合,我们已经设法接近了。它为我们提供了按国家/地区分隔的每个单词的计数,然后我们可以对其进行排序以获得最重要的单词。但是,我试图找出如何让它只为每个国家提供前N个单词。所以基本上计算每个国家的字数,排序,然后只返回每个国家的前N个。

我还是MongoDB查询的新手。我不一定在寻找一个完整的解决方案,但我想知道我应该在做什么查询参数和累加器来做这类事情。

1 个答案:

答案 0 :(得分:1)

以下是聚合框架的解决方案:

db.collection.aggregate([  
           {  
              $project:{  
                 country:1,
                 words:{  
                    $split:[ "$text", " " ]
                 }
              }
           },
           {  
              $unwind:"$words"
           },
           {  
              $group:{  
                 _id:{  
                    country:"$country",
                    word:"$words"
                 },
                 count:{  
                    $sum:1
                 }
              }
           },
           {  
              $match:{  
                 "_id.word":{  
                    $nin:[ "a" ]
                 }
              }
           },
           {  
              $sort:{  
                 count:-1
              }
           },
           {  
              $group:{  
                 _id:"$_id.country",
                 top_words:{  
                    $push:"$_id.word"
                 }
              }
           },
           {  
              $project:{  
                 country:1,
                 top_words:{  
                    $slice:[ "$top_words", 2 ]
                 }
              }
           }
        ])
  1. $project 阶段
  2. 中将文字拆分为空白区域
  3. 展开结果数组
  4. countrywords分组以获取每个国家/地区的每个单词的计数
  5. 过滤掉 $match 阶段
  6. 中的停用词
  7. 排序count
  8. country对文档进行分组,并将每个单词推送到名为top_words
  9. 的数组中
  10. 切割数组以获得前N个单词(此处为前2个)