const d = require('./docs/短剧变现/raw/_merged.json'); const hypotheses = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'H7', 'H8']; function groupByHypothesis(items) { const map = {}; for (const h of hypotheses) map[h] = []; for (const item of items) { for (const h of (item.hypothesis || [])) { if (map[h]) map[h].push(item); } } return map; } function sentimentDist(items) { const dist = {}; for (const item of items) { const s = item.sentiment || 'unknown'; dist[s] = (dist[s] || 0) + 1; } return dist; } function topTags(items, n) { n = n || 20; const counts = {}; for (const item of items) { for (const tag of (item.tags || [])) { counts[tag] = (counts[tag] || 0) + 1; } } return Object.entries(counts) .sort(function(a, b) { return b[1] - a[1]; }) .slice(0, n); } function truncate(str, len) { if (!str) return ''; return str.length > len ? str.slice(0, len) + '...' : str; } var grouped = groupByHypothesis(d.items); var overallTags = topTags(d.items, 20); var overallSentiment = sentimentDist(d.items); console.log('================================================================================'); console.log(' 短剧变现数据分析报告'); console.log('================================================================================'); console.log('总条目数: ' + d.items.length); console.log('采集时间: ' + d.meta.collectedAt); console.log(''); console.log('------------------------------------------------------------'); console.log(' 整体情感分布:'); console.log('------------------------------------------------------------'); var ks = Object.keys(overallSentiment).sort(function(a, b) { return overallSentiment[b] - overallSentiment[a]; }); for (var i = 0; i < ks.length; i++) { var s = ks[i]; var c = overallSentiment[s]; var pct = (c / d.items.length * 100).toFixed(1); console.log(' ' + s + ': ' + c + ' (' + pct + '%)'); } console.log(''); console.log('------------------------------------------------------------'); console.log(' 全量 Top 20 标签:'); console.log('------------------------------------------------------------'); for (var i = 0; i < overallTags.length; i++) { var tag = overallTags[i][0]; var count = overallTags[i][1]; console.log(' ' + pad(i + 1, 2) + '. ' + pad(tag, 18) + ' ' + count); } console.log(''); for (var hi = 0; hi < hypotheses.length; hi++) { var h = hypotheses[hi]; var items = grouped[h]; if (items.length === 0) continue; var sorted = items.slice().sort(function(a, b) { return b.likes - a.likes; }); var sent = sentimentDist(items); var topN = sorted.slice(0, 8); console.log('------------------------------------------------------------'); console.log(' ' + h + ' -- 共 ' + items.length + ' 条'); console.log('------------------------------------------------------------'); var sentParts = []; var sk = Object.keys(sent).sort(function(a, b) { return sent[b] - sent[a]; }); for (var si = 0; si < sk.length; si++) { var ss = sk[si]; var sc = sent[ss]; sentParts.push(ss + ': ' + sc + ' (' + (sc / items.length * 100).toFixed(1) + '%)'); } console.log(' 情感分布: ' + sentParts.join(' | ')); console.log(''); console.log(' Top 8 高点赞条目:'); console.log(' ' + repeat('-', 74)); for (var ti = 0; ti < topN.length; ti++) { var item = topN[ti]; var tagStr = (item.tags || []).slice(0, 3).join(', ') || '(无)'; console.log(' ' + (ti + 1) + '. [' + pad(item.platform, 6) + '] Likes:' + pad(String(item.likes), 7) + ' | ' + pad(item.keyword, 12) + ' | ' + pad(item.sentiment || '', 9) + ' | ' + tagStr); console.log(' ' + truncate(item.content, 80)); console.log(''); } console.log(''); } console.log('================================================================================'); console.log(' 全量 Top 20 标签汇总:'); console.log('================================================================================'); var maxCount = overallTags[0] ? overallTags[0][1] : 1; for (var i = 0; i < overallTags.length; i++) { var tag = overallTags[i][0]; var count = overallTags[i][1]; var bar = repeat('|', Math.max(1, Math.round(count / maxCount * 30))); console.log(' ' + pad(i + 1, 2) + '. ' + pad(tag, 18) + ' ' + pad(String(count), 4) + ' ' + bar); } function pad(s, n) { s = String(s); while (s.length < n) s = s + ' '; return s; } function repeat(ch, n) { var r = ''; for (var i = 0; i < n; i++) r += ch; return r; }