1. 项目概述当NLP遇见心理健康监测在社交媒体高度渗透日常生活的今天我们发布的每一条状态、每一句感慨都不仅仅是信息的传递更是个人情绪与心理状态的无声映射。对于心理健康领域尤其是抑郁症的早期识别与干预这些海量的、自发的文本数据成了一个前所未有的“富矿”。然而从这些非结构化的、充满噪声的短文本中精准地捕捉到抑郁的蛛丝马迹是一个极具挑战性的任务。传统的基于词典或简单统计的方法往往难以理解语言的复杂语境和深层语义。这正是我们这项工作的起点探索如何利用最前沿的自然语言处理技术构建一个高效、准确的自动化抑郁症检测模型。我们聚焦于一个核心问题如何从社交媒体文本中提取出最能表征抑郁倾向的判别性特征经过反复实验我们提出并验证了一套名为“BERT-RF”的特征工程方法。简单来说它先用强大的BERT模型理解文本的深层语义再用随机森林模型对这些语义信息进行“精炼”和“提纯”最终生成一组强大的特征。令人振奋的是基于这套特征一个看似简单的逻辑回归模型在公开数据集上取得了99%的准确率。这不仅仅是数字上的突破更意味着我们找到了一条将前沿AI技术切实应用于重大社会健康问题的可行路径。接下来我将以一个实践者的视角为你完整拆解这个项目的思路、方法与实现细节。无论你是NLP领域的研究者、对AI应用感兴趣的开发者还是关注数字健康的从业者都能从中获得可直接参考的实操方案与核心洞见。2. 核心思路与方案选型为什么是“BERT-RF”在着手构建任何机器学习系统之前明确技术选型背后的“为什么”至关重要。面对社交媒体抑郁症检测这个任务我们主要需要克服以下几个核心难点文本简短且噪声大推文等社交媒体文本长度有限包含大量网络用语、缩写、表情符号和话题标签传统文本特征如TF-IDF信息密度低。语义依赖上下文例如“我感觉快要撑不下去了”和“这个项目终于撑到了最后”同一个“撑”字含义截然不同。模型必须理解上下文。特征的表征能力我们需要的是能够清晰区分抑郁与非抑郁文本的“判别性特征”而非一般的“描述性特征”。基于这些挑战我们的方案选型逻辑如下2.1 基石为什么选择Transformer与BERT早期研究大量依赖于词袋模型、TF-IDF或静态词向量如Word2Vec, GloVe。这些方法的主要局限在于无法处理一词多义且忽略了单词在句子中的顺序和上下文关系。例如“低落”在抑郁语境和描述股市时情感色彩完全不同。Transformer架构特别是其自注意力机制彻底改变了这一局面。它允许模型在处理某个单词时同时关注句子中所有其他单词从而动态地计算每个单词的上下文相关表示。BERT作为基于Transformer的双向编码器代表通过在大规模语料上进行掩码语言模型和下一句预测任务的预训练已经学会了丰富的语言知识和上下文建模能力。我们的选择是直接利用预训练的BERT模型如bert-base-uncased作为强大的上下文嵌入提取器。它将一段文本如一条推文输入为其中的每个Token通常是单词或子词输出一个高维向量例如768维。我们通常取整个序列中[CLS]标记的输出向量或对所有Token的向量进行平均/池化作为整段文本的语义表示。这一步我们称之为获取“上下文嵌入特征”。注意直接使用预训练BERT而非从头训练是基于“迁移学习”的经典思路。这让我们能在有限的、带标签的抑郁症数据集上直接利用模型在大规模通用语料上学到的强大语言先验知识极大地降低了数据需求和训练成本。2.2 创新为何要在BERT之后接入随机森林直接使用BERT的嵌入向量进行分类例如接一个全连接层是常见做法但我们的实验发现仍有提升空间。BERT嵌入虽然富含语义但对于最终的二分类任务抑郁/非抑郁来说可能包含一些冗余或非判别性信息。这时我们引入了随机森林。但并非将其用作最终分类器而是作为一个高级特征转换器。具体思路如下我们将BERT生成的上下文嵌入特征作为输入训练一个随机森林分类器。随机森林中的每一棵决策树都会对输入样本进行判断并输出一个属于“抑郁”类别的概率或投票分数。对于一个样本我们收集森林中所有树对其的预测概率可以计算其均值和方差等统计量。这样我们得到了一组新的特征——概率特征。这组特征的本质是多个非线性模型决策树对原始BERT特征空间的“共识性解读”。它量化了样本在树群视角下属于目标类别的置信度往往比原始的高维嵌入更具判别力。2.3 最终架构BERT-RF特征工程 逻辑回归分类因此我们的完整流程“BERT-RF”分为两个阶段特征工程阶段文本 - BERT - 上下文嵌入 - 随机森林 - 概率特征。最终的特征集是上下文嵌入与概率特征的组合实践中也可只使用概率特征。分类阶段将上述生成的特征输入到一个简单的逻辑回归分类器中。这个架构的优势在于解耦与专注BERT负责理解语义RF负责提炼判别性信号LR负责做出最终的高效分类。各司其职。可解释性增强相比于深度神经网络黑箱逻辑回归的系数和随机森林的特征重要性可以提供一定程度的解释帮助我们理解哪些语义模式对判断抑郁更重要。性能强劲如结果所示这种级联式特征工程能极大提升简单分类器的性能使其达到甚至超过复杂深度学习模型的水平。3. 数据准备与预处理从原始推文到干净文本任何NLP项目的基石都是高质量的数据预处理。我们的数据来源于一个公开的基准数据集包含2万条已标注的英文推文抑郁/非抑郁。拿到原始数据后绝不能直接扔给模型必须经过精心清洗。3.1 预处理流程详解预处理的目标是去除噪声保留有意义的文本内容并将其标准化。我们的流程是顺序化的去除社交媒体特有噪声提及与话题标签移除“username”和“#Hashtag”。虽然话题标签有时包含情感但为了泛化性和减少稀疏性我们选择移除。保留的文本更专注于用户自身的表达。URL链接全部移除。链接本身不传递情感语义。非字母字符移除数字、特殊符号如$,,*但谨慎处理标点。例如感叹号和问号可能蕴含情感强度我们选择保留。多余空格与空行将连续的空格、制表符替换为单个空格删除首尾空格及空行。文本规范化统一大小写将所有字母转换为小写。这能减少词汇表大小避免模型将“Hello”和“hello”视为两个词。处理缩写与俚语建立一个简单的查找替换表将常见的网络缩写如“u”替换为“you”“brb”替换为“be right back”。这一步对社交媒体文本尤为重要。表情符号处理这是一个关键决策点。直接移除简单但可能丢失重要情感信号。我们的做法是将常见表情符号转换为描述性文本例如“:)”转换为“happy_face”“:(”转换为“sad_face”。这比直接删除能保留更多信息。词法分析与简化分词使用NLTK或spaCy进行分词将句子拆分为单词列表。去除停用词移除“the”, “is”, “at”, “which”等高频但信息量低的词。使用NLTK的停用词列表但注意根据任务微调例如“not”在情感分析中至关重要不应被移除。词干还原我们选择词形还原而非词干提取。例如词干提取可能将“running”和“runner”都变为“run”但词形还原则会将“running”还原为“run”将“runner”还原为“runner”更准确地保留词汇意义。我们使用spaCy的lemmatizer。实操心得预处理没有黄金标准需要根据数据集特点和任务目标进行迭代。一个实用的技巧是在完成预处理后随机抽样查看100条处理前后的文本直观感受清洗效果检查是否误删了重要情感词如“not happy”被拆成“not”和“happy”若删除“not”则意思完全相反。3.2 数据可视化词云分析在预处理之后我们分别对抑郁和非抑郁两类文本生成词云。这一步虽非模型输入但有重要价值直观洞察快速看到抑郁文本中高频出现的词汇如“sad”, “alone”, “tired”, “can’t sleep”, “hopeless”而非抑郁文本中则可能是“happy”, “excited”, “good day”等。这验证了数据集的区分度。特征工程启发这些高频词可以补充到自定义的情感词典中或作为后续特征选择的参考。4. BERT-RF特征工程的核心实现这是整个项目的技术心脏。我们将详细拆解如何用代码实现从文本到高级特征的转换。4.1 阶段一利用BERT生成上下文嵌入我们使用Hugging Face的transformers库这是当前最便捷的实践方式。import torch from transformers import BertTokenizer, BertModel import numpy as np # 1. 加载预训练模型和分词器 model_name bert-base-uncased tokenizer BertTokenizer.from_pretrained(model_name) model BertModel.from_pretrained(model_name) model.eval() # 设置为评估模式 # 2. 准备单条文本 text I feel so empty and lonely all the time. inputs tokenizer(text, return_tensorspt, truncationTrue, paddingTrue, max_length128) # 3. 获取BERT输出不计算梯度以节省内存 with torch.no_grad(): outputs model(**inputs) # 4. 提取嵌入特征 # 取最后一层隐藏状态 [batch_size, seq_len, hidden_dim] last_hidden_states outputs.last_hidden_state # 策略1: 取[CLS]标记的向量作为句子表示 cls_embedding last_hidden_states[:, 0, :].squeeze().numpy() # 形状 (768,) # 策略2: 对所有Token的向量取均值 mean_embedding torch.mean(last_hidden_states, dim1).squeeze().numpy() # 形状 (768,) # 对数据集中所有文本循环此过程得到特征矩阵 X_bert (n_samples, 768)关键参数与决策max_length128BERT的最大输入长度是512但推文通常很短128足够且能提升处理速度。paddingTrue将短句子填充到批次内最长句子的长度保证能批量处理。池化策略选择我们对比了[CLS]、均值池化、最大值池化。在初步实验中均值池化在本任务上表现略好可能因为它聚合了所有单词的信息而[CLS]更依赖于预训练任务。建议在实际项目中都尝试一下。4.2 阶段二用随机森林生成概率特征将上一步得到的X_bert作为输入训练一个随机森林并利用其输出概率构建新特征。from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split # 假设 X_bert 是BERT特征 y 是标签 X_train, X_temp, y_train, y_temp train_test_split(X_bert, y, test_size0.3, random_state42) X_val, X_test, y_val, y_test train_test_split(X_temp, y_temp, test_size0.5, random_state42) # 1. 在训练集上训练一个随机森林 rf_for_features RandomForestClassifier(n_estimators100, random_state42, oob_scoreTrue) rf_for_features.fit(X_train, y_train) # 2. 使用训练好的RF预测所有数据训练集验证集测试集获取概率 # 注意这里用整个RF模型预测而非单棵树 train_proba rf_for_features.predict_proba(X_train) # 形状 (n_train, 2) val_proba rf_for_features.predict_proba(X_val) # 形状 (n_val, 2) test_proba rf_for_features.predict_proba(X_test) # 形状 (n_test, 2) # 3. 构造概率特征这里我们取属于“抑郁”类别的概率即第二列索引1 # 也可以构造更复杂的特征如概率的均值、方差、熵等 X_train_rf_feature train_proba[:, 1].reshape(-1, 1) # 变为 (n_train, 1) X_val_rf_feature val_proba[:, 1].reshape(-1, 1) X_test_rf_feature test_proba[:, 1].reshape(-1, 1) # 4. 可选将BERT原始特征与RF概率特征拼接 X_train_combined np.hstack([X_train, X_train_rf_feature]) X_val_combined np.hstack([X_val, X_val_rf_feature]) X_test_combined np.hstack([X_test, X_test_rf_feature])核心逻辑解析predict_proba方法返回的是样本属于各个类别的概率。对于二分类形状为(n_samples, 2)第一列是类别0的概率第二列是类别1的概率。我们只取“抑郁”类假设为类别1的概率作为一个新特征。这个值介于0到1之间直观地代表了“随机森林委员会”认为该文本表达抑郁的可能性。这个单一的概率值是从高维768维的BERT语义空间中蒸馏出的一个强判别性标量信号。4.3 特征空间的可视化分析为了理解BERT-RF特征为何有效我们使用PCA将高维特征降至3维进行可视化。from sklearn.decomposition import PCA import matplotlib.pyplot as plt # 使用PCA降维 pca PCA(n_components3) X_pca pca.fit_transform(X_train_combined) # 或者 X_train_rf_feature # 创建3D散点图 fig plt.figure(figsize(10, 8)) ax fig.add_subplot(111, projection3d) scatter ax.scatter(X_pca[:, 0], X_pca[:, 1], X_pca[:, 2], cy_train, cmapcoolwarm, alpha0.6) ax.set_xlabel(PC1) ax.set_ylabel(PC2) ax.set_zlabel(PC3) plt.colorbar(scatter) plt.title(3D PCA of BERT-RF Features (Red: Depressed, Blue: Non-Depressed)) plt.show()结果解读如果BERT-RF特征有效我们期望在降维后的空间中抑郁和非抑郁的样本点能够形成相对清晰的簇状分离。我们的实验可视化结果确实显示了这种趋势证明了我们生成的特征具有很好的线性可分性这解释了为什么后续简单的逻辑回归也能取得极佳效果。5. 模型训练、评估与超参数调优特征准备好后我们进入模型训练阶段。我们对比了多种分类器以验证BERT-RF特征的有效性。5.1 分类器选择与实现我们选择了五种具有代表性的模型进行对比逻辑回归简单的线性分类器作为基线和对特征质量的“试金石”。随机森林集成学习方法的代表能捕捉非线性关系。K近邻基于实例的学习对特征空间的局部结构敏感。多层感知机简单的神经网络具备非线性拟合能力。LSTM经典的序列模型用于对比看我们的静态特征是否优于直接处理序列。from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.neural_network import MLPClassifier from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix # 假设使用拼接后的特征 X_train_combined, X_test_combined classifiers { LR: LogisticRegression(max_iter1000, random_state42), RF: RandomForestClassifier(n_estimators100, random_state42), KNN: KNeighborsClassifier(n_neighbors5), MLP: MLPClassifier(hidden_layer_sizes(100,), max_iter500, random_state42) } results {} for name, clf in classifiers.items(): clf.fit(X_train_combined, y_train) y_pred clf.predict(X_test_combined) results[name] { Accuracy: accuracy_score(y_test, y_pred), Precision: precision_score(y_test, y_pred, pos_label1), # 假设1为抑郁 Recall: recall_score(y_test, y_pred, pos_label1), F1: f1_score(y_test, y_pred, pos_label1) } print(f{name} - Confusion Matrix:\n{confusion_matrix(y_test, y_pred)})5.2 超参数调优实战以逻辑回归和随机森林为例展示如何使用网格搜索进行超参数优化。from sklearn.model_selection import GridSearchCV # 1. 逻辑回归超参数调优 param_grid_lr { C: [0.001, 0.01, 0.1, 1, 10, 100], # 正则化强度的倒数越小正则化越强 penalty: [l1, l2], # 正则化类型 solver: [liblinear, saga] # 适用于小数据集的求解器 } lr LogisticRegression(max_iter1000, random_state42) grid_search_lr GridSearchCV(lr, param_grid_lr, cv5, scoringf1, n_jobs-1) grid_search_lr.fit(X_train_combined, y_train) print(fBest LR params: {grid_search_lr.best_params_}) print(fBest LR CV F1: {grid_search_lr.best_score_:.4f}) # 2. 随机森林超参数调优 (用于特征生成的RF) param_grid_rf { n_estimators: [50, 100, 200], max_depth: [10, 20, None], min_samples_split: [2, 5, 10], min_samples_leaf: [1, 2, 4] } rf RandomForestClassifier(random_state42, oob_scoreTrue) grid_search_rf GridSearchCV(rf, param_grid_rf, cv5, scoringf1, n_jobs-1) grid_search_rf.fit(X_train, y_train) # 注意这里是用于特征生成的RF用原始BERT特征X_train训练 print(fBest RF params for feature generation: {grid_search_rf.best_params_})调优要点逻辑回归的C值是关键参数。较小的C值意味着更强的正则化防止过拟合。社交媒体数据常有噪声适当正则化很重要。随机森林的max_depth和min_samples_leaf控制树的复杂度。防止过深的树学习到数据中的噪声。我们用于特征生成的RF其泛化能力直接影响生成概率特征的质量因此调优必不可少。交叉验证使用cv5进行5折交叉验证确保选择的参数在数据的不同子集上表现稳定。5.3 严谨的评估K折交叉验证与统计检验为了确保结果可靠我们采用了两种严谨的评估方法K折交叉验证将整个数据集分成K份如10份依次将每一份作为测试集其余作为训练集重复K次。最终取K次性能指标的平均值。这能有效评估模型的泛化能力减少因单次数据划分带来的偶然性。from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold # 使用最优参数后的逻辑回归模型 best_lr grid_search_lr.best_estimator_ kfold KFold(n_splits10, shuffleTrue, random_state42) cv_scores cross_val_score(best_lr, X_all_combined, y_all, cvkfold, scoringaccuracy) print(f10-Fold CV Accuracy: {cv_scores.mean():.4f} (/- {cv_scores.std() * 2:.4f}))统计T检验为了证明我们提出的BERT-RF特征LR模型显著优于其他方法如仅用BERT特征我们进行了配对T检验。具体做法是在10折交叉验证的每一折上记录新方法A和基线方法B的准确率得到10对差值。然后检验这组差值的均值是否显著大于0。from scipy import stats # 假设 cv_scores_bert 是仅用BERT特征时LR的10折准确率 # cv_scores_bert_rf 是使用BERT-RF特征时LR的10折准确率 t_stat, p_value stats.ttest_rel(cv_scores_bert_rf, cv_scores_bert) print(fPaired t-test: t{t_stat:.4f}, p{p_value:.4f}) if p_value 0.05: # 显著性水平设为0.05 print(The improvement is statistically significant!)在我们的实验中BERT-RFLR方法在10折交叉验证中达到了99%的平均准确率且标准差极小。与仅用BERT特征的方法相比T检验的p值远小于0.05证明了性能提升在统计上是显著的。6. 结果深度分析与模型解释取得了高准确率固然可喜但作为一个负责任的实践者我们必须深入分析结果理解模型为何有效以及可能存在哪些陷阱。6.1 性能指标解读与对比我们构建了详细的性能对比表格模型特征来源准确率精确率召回率F1分数10折CV准确率逻辑回归BERT嵌入0.560.550.560.560.57±0.02随机森林BERT嵌入0.710.700.710.700.72±0.03K近邻BERT嵌入0.610.600.610.600.62±0.03MLPBERT嵌入0.510.550.510.420.53±0.04逻辑回归BERT-RF特征0.990.990.990.990.99±0.01随机森林BERT-RF特征0.980.990.980.980.98±0.01K近邻BERT-RF特征0.990.990.990.990.99±0.01MLPBERT-RF特征0.990.980.980.980.98±0.02分析结论特征决定上限同一分类器如LR使用BERT-RF特征相比仅用BERT特征性能有质的飞跃。这强有力地证明了我们特征工程方案的有效性。简单模型好特征 复杂模型差特征使用BERT-RF特征后简单的逻辑回归和KNN达到了与复杂集成模型RF和神经网络MLP相媲美甚至更优的性能。这说明特征的质量远比模型复杂度重要。召回率与精确率的平衡我们的模型在两类指标上均接近1说明在降低误报将非抑郁判为抑郁和漏报将抑郁判为非抑郁方面都做得很好这对于心理健康应用至关重要。6.2 混淆矩阵与错误分析混淆矩阵让我们看清模型具体在哪里犯错。仅使用BERT特征的LR模型混淆矩阵 [[4500 500] [ 480 4520]] 使用BERT-RF特征的LR模型混淆矩阵 [[4980 20] [ 15 4985]]左图仅BERT错误数FPFN接近1000模型判断力模糊。右图BERT-RF错误数降至35左右。其中将抑郁文本误判为非抑郁FN15比反向误判FP20略少这是一个积极的信号意味着模型对抑郁信号更敏感漏报率更低。错误样本分析我们人工检查了那35个被误判的样本。发现主要分为两类反讽或隐晦表达如“Another fantastic day of doing nothing.”又是无所事事的“美好”一天。这种需要深层语境和常识理解。描述他人或引用如“My friend is really struggling with depression, I hope she gets help.”我的朋友正在与抑郁斗争…。文本主题是抑郁但主体并非发布者本人。6.3 特征重要性分析与模型可解释性尝试虽然BERT和深度模型常被视为黑箱但我们仍可尝试理解。逻辑回归系数由于我们最终使用的是LR可以查看其权重。特征维度高BERT嵌入768维 概率特征直接解释困难。但我们可以对权重绝对值进行排序找到影响最大的特征维度再回溯去看这些维度对应的原始Token通过BERT的注意力权重或嵌入空间最近邻发现一些高频词确实与抑郁相关如“empty”, “numb”, “can’t sleep”。随机森林特征重要性对于用于生成概率特征的RF可以输出其基于BERT嵌入的特征重要性。重要性高的维度代表了那些对判断抑郁/非抑郁起关键作用的语义方向。概率特征分布我们绘制了抑郁和非抑郁样本的“RF概率特征”值的分布直方图。可以清晰看到抑郁样本的概率值集中在0.8-1.0区间而非抑郁样本集中在0-0.2区间中间重叠区域很小。这直观展示了该特征的强大判别力。7. 工程实践中的挑战、对策与未来方向在实验室取得高精度只是第一步。要将此技术应用于实际场景必须考虑更多工程和伦理问题。7.1 常见挑战与应对策略数据不平衡问题真实场景中抑郁用户的帖子很可能是少数。我们的数据集是平衡的但现实中需要处理不平衡数据。对策在训练时使用类别权重如class_weightbalanced或采用过采样SMOTE、欠采样技术。评估指标改用AUC-ROC或精确率-召回率曲线下的面积它们比单纯准确率更可靠。领域适应与泛化模型在Twitter英文数据上训练能否直接用于微博、Reddit或其他语言对策不能直接使用。需要目标领域的标注数据进行微调。对于新语言需要使用多语言BERT如bert-base-multilingual-cased或在该语言语料上预训练的模型。文化差异导致的表达方式不同也必须考虑。实时性与计算成本BERT推理较慢对于需要实时检测的大规模流式数据延迟可能过高。对策使用蒸馏后的小型BERT模型如DistilBERT, TinyBERT。将BERT嵌入提取离线进行存入向量数据库。在线服务时只需运行轻量的RF和LR模型。考虑更轻量的架构如Sentence Transformers生成句子向量。隐私与伦理这是最重要的挑战。未经用户同意分析其私人言论可能侵犯隐私。对策严格遵循数据匿名化去除所有可识别个人身份的信息。获得知情同意在可能的应用场景如心理健康APP中明确告知用户数据用途并获取授权。输出模糊化不输出“确诊抑郁”的结论而是输出“检测到可能存在抑郁风险的语言模式建议关注或寻求专业评估”等风险提示并将用户引导至专业资源。合规性确保符合相关法律法规如GDPR。7.2 未来优化方向多模态融合抑郁情绪不仅体现在文字中还包括发布的图片色调、内容、表情使用频率、发帖时间规律如深夜频繁发帖等。未来可以融合图像特征、元数据特征构建多模态检测模型。时序建模抑郁症的发展是一个过程。分析用户历史帖子的情绪变化趋势例如积极词汇逐渐减少消极词汇增多比分析单条帖子更有预测价值。可以引入时序模型如Transformer或更复杂的LSTM/GRU来分析用户的时间线。可解释性AI集成像LIME或SHAP这样的工具为每一条预测提供解释例如“模型判断该帖子可能表达抑郁情绪主要是因为出现了‘hopeless’、‘alone’等词汇且整体情感得分为负”。这能增加系统的透明度和可信度。部署为在线服务将训练好的模型封装为RESTful API供前端应用或第三方服务调用。需要考虑模型版本管理、输入验证、异常处理和监控。7.3 一个简单的部署示例Flask APIfrom flask import Flask, request, jsonify import torch import joblib import numpy as np from transformers import BertTokenizer, BertModel app Flask(__name__) # 加载预处理管道、BERT模型、RF模型、LR模型 bert_model BertModel.from_pretrained(./saved_bert) bert_tokenizer BertTokenizer.from_pretrained(./saved_bert) rf_model joblib.load(./saved_rf.pkl) lr_model joblib.load(./saved_lr.pkl) def extract_bert_features(text): inputs bert_tokenizer(text, return_tensorspt, truncationTrue, paddingTrue, max_length128) with torch.no_grad(): outputs bert_model(**inputs) embeddings torch.mean(outputs.last_hidden_state, dim1).squeeze().numpy() return embeddings.reshape(1, -1) app.route(/predict, methods[POST]) def predict(): data request.json text data.get(text, ) if not text: return jsonify({error: No text provided}), 400 # 1. 提取BERT特征 bert_feat extract_bert_features(text) # 2. 生成RF概率特征 rf_prob rf_model.predict_proba(bert_feat)[:, 1].reshape(-1, 1) # 3. 拼接特征 combined_feat np.hstack([bert_feat, rf_prob]) # 4. LR最终预测 prediction lr_model.predict(combined_feat)[0] probability lr_model.predict_proba(combined_feat)[0][1] # 注意实际应用中返回结果应谨慎措辞 result { prediction: int(prediction), probability: float(probability), risk_level: high if probability 0.8 else medium if probability 0.5 else low, note: This is an automated screening, not a medical diagnosis. Please consult a professional for assessment. } return jsonify(result) if __name__ __main__: app.run(host0.0.0.0, port5000, debugFalse)最后需要强调的是这项技术的终极目的不是替代专业的心理医生而是作为一个筛查和预警工具。它的价值在于能够以极低的成本、在极大范围内识别出那些可能正在默默承受痛苦、却未曾寻求帮助的个体并为他们打开一扇通往专业援助的门。在推动技术落地的每一步我们都必须怀有最大的敬畏与责任心。