一、实验目的

  在实验 7-1 清洗完成的明细数据表基础上开展特征工程,理解特征衍生、文本标签提取对挖掘自媒体运营规律的核心价值,掌握数据分析中特征构建的通用方法论。

  熟练使用助睿 ETL 计算器组件完成数值衍生指标计算,利用 JavaScript 代码组件实现文本标题关键词自动识别、二元标签标注,解决内置组件无法实现的复杂文本逻辑处理需求。

  掌握增量更新数据方案,使用 “插入 / 更新” 组件基于主键 id 回填数据表,避免重复写入、数据冗余,实现数据表可重复迭代运算,适配多次调试实验场景。

  搭建关键词统计分支数据流,通过过滤、分组聚合、常量打标、记录集连接等组件,完成不同标题关键词互动指标的对比统计,产出关键词分析汇总表。

  建立文本特征 + 数值指标双维度特征构建思维,能够将非结构化标题文本转化为可量化分析的结构化字段,为后续可视化量化标题运营效果提供数据支撑。

二、实验环境

项目

说明

实验平台

助睿在线实验平台(https://lab.guilian.cn/)

数据处理工具

助睿ETL(数据集成平台)

前置依赖

实验7-1输出的 content_analysis 表

课程名称

商业数据分析

三、实验步骤

3.1 第一部分:更新 content_analysis 表(标题特征+互动总数)

步骤1:导入数据

拖入「表输入」组件,选择实验7-1输出的 content_analysis 表作为数据源。助睿ETL支持跨项目引用数据集,可直接选择实验一输出的结果表。

步骤2:提取标题特征(JavaScript代码组件)

拖入「JavaScript代码」组件,输入以下代码提取5个标题特征标志字段:

javascript
// 先处理 null 值,避免报错
var title = title;
if (title == null) {
    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;

5个标题特征说明:

输出字段

返回值

判断条件

has_best

1 / 0

标题含"保姆级"为1,否则为0

has_lowcode

1 / 0

标题含"零代码"为1,否则为0

has_practice

1 / 0

标题含"实战"为1,否则为0

has_tutorial

1 / 0

标题含"教程"或"指南"为1,否则为0

has_pit

1 / 0

标题含"踩坑"为1,否则为0

重要配置:需要在JavaScript代码组件的「字段」选项卡中显式定义这5个输出字段,类型为Integer。

步骤3:计算互动总数(计算器组件)

拖入「计算器」组件,新增 total_interaction 字段:

total_interaction = likes + favorites + shares + coins

互动总数 = 点赞数 + 收藏数 + 分享数 + 投币数,反映作品的用户互动规模。

步骤4:数据更新(插入/更新组件)

使用「插入/更新」组件,将计算好的特征数据回填到 content_analysis 表。

关键配置:

配置项

设置值

目标表

content_analysis

查询关键字

id(匹配依据,按id匹配更新)

更新字段

total_interaction, has_best, has_lowcode, has_practice, has_tutorial, has_pit

字段映射:

流字段

表字段

id

id

total_interaction

total_interaction

has_best

has_best

has_lowcode

has_lowcode

has_practice

has_practice

has_tutorial

has_tutorial

has_pit

has_pit

为什么用"插入/更新"而不是"表输出"

  • 表输出:每次运行都会新增行,导致数据重复
  • 插入/更新:按 id 匹配,已存在则更新指定字段,不存在才插入新行
  • 好处:实验可以反复运行,不会产生重复数据

步骤5:执行转换流

完整转换流结构:

text
表输入(content_analysis) → JavaScript代码(提取标题特征) → 计算器(计算互动总数) → 插入/更新(回填content_analysis)

3.2 第二部分:输出关键词级别的汇总表

步骤1:创建目标表

创建 title_feature_analysis 表,字段设计如下:

字段

类型

说明

id

INT AUTO_INCREMENT

自增主键

platform

VARCHAR(20)

平台(B站/CSDN)

feature_name

VARCHAR(50)

关键词名称

avg_interaction

DECIMAL(10,2)

含该关键词的平均互动总数

overall_avg

DECIMAL(10,2)

该平台整体平均互动总数

sample_count

INT

含该关键词的作品数

步骤2:计算整体平均互动数(分支1

以"保姆级"为例,从表输入复制一条分支:

  1. 排序记录:按 id 升序排序
  1. 分组(聚合): 
  • 不设分组条件(整体统计)
  • 计算 AVG(total_interaction) → 得到 overall_avg(整体平均互动数)
  1. 增加常量:新增字段 feature_name = '保姆级',为这一行数据贴上名称标签

步骤3:计算关键词的平均互动数(分支2

  1. 过滤记录:设置条件 has_best = 1,只保留含"保姆级"的作品
  1. 排序记录:按 id 升序排序
  1. 分组(聚合): 
  • 不设分组条件
  • 计算 AVG(total_interaction) → avg_interaction(关键词平均互动数)
  • 计算 COUNT(id) → sample_count(含该关键词的作品数)
  1. 增加常量:新增字段 feature_name = '保姆级'

步骤4:合并整体平均值和关键词平均值

使用「记录集连接」组件,将两个分支的数据合并:

  • 匹配字段:feature_name
  • 由于两个分支都只有1行数据,无需排序

合并后每一行包含:feature_name、overall_avg、avg_interaction、sample_count

步骤5:数据入库(表输出)

用「表输出」组件将合并后的数据写入 title_feature_analysis 表。

注意:不勾选"裁剪表",因为还有其他4个关键词的数据也要入库,不能删除已有数据。

步骤6:复制分支处理其他4个关键词

一个关键词的转换流完成后,复制粘贴整个分支,只需修改两处:

关键词

过滤条件

常量值

保姆级

has_best = 1

feature_name = '保姆级'

零代码

has_lowcode = 1

feature_name = '零代码'

实战

has_practice = 1

feature_name = '实战'

教程/指南

has_tutorial = 1

feature_name = '教程/指南'

踩坑

has_pit = 1

feature_name = '踩坑'

其他组件配置完全相同,依次运行即可。

四、遇到的问题及解决

4.1 问题1JavaScript代码报错 - 无法调用nullindexOf方法

错误信息:TypeError: Cannot call method "indexOf" of null

问题原因:title字段存在null(空值),对null调用.indexOf()方法会直接报错。

解决方法:在JavaScript代码开头先判断title是否为null,如果是null则转为空字符串:

javascript
var title = title;
if (title == null) {
    title = "";
}

4.2 问题2JavaScript组件输出字段值为null

问题现象:代码运行成功,但新增的has_best等字段的值都是null。

问题原因:在助睿ETL的JavaScript代码组件中,仅仅在代码里写变量是不够的,还需要在组件的「字段」选项卡中显式定义输出字段,否则这些变量不会作为字段输出到数据流中。

解决方法:

  • 打开JavaScript代码组件的「字段」选项卡
  • 手动添加5个输出字段:has_best、has_lowcode、has_practice、has_tutorial、has_pit
  • 类型设置为Integer(整数)

4.3 问题3:插入/更新 vs 表输出的选择

问题现象:如果使用表输出组件,每次运行都会重复插入数据,导致数据重复。

问题原因:表输出组件每次运行都会将数据流中的所有行插入到目标表中,不会检查是否已存在。

解决方法:使用「插入/更新」组件,按id匹配更新:

  • 如果id已存在,则更新指定字段(total_interaction、has_best等)
  • 如果id不存在,则插入新行
  • 这样实验可以反复运行,不会产生重复数据

4.4 问题4:增加常量的作用

问题困惑:为什么要加"增加常量"组件给每一行数据贴标签?

原因说明:聚合后的数据只有数值,没有关键词名称。如果不加,5个分支的数据合并后无法区分谁是谁。常量就是给每一行贴上"标签",告诉下游"这一行是保姆级的数据"。

解决方法:每个关键词分支都通过"增加常量"组件添加feature_name字段,值为对应的关键词名称。

五、实验总结

5.1 实验成果

本次实验基于清洗后的content_analysis明细表完成全量特征构建,产出两类结构化特征数据:

  1. 原地更新明细数据表:新增total_interaction总互动数值指标,同时生成 5 个标题二元特征标签(has_best、has_lowcode、has_practice、has_tutorial、has_pit),通过主键匹配完成 5703 条作品数据增量更新,无重复脏数据。
  2. 新建title_feature_analysis关键词汇总分析表:分别统计 “保姆级、零代码、实战、教程 / 指南、踩坑” 五大关键词对应作品平均互动量、样本数量、平台整体平均互动基准,实现不同标题关键词运营效果量化对比,共生成 16 条关键词统计记录。

整套特征构建转换流运行稳定,文本识别、数值计算、聚合统计逻辑无报错,所有衍生特征字段规范、可直接接入 BI 可视化工具开展深度分析。

5.2 核心知识点

  特征工程核心逻辑:从基础原始字段衍生业务指标、将非结构化文本转化为可计算标签,把隐性业务规律转化为显性量化数据,是数据挖掘与运营分析的核心环节。

  JavaScript 自定义文本处理:处理空值规避空指针报错,通过字符串匹配实现关键词自动打标,同时必须在组件中手动定义输出字段才能生成新标签列。

  增量更新数据机制:区分 “表输出” 与 “插入 / 更新” 组件适用场景,主键匹配更新方案支持重复运行实验,解决迭代调试产生数据重复的行业常见痛点。

  模块化分支复用开发:同类关键词统计逻辑仅需复制分支、修改过滤条件与常量标签,大幅降低重复开发工作量,提升 ETL 开发效率。

  常量字段与多表合并:聚合后的数据无业务标识,通过增加常量组件给数据行打上关键词标签,再使用记录集连接整合基准数据与关键词统计数据,实现指标对比。

5.3 心得体会

通过本次特征构建实验,我理解到原始基础字段仅能展示表层数据,特征工程才是挖掘业务价值的关键,将标题文本转化为标准化标签后,才能量化判断不同标题写法对作品流量、互动的影响,实现运营策略数据化。

JavaScript 自定义脚本拓展了 ETL 工具的能力边界,当内置组件无法满足复杂文本、条件判断逻辑时,可通过代码灵活实现业务需求,同时也意识到空值容错处理、输出字段配置是脚本运行成功的关键细节,稍有遗漏就会出现字段为空、程序报错等问题。

“插入 / 更新” 增量更新模式让我掌握了企业数据仓库通用的数据迭代方案,实际业务中数据表不会一次性全量重建,基于主键更新、增量写入是保障数据一致性的标准方案。

批量复制分支处理同类逻辑的开发方式,让我建立模块化、复用化的数据开发思维,减少重复操作、降低人为配置失误概率,该开发思路可以应用在多维度、多分类的统计分析场景中。整套实验流程也让我打通了 “清洗数据 — 构建特征 — 汇总统计” 完整链路,为后续可视化分析打下完整数据基础。

Logo

一站式 AI 云服务平台

更多推荐