D3.js 用交叉滤波器做字频

D3.js 用交叉滤波器做字频,d3.js,crossfilter,D3.js,Crossfilter,我想要一个交叉过滤组,给出一系列调查中每个单词的词频和平均评分,这样我就可以制作一个很棒的交互式单词气泡频率图 我的数据如下所示: [{feedback: "This is a horrible service", rating:2}, {feedback: "I love everything about everything", rating: 10}, {feedback: "love the user interface, good service", rating:6}, {feedb

我想要一个交叉过滤组,给出一系列调查中每个单词的词频和平均评分,这样我就可以制作一个很棒的交互式单词气泡频率图

我的数据如下所示:

[{feedback: "This is a horrible service", rating:2},
{feedback: "I love everything about everything", rating: 10},
{feedback: "love the user interface, good service", rating:6},
{feedback: "", rating: 7} ]
我想要一些像:

[ {key: love, count:2, ave: 8}, {key: horrible, count:1, rating:2 }, {key: service, 
count: 2, rating: 4 } ,.... ]   
到目前为止,我已经:

函数将字符串分解为标记,返回每个单词的频率为的对象

var wordcnt = function(bah ){
     var hist = {}, words =  bah.split(/[\s*\.*\,\;\+?\#\|:\-\/\\\[\]\(\)\{\}$%&0-9*]/)
     for( var i in  words)
        if(words[i].length >1 )
            hist[words[i]] ? hist[words[i]]+=1 : hist[words[i]]=1;
                return hist;
   };
将数据加载到d3和交叉滤波器

  d3.csv("test.csv",  function( error, data) {

   data.forEach(function(d) {
           d.rating= +d.rating;     
       d.wordCount= wordcnt(d.feedback.toLowerCase());   
    });


var ndx = crossfilter(data);
var all = ndx.groupAll();

var frequencyDimension=ndx.dimension(function(d){return d.wordCount; }); 
和一个屠宰群减少功能

var frequencyGroup= frequencyDimension.group().reduce(
     function (p, v) {
   for (var key in v.wordCount) {  
    if (v.frequency.hasOwnProperty(key)) {
                p.frequency[key]+= v[key];
                    p.frequency[key].count++;
                    p.frequency[key].sum+= v.rating ;

              }
            else{
                 p.frequency[key]=v[key];
                 p.frequency[key].count=1;
                 p.frequency[key].sum = v.rating;
            }
        }       
           p.frequency[key].ave = p.frequency[key].sum/p.frequency[key].count ;
       return p;
    },
     function (p, v) {
        for (var key in v.wordCount) {
              if (v.frequency.hasOwnProperty(key)) {
                p.frequency[key]-= v[key];
                    p.frequency[key].count--;
                    p.frequency[key].sum-= v.rating ;

              }
        //don't need an else statement because can't remove key if it doesn't exist
       }
        p.frequency[key].ave = p.frequency[key].sum/p.frequency[key].count ;

        return p;
     },
     function (p,v)  {
          return    { frequency: {} } ; 
      } 
 )

我认为您不应该使用标准的dimension.group(),而应该查看dimension.groupAll(),它可以让您完全控制分组的结构。它没有很好的文档记录,但是它应该允许您在wordcnt函数中重新构建正在构建的直方图,但是对于整个数据集是递增的。所以使用group=frequencyDimension.groupAll().reduce()?我的reduce函数是什么样子的?除了调查响应的数量之外,我似乎无法从.value()中获得任何信息。groupAll()的.reduce()函数的结构与普通函数不同。正如我所说,它没有很好的记录:-)。你能用你当前的代码设置一个JSFIDLE或类似的东西吗?我可以给你一个例子。我使用d3.set在每个调查响应中获得一个唯一单词的列表,并获得所有调查中所有单词的主列表,然后我用它在组中进行初始reduce@MichaelHiggins,你最后的速度还可以吗?