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,你最后的速度还可以吗?