本文是“腺样体肥大专科门诊情绪风险识别”项目的技术构建过程。
项目的数据构建、脱敏流程、JSON 结构和 MindENT-ZZHL-25 数据集介绍已经在前文展开,本文不再重复。
相关内容可参考:

1. 门诊中的情绪识别

这个项目的出发点并不是做一个通用的“焦虑/抑郁识别模型”。如果只是泛化地讨论情绪识别,任务会变得非常模糊:输入可以是社交媒体文本、心理访谈、问卷回答、语音片段,也可以是多轮对话;输出可以是情绪类别、心理障碍风险、量表分数,或者某种连续情绪强度。不同场景下,“焦虑”和“抑郁”在语言中的表现方式不一定一致。

本项目的场景更具体:腺样体肥大专科门诊。这里存在几个有趣的事实:

首先,患者多为儿童,但主要陈述者却往往是家属。也就是说,模型识别到的很多信号是“家属在描述患儿疾病和治疗风险时表现出的心理语言模式”。这意味着,任务的标签虽然来自 GAD-7 和 PHQ-9,但模型输入中的核心语言来源可能是照护者文本。这个错位非常重要。

门诊对话是强任务导向的。家属进入诊室的语言其实与日常的对话差别是很大的:描述症状、确认病因、咨询治疗方案、判断是否手术,这些语境被浓缩在我们的业务场景,而这与我们的日常语言习惯相去甚远。这说明一件事:在通用场景数据集上训练的情绪模型大概率会出现欠拟合问题。

同时我们注意到门诊时间非常短。因此真正有临床意义的系统,不能只在完整就诊结束后做分析,而应该尝试在前几轮对话中给出提示。毕竟,假如我们不追求一个即时的临床场景,那么一份完善的心理测评量表大抵比任何量化模型更靠谱。

从而,本项目的关键问题是从早期对话片段中提取可用于沟通调整的风险信号。 这会直接改变模型设计的重点。我们关心的不只是最终分类准确率,还包括模型能否在前 kk 轮对话中捕捉到稳定信号,以及这些信号能否被医生理解并转化为沟通策略。我们的管线构建过程已经整理过了:

为什么早期对话可能包含情绪风险信号呢?一个直觉性的解释是:焦虑和抑郁会显著影响语言表达。但这个说法太粗糙,更值得分析的是:哪些门诊语言行为可能与焦虑/抑郁量表分数相关?

对于焦虑风险,可能相关的不是单纯的负面情绪词,而是对不确定性的处理方式。家属在面对儿童慢性疾病和潜在手术选择时,会不断询问疾病严重程度、后果、治疗必要性和复发可能性。这类表达未必包含“焦虑”二字,但可能表现为:

风险确认+反复追问+绝对化判断+症状放大\text{风险确认} + \text{反复追问} + \text{绝对化判断} + \text{症状放大}

例如:“是不是一定要手术”“会不会越来越严重”“会不会影响发育”“是不是不能拖了”“他总是这样是不是不正常”。这些表达的共同点不是情绪词本身,而是围绕风险和不确定性展开的语言结构。

对于抑郁风险,情况可能不同。抑郁不一定表现为频繁的风险确认,而可能表现为对行为状态、活动水平、睡眠质量、兴趣减少和低反应性的描述。但在儿童门诊中,这些描述又经常由家属代述,并可能被包装为看似正面的词。例如“很乖”“不怎么闹”“很听话”在某些语境下不一定是积极信号,可能指向活动减少、表达减少或者情绪反应降低。当然,这个解释必须非常谨慎,不能直接从单个词推出心理状态。

因此,门诊语言中的情绪风险不是简单的词典匹配问题,而是一个场景化语义问题。模型需要识别的是某些语言模式与量表分数之间的统计关联,而不是直接解释人的内心状态。

这一点决定了我们不能只依赖通用情绪词典。通用情绪词典能捕捉“难过”“害怕”“担心”这类显式表达,但门诊中的关键风险信号可能更像是“是否一定”“会不会影响”“总是”“特别严重”“反复不好”等临床语境中的语言结构。

2. 特征工程

经过权衡,我认为在当前样本规模下,直接训练复杂深度学习模型可能并不是一个稳健选择。MindENT-ZZHL-25 当前包含 84 名患者、131 次就诊、5531 条对话轮次。这个规模对于构建一个原型数据集已经有初步价值,但对于训练高参数量模型显然不足。

因此,现阶段更合理的方法是先做可解释特征工程,比较不同特征组在小样本下的有效性。项目中主要使用了四类特征。

第一类是 TF-IDF 及其降维表示。TF-IDF 是一种把文本转换为词语权重向量的特征表示方法。TF-IDF 的优势是可以捕捉区分高低风险样本的关键词和表达模式。它不需要人工预定义心理类别,对新出现的门诊表达有一定适应性。但它的缺点也非常明显:高维、稀疏、容易过拟合,且解释粒度通常停留在词项层面。

设文本集合为 {Ti}i=1n\{T_i\}_{i=1}^{n},词表大小为 dd,TF-IDF 表示得到矩阵:

XtfidfRn×d.X_{\text{tfidf}} \in \mathbb{R}^{n \times d}.

由于 dd 可能远大于样本数 nn,需要通过截断奇异值分解降维:

XtfidfUkΣkVk,X_{\text{tfidf}} \approx U_k \Sigma_k V_k^\top,

其中 kdk \ll d。最终使用:

Z=UkΣkZ = U_k \Sigma_k

作为低维文本表示。

第二类是 LIWC 心理语言特征。它将词汇归入心理语言类别,例如焦虑词、消极情绪词、健康词、认知词、差异词等。它的优势是维度较低、解释性较强,适合小样本;缺点是词典覆盖有限,尤其是中文门诊对话中大量口语、医学表达和照护者描述可能无法被充分覆盖。 第三类是领域规则特征。这类特征是项目中比较关键的部分。它是我们尝试围绕门诊场景所构建的特征可能性,例如:绝对化表达、症状放大、安慰需求、风险确认。对于某个规则 rjr_j,可以定义其在文本 TiT_i 中的匹配次数为:

mij=MatchCount(rj,Ti).m_{ij} = \operatorname{MatchCount}(r_j, T_i).

进一步可计算密度特征:

dij=mijTi.d_{ij} = \frac{m_{ij}}{|T_i|}.

在早期窗口中,密度特征通常比绝对计数更稳定,因为不同患者在前 kk 轮中的文本长度并不相同。

第四类是融合特征。最直接的方法是拼接:

xi=[xitfidf_svd;xiliwc;xidomain].x_i = [ x_i^{\text{tfidf\_svd}}; x_i^{\text{liwc}}; x_i^{\text{domain}} ].

但实验结果也提示,简单拼接并不一定总是有效。尤其在小样本场景下,高维通用文本特征可能压制低维心理语言特征和规则特征,导致所谓“信号稀释”。因此,融合不是把所有特征放在一起就结束了,而是需要考虑尺度、维度、正则化和特征组权重。


3. 模型评估

门诊数据有一个容易被忽略的问题:同一名患者可能有多次就诊,同一家庭的表达方式也可能具有稳定风格。如果模型在训练集中见过某个患者或家属的表达,又在测试集中评估同一患者的另一次就诊,那么测试结果会被污染。

因此,本项目采用患者级 5 折交叉验证。形式化地说,对于训练集和测试集,应满足:

PatientID(Dtrain)PatientID(Dtest)=.\operatorname{PatientID}(\mathcal{D}_{\text{train}}) \cap \operatorname{PatientID}(\mathcal{D}_{\text{test}}) = \varnothing.

这比普通随机切分更严格,也更接近真实部署场景。因为系统上线后面对的是没有见过的新患者,而不是已经出现在训练集中的患者。

在评价指标上,项目使用了准确率、F1、召回率、特异度和平衡准确率。对于这个任务,普通准确率不是最关键指标。原因是高风险和低风险样本可能不均衡,模型即使偏向多数类,也可能得到看似不错的准确率。因此更应关注:

BalancedACC=Recall+Specificity2.\operatorname{BalancedACC} = \frac{\operatorname{Recall}+\operatorname{Specificity}}{2}.

如果系统被定位为风险筛查工具,那么召回率尤其重要。漏掉高风险样本的代价可能高于误报。相反,如果系统被定位为医生端低干扰提醒工具,则需要控制误报率和特异度。这两个目标并不完全一致,因此模型阈值不能只由离线指标决定,而应结合实际使用方式设计。

4. 结果

实验中比较了 tfidf_svdliwc_onlydomain_onlyhybrid_v2 几组模型。结果显示,在焦虑任务中(下左图),融合特征 hybrid_v2 的平衡准确率最高,约为 0.564;在抑郁任务中,liwc_only 表现最好,平衡准确率约为 0.612(下右图)。

更或许暗示焦虑和抑郁在门诊对话中可能对应不同的语言机制:

焦虑任务中,融合模型更优,说明焦虑信号可能分散在多个层面。它既可能出现在显式情绪词中,也可能出现在风险确认、绝对化表达、症状放大、治疗犹豫和反复追问中。单一词典特征难以覆盖这种复杂结构,因此多源特征融合有一定优势。

抑郁任务中,LIWC 特征更优,说明抑郁风险可能更集中地体现在心理语言类别上。但这并不意味着抑郁识别更简单…一个更有意思的现象是,正向情感词与 PHQ-9 存在边缘显著正相关趋势。这个结果如果稳定存在,将非常值得进一步分析:在儿童门诊中,照护者使用的某些“正面描述”是否可能对应患儿低活动、低表达或低反应状态?

例如,“乖”“听话”“不闹”这类词在普通情绪词典中可能被归为正向表达,但在特定临床语境中,它们可能不是简单的积极信号。它们也可能是照护者对儿童行为减少的一种社会化描述。当然,这只是一个假设,需要通过更多样本、人工标注和临床访谈进一步验证。

词典类别的心理意义不是固定的。一个词在社交媒体、心理访谈、儿科门诊和家属叙述中的含义可能并不相同。未来如果要提升模型性能,可能需要构建“门诊语境校准后的心理语言词典”,而不是直接使用通用词典。


为了验证系统能否在门诊早期发挥作用,我比较了照护者前 4、6、8、10、12、15 个回合与完整文本的性能。

如果记照护者文本为:

Tcaregiver=(u1,u2,,um),T^{\text{caregiver}}=(u_1,u_2,\dots,u_m),

那么前 kk 轮窗口为:

T1:kcaregiver=(u1,u2,,uk).T^{\text{caregiver}}_{1:k}=(u_1,u_2,\dots,u_k).

实验结果显示,在分类任务中,前 6 到 8 个照护者回合已经可以达到较高得分,说明早期对话片段确实包含风险筛查信息。但在连续量表分数预测中,完整文本表现更好,与 GAD-7 和 PHQ-9 的相关性分别达到:

rGAD-7=0.301,r_{\text{GAD-7}}=0.301, rPHQ-9=0.361.r_{\text{PHQ-9}}=0.361.

这符合我们的自然直觉:长期的对话能产生更显著的监测效益。不过短期的截断对话也能在指标上取得不错的准确度这一点很有意思,这说明我们的猜想没有问题:短期的截断对话足以产生显著的特征,这或许暗示我们的系统设计上可以采用双阶段架构。第一阶段在门诊前几轮对话中运行快速筛查模型,输出轻量提醒;第二阶段在完整就诊结束后运行更全面的分析模型,生成复盘报告或科研数据之类的…


项目中还比较了传统机器学习基线与大语言模型零样本策略。结果显示,零样本大语言模型在焦虑任务上表现较好:

ACC=0.833,F1=0.833,BalancedACC=0.833.\operatorname{ACC}=0.833, \quad F1=0.833, \quad \operatorname{BalancedACC}=0.833.

在抑郁任务上,zero-shot的LLM表现为:

ACC=0.667,F1=0.750,BalancedACC=0.800,\operatorname{ACC}=0.667, \quad F1=0.750, \quad \operatorname{BalancedACC}=0.800,

其中:

Precision=1.000,Specificity=1.000,Recall=0.600.\operatorname{Precision}=1.000, \quad \operatorname{Specificity}=1.000, \quad \operatorname{Recall}=0.600.


结语

经过这些实验后,我更倾向于把这个系统定位为“门诊沟通辅助系统”,提醒医生某些沟通风险正在出现。例如:家属可能存在较强风险担忧,对话中出现多次症状放大表达,家属反复确认手术必要性和远期影响。这种输出比单纯给出“高焦虑/低焦虑”更安全,也更容易落地。

从当前结果看,几个方向值得继续推进:焦虑可能需要建模多源弱信号,抑郁可能需要重新校准心理语言词典,早期窗口可能适合做即时提醒等等。