MongoDB Map通过词干和短语减少术语频率

时间:2014-01-08 11:15:22

标签: mongodb mapreduce full-text-search stop-words stemming

我需要改变一个Term Frequency Map / Reduce:

  1. 小写条款
  2. 删除停用词
  3. 词干
  4. 分为短语
  5. 计算每个短语
  6. 按计数desc排序
  7. 我的意思是分成短语如下:说我有一个标题“大卫打扫房间”,我想在结果中计算以下短语:

    大卫 大卫清理 大卫打扫房间 清理 打扫房间 房间

    我目前有简单的解决方案,不会做任何短语,停止词语或词干:

    var map = function() {  
        var summary = this.summary;
        if (summary) { 
            // quick lowercase to normalize per your requirements
            summary = summary.toLowerCase().split(" "); 
            for (var i = summary.length - 1; i >= 0; i--) {
                // might want to remove punctuation, etc. here
                if (summary[i])  {      // make sure there's something
                   emit(summary[i], 1); // store a 1 for each word
                }
            }
        }
    };
    
    var reduce = function( key, values ) {    
        var count = 0;    
        values.forEach(function(v) {            
            count +=v;    
        });
        return count;
    }
    

    我不确定mongodb map / reduce是否可以支持阻止和停止开箱即用的单词以及如何将它们放在一起。

    澄清:Map / Reduce的结果将是一个包含术语和频率的集合。我需要保持这个集合是最新的(每日),以便我们可以看到最常用的术语。我希望能够运行最初的M / R,然后每日更新最新记录。

2 个答案:

答案 0 :(得分:0)

您描述的功能列表正是MongoDB的text index提供的功能:

如果您想构建自己的全文搜索,Map / Reduce不是最好的方法。对于基本解决方案,您最好根据关键字搜索要求使用普通find()build a multi-key index来迭代文档。

在MongoDB之外,可以集成other text search options以提供更高级的搜索选项,例如构面,群集和关键字邻近度。

答案 1 :(得分:0)

在最新版本mongodb 2.6中包括FTS(没有beta,发布)。这个版本包括用雪球扼杀,每种语言的停用词。