自媒体运营分析-作品特征构建
一、 实验目的
在实验7-1 清洗后的数据的基础上,使用助睿ETL完成以下两类特征的计算与存储:
(1)标题特征与互动总数(更新明细表)
- 计算互动总数(total_interaction = likes + favorites + shares + coins)
- 提取5个标题特征标志字段(has_best、has_lowcode、has_practice、has_tutorial、has_pit)
- 将计算结果更新到 content_analysis 表
(2)关键词级别的汇总数据
- 分别计算含每个关键词的作品的平均互动总数
- 将互动汇总结果输出到 title_feature_analysis 表
通过本实验,学生应掌握:
- 理解特征工程在数据分析中的核心作用
- 使用助睿ETL的“计算器”组件计算衍生指标
- 使用“JavaScript代码”组件完成文本关键词的自动标注
- 使用“插入/更新”组件回填数据,不新建表、不覆盖已有基础数据
- 使用“过滤+聚合”组件组合完成分组统计计算
二、 实验环境
- 实验平台:助睿在线实验平台 https://lab.guilian.cn/
本次实验使用助睿数智(Uniplore) 作为一站式数据科学平台。该平台覆盖从数据接入、ETL处理、机器学习建模到可视化展示的全链路零代码功能,适用于数据分析教学与企业数据加工场景。
助睿数智官网为 https://www.uniplore.com//
- 数据处理工具:助睿ETL(数据集成平台)
助睿ETL核心优势:
- 全元数据驱动架构:平台内所有对象类型均通过元数据标准化定义,覆盖数据读取、处理、写入的全流程
- 零代码拖拽式操作:通过可视化方式完成数据的抽取(Extract)、转换(Transform)、加载(Load),无需编写复杂代码
- 丰富的预处理组件:内置筛选、填充、聚合、连接、字段选择等多种转换节点,灵活应对各类数据清洗场景
- Pipeline(转换)机制:面向数据流通处理的核心功能单元,由多个不同功能的Transform步骤组合构成,聚焦数据本身的加工转换操作
- 开源内核高可用引擎:基于开源内核的高可用引擎架构,通过标准化插件体系可灵活扩展引擎能力
本次实验使用的核心组件:
组件 | 用途 |
表输入 | 读取 content_analysis 表中待处理的数据 |
计算器 | 计算互动总数(likes + favorites + shares + coins) |
JavaScript代码 | 提取标题中的5个关键词特征标志 |
插入/更新 | 按 id 匹配,更新 content_analysis 表中的特征字段 |
过滤记录 + 聚合 | 分别统计整体平均值和每个关键词的平均值 |
增加常量 | 为每个关键词分支添加名称标识 |
合并记录 | 将5个关键词的统计结果合并为5行 |
表输出 | 将互动数据汇总写入 title_feature_analysis 表 |
三、 核心设计思路
本次实验构建两类特征,并将数据更新到实验7-1 的content_analysis 表中:
- 互动总数:likes + favorites + shares + coins,反映作品的用户互动规模(绝对值)
- 标题特征:把标题中是否包含特定关键词提取为0/1标志字段,后续量化对比这些词的实际效果
数据处理流程:
四、 实验步骤
4.1 更新 content_analysis 表(标题特征+互动总数)
步骤1:导入数据
将实验7-1输出的 content_analysis表作为输入,拖入助睿ETL工作区。助睿ETL支持跨项目引用数据集,可直接选择实验一输出的结果表。
步骤2:提取标题特征(核心分析维度)
在"JavaScript代码"组件中,可以直接使用JJavaScript代码对 title 字段进行关键词匹配,生成5个标题特征标志字段。
var title = title; // 字段名直接作为变量使用
// 判断关键词
var has_best = title.indexOf("保姆级") !== -1 ? 1 : 0;
var has_lowcode = title.indexOf("零代码") !== -1 ? 1 : 0;
var has_practice = title.indexOf("实战") !== -1 ? 1 : 0;
var has_tutorial = (title.indexOf("教程") !== -1 || title.indexOf("指南") !== -1) ? 1 : 0;
var has_pit = title.indexOf("踩坑") !== -1 ? 1 : 0;
// 将结果赋值给新字段(输出字段需在字段表中提前定义)
has_best = has_best;
has_lowcode = has_lowcode;
has_practice = has_practice;
has_tutorial = has_tutorial;
has_pit = has_pit;
返回值说明:
字段 | 返回值 | 条件 |
has_best | 1 / 0 | title中含"保姆级"为1,否则为0 |
has_lowcode | 1 / 0 | title中含"零代码"为1,否则为0 |
has_practice | 1 / 0 | title中含"实战"为1,否则为0 |
has_tutorial | 1 / 0 | title中含"教程"或"指南"为1,否则为0 |
has_pit | 1 / 0 | title中含"踩坑"为1,否则为0 |
设计思路:这五个关键词在数据中高频出现,且与“教学价值”“实操性”强相关,是分析标题影响力的理想切入点。每个特征独立提取,便于在BI中做分组对比。
步骤3:计算互动总数
接入“计算器”组件,新增 interactions 字段:interactions = likes + favorites + shares + coins
步骤4:数据更新
使用“插入/更新”组件,将计算好的特征数据回填到 content_analysis 表
关键配置:
配置项 | 设置 |
目标表 | content_analysis |
查询关键字 | id(匹配依据) |
更新字段 | total_interaction, has_best, has_lowcode, has_practice, has_tutorial, has_pit |
字段映射::
流字段 | 表字段 |
id | id |
interactions | total_interaction |
has_best | has_best |
has_lowcode | has_lowcode |
has_practice | has_practice |
has_tutorial | has_tutorial |
has_pit | has_pit |
“插入/更新” vs “表输出”的区别:如果使用“表输出”,每次运行都会新增行,导致数据重复。“插入/更新”按 id 匹配,如果 id 已存在则更新指定字段,如果不存在才插入新行(本例中 id 一定存在,所以只做更新,不新增行)。这样本实验可以反复运行,不会产生重复数据。
步骤5:执行转换流
完整转换流如下,点击运行
数据结果:
4.2 输出关键词级别的汇总表
创建目标表
在助睿ETL中创建以下目标表用来存储本节最后输出的数据:
字段 | 类型 | 说明 |
id | INT | 自增主键 |
platform | VARCHAR(20) | 平台(B站/CSDN) |
feature_name | VARCHAR(50) | 关键词名称 |
avg_interaction | DECIMAL(10,2) | 含该关键词的平均互动总数 |
overall_avg | DECIMAL(10,2) | 该平台整体平均互动总数 |
sample_count | INT | 含该关键词的作品数 |
建表语句:
CREATE TABLE IF NOT EXISTS title_feature_analysis_yxlyl (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键',
platform VARCHAR(20) NOT NULL COMMENT '平台(B站/CSDN)',
feature_name VARCHAR(50) NOT NULL COMMENT '关键词名称',
avg_interaction DECIMAL(10,2) DEFAULT 0.00 COMMENT '含该关键词的平均互动总数',
overall_avg DECIMAL(10,2) DEFAULT 0.00 COMMENT '该平台整体平均互动总数',
sample_count INT DEFAULT 0 COMMENT '含该关键词的作品数',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='关键词级别汇总表';
执行转换流:
拖入表输入组件,导入content_analysis表:
接入“排序记录”, 按平台升序排序
“分组”组件,按platform分组,聚合类型为平均
以“保姆级”为例,表输入组件复制分发另一条分支,先接“过滤记录”组件,设置 has_best = 1,只保留含“保姆级”的作品。
然后接入“排序记录”、“分组”组件,按platform升序排序,计算 AVG(total_interaction) 得到 avg_interaction,COUNT(id) 得到 sample_count。
接下来将整体平均值和关键词平均值进行合并,使用“记录集连接”组件,匹配字段为feature_name,由于2个分支都只有1行数据,所以无需排序。
接入“增加常量”组件,新增字段 feature_name = '保姆级',为这一行数据贴上名称标签。
用”表输出”组件将合并后的数据入库,这里需要注意:不勾选“裁剪表”,因为还有其他关键词数据也要入库,不用删除已有数据。
表输出配置:
一个关键词的互动汇总数据加工转换流如下,点击运行:
查看数据:
接下来加工其他关键词的数据:
复制粘贴整个分支,然后只修改两处:过滤条件(如 has_lowcode = 1)和常量值(如 零代码)。其他组件配置完全相同。
最后的完整数据情况如下:
五、 实验输出
输出表 | 数据粒度 | 用途 |
content_analysis(更新) | 作品级 | 排名、趋势、概况等明细分析 |
title_feature_analysis(新建) | 关键词级 | 标题特征互动分析 |
六、问题与解决
实验过程中遇到的问题:
问题一:JavaScript代码组件中标题字段读取失败
现象:在「JavaScript代码」组件中编写关键词匹配脚本后,运行转换时提示“title is not defined”,所有标题特征标志字段(has_best、has_lowcode等)均无法正常生成。
原因分析:
- 组件未正确识别上游传递的输入字段,导致title变量无法直接使用
- 「JavaScript代码」组件需要在「字段」标签页中预先定义输入和输出字段的映射关系
- 脚本中使用的字段名与上游实际传递的字段名不一致(如实际字段名为Title而非title)
解决方法:
- 在「JavaScript代码」组件的「字段」标签页中,右键点击「获取字段」,自动加载上游组件的所有输入字段
- 在输出字段区域手动添加5个标志字段:has_best、has_lowcode、has_practice、has_tutorial、has_pit,类型均设置为Integer
- 确保脚本中使用的字段名与「字段」标签页中定义的输入字段名完全一致
- 通过「预览」功能验证每个标志字段的输出结果是否符合预期
问题二:插入/更新组件配置错误导致数据重复
现象:使用「插入/更新」组件回填数据到content_analysis表后,发现表中出现了重复记录,同一id对应多条数据,部分字段被错误地新增为行而非更新。
原因分析:
- 「插入/更新」组件的「查询关键字」未正确设置为id字段,导致匹配失败
- 组件误将更新操作执行为了插入操作,未按主键匹配即新增行
- 更新字段列表中包含了不应该更新的字段(如id本身)
解决方法:
- 在「插入/更新」组件的配置界面中,将「查询关键字」明确设置为id
- 在「更新字段」列表中,只勾选需要更新的字段:total_interaction、has_best、has_lowcode、has_practice、has_tutorial、has_pit,确保不更新id和其他基础字段
- 在「映射」标签页中,逐一核对流字段与表字段的对应关系,确保interactions正确映射到total_interaction
- 运行后通过数据库查询验证,确认同一id仅有一条记录且特征字段已被正确更新
问题三:计算器组件中互动总数计算结果为NULL
现象:在「计算器」组件中配置interactions = likes + favorites + shares + coins后,预览发现部分记录的interactions字段值为NULL,而非预期的数值。
原因分析:
- 上游数据中存在NULL值,任何数值与NULL相加结果均为NULL
- 虽然实验7-1中已对作者名称和标题做了空值处理,但未对数值字段(likes、favorites、shares、coins)进行NULL值替换
- 原始数据中部分记录的互动字段为空,导致计算异常
解决方法:
- 在「计算器」组件计算互动总数之前,增加「替换NULL值」组件
- 将likes、favorites、shares、coins四个字段的空值全部替换为0
- 通过「预览」验证空值已被成功替换后,再执行求和计算
- 确认所有记录的interactions字段均已有正常数值(非NULL)
问题四:过滤记录+分组统计时各关键词分支重复计算整体平均值
现象:在计算各关键词平均互动总数时,为每个关键词分支分别计算了overall_avg(整体平均互动总数),但由于计算逻辑重复,各分支的overall_avg值出现细微差异。
原因分析:
- 每个关键词分支在计算平均值时,数据源相同但分组统计的配置可能存在微小差异(如排序方式、聚合字段选择等)
- 对同一份数据多次重复计算整体平均值,既浪费计算资源,又可能因配置不一致导致数据不一致
- 各分支独立计算overall_avg的做法缺乏复用性,当上游数据更新时需同步修改所有分支
解决方法:
- 将整体平均值的计算单独作为一个分支,使用「分组」组件按platform分组计算AVG(total_interaction)得到overall_avg
- 各关键词分支只计算该关键词下的avg_interaction和sample_count
- 通过「记录集连接」组件,将整体平均值分支与各关键词分支按platform进行关联,合并到同一行数据中
- 修改后各关键词的overall_avg值保持一致,且计算逻辑更加清晰规范
问题五:多个关键词分支合并时使用表输出导致数据覆盖
现象:依次运行5个关键词分支的转换流后,查看title_feature_analysis表发现每次运行只保留了最后一个关键词的数据,之前的关键词记录全部丢失。
原因分析:
- 「表输出」组件默认配置了「裁剪表」选项,每次写入数据前会清空目标表
- 多个关键词分支是分多次独立运行的,每次运行都会清空之前写入的数据
- 未能将5个关键词的数据合并后再统一写入,导致数据相互覆盖
解决方法:
- 取消「表输出」组件中「裁剪表」的勾选,改为追加模式写入数据
- 若希望一次性写入所有关键词数据,可先将5个分支通过「合并记录」组件汇聚,再统一使用「表输出」写入
- 在正式运行前,先手动清空目标表或使用「SQL脚本」组件执行TRUNCATE操作,确保数据环境干净后一次性写入完整数据
七、实验总结
通过本次“自媒体运营分析——作品特征构建”实验,我在实验7-1数据清洗的基础上,进一步系统掌握了使用助睿ETL平台完成特征工程与衍生指标计算的完整方法。本次实验的核心任务是针对已清洗的content_analysis明细表构建两类分析特征:一类是互动总数(total_interaction = likes + favorites + shares + coins),作为衡量作品用户互动规模的绝对值指标;另一类是5个标题关键词特征标志(has_best保姆级、has_lowcode零代码、has_practice实战、has_tutorial教程/指南、has_pit踩坑),通过「JavaScript代码」组件对title字段进行文本匹配,将关键词是否出现转化为0/1标志字段,以便后续量化对比不同标题特征对作品互动效果的实际影响。在数据更新环节,我使用「插入/更新」组件按id匹配,仅更新新增的特征字段而不覆盖基础数据,实现了增量式的数据回填。此外,我还构建了关键词级别的汇总分析流程,通过「过滤记录」分别筛选各关键词的作品,结合「排序记录」和「分组」组件计算各关键词的平均互动总数与样本数,并与整体平均值进行对比,最终输出title_feature_analysis汇总表。整个实验让我深刻理解了特征工程在数据分析链路中的核心价值——原始数据经过清洗后仍需通过特征构建将业务问题转化为可量化的分析维度,才能真正支撑有意义的洞察与决策。
实验过程中,我遇到了JavaScript组件字段识别失败、插入/更新配置不当导致数据重复、计算器求和结果为NULL、各关键词分支整体平均值不一致、表输出裁剪导致数据覆盖等一系列问题。通过逐组件检查配置、使用「预览数据」验证中间结果、合理拆分复用计算逻辑、调整表输出写入模式,我逐一解决了这些问题。这一过程让我深刻认识到:特征构建的质量直接决定了后续分析的有效性,每个计算环节的准确性都必须严格验证。助睿ETL平台丰富的组件生态——「JavaScript代码」组件支持灵活的文本处理、「插入/更新」组件保障数据一致性、「记录集连接」组件实现多分支数据合并——为特征工程提供了强大的工具支撑。本次实验不仅让我掌握了衍生指标计算、文本特征提取和分组汇总统计的核心方法,更培养了我对数据加工链路中“计算-验证-回填”闭环流程的系统性认知,为我后续参与更深入的数据建模与可视化分析奠定了扎实的基础。