MongoDB地图使用词库和短语减少术语频率



我需要制作一个带有扭曲的术语频率映射/减少:

  1. 小写术语
  2. 删除停止字
  3. 词干
  4. 分成短语
  5. 计算每个短语
  6. 按计数递减排序

我所说的短语划分如下:假设我有一个标题"大卫打扫房间",我想在结果中计算以下短语:

大卫大卫打扫卫生大卫打扫房间清洁打扫房间房间

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

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,然后每天更新最新记录。

您所描述的功能列表正是MongoDB的文本索引所提供的:

  • 基于语言的词干
  • 不区分大小写的索引
  • 设置相对字段权重的选项
  • 搜索单个术语、多个术语或短语
  • 返回的结果按相关性评分

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

除了MongoDB之外,还可以集成其他文本搜索选项,以提供更高级的搜索选项,如facets、集群和关键字接近度。

在mongodb 2.6的最新版本中包含FTS(无测试版,发布版)。这个版本包括用雪球做词干,每种语言都有停止语。

最新更新