| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- 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;
- }
|