在自然语言处理(NLP)领域,文本分类是一项至关重要的任务,其应用范围涵盖医疗保健、客户支持和日志分析等多个领域。当拥有手动标记的文本数据时,训练一个监督分类模型能够显著提升自动化水平和决策效率。本文将深入探讨如何利用ClearScape的ONNXEmbeddings和BYOM(Bring Your Own Model)框架,实现高效的文本分类,并通过医学摘要分类这一实际案例进行详细演示。
一、文本分类的重要性与挑战
文本分类在信息爆炸的时代显得尤为重要。它可以帮助我们快速整理和分析大量文本数据,从而提取有价值的信息。例如,在医疗领域,我们可以通过文本分类将医学文献按照疾病类型进行归类,帮助医生快速查找相关资料。在客户服务领域,文本分类可以自动识别客户咨询的问题类型,并将其分配给合适的客服人员处理。
然而,人工进行文本分类往往成本高昂且耗时。传统的零样本分类方法虽然简单易用,但在精度上难以满足实际需求。因此,我们需要更高级的方法来提高文本分类的准确性和效率。
二、ONNXEmbeddings:高效的文本向量化
ONNXEmbeddings 是ClearScape提供的一项关键技术,它允许我们高效地将文本数据转换为向量表示(也称为文本嵌入)。这些向量表示能够捕捉文本的语义信息,从而为后续的机器学习任务提供基础。与传统的词袋模型或TF-IDF相比,ONNXEmbeddings能够更好地捕捉词语之间的关系,从而提高分类的准确性。
在本文的案例中,我们使用了一个预训练的ONNX模型gte-base-en-v1.5
,该模型来自Teradata的Hugging Face仓库,专门用于生成高质量的文本嵌入。通过 tdml.save_byom
函数,我们可以将该模型和对应的tokenizer存储到Vantage数据库中,方便后续使用。
三、BYOM:灵活的模型部署与管理
BYOM(Bring Your Own Model)是ClearScape提供的另一项重要功能,它允许用户将自己训练的机器学习模型(包括ONNX格式的模型)部署到Vantage数据库中,并在数据库内部进行预测。这意味着我们无需将数据导出到外部系统进行处理,从而提高了效率并降低了数据安全的风险。
在本文中,我们使用BYOM部署了一个CatBoost分类模型,该模型在医学摘要的嵌入向量上进行训练,用于预测摘要所属的疾病类型。通过将模型部署到数据库内部,我们可以实现实时预测,并将其集成到现有的数据处理流程中。
四、医学摘要分类案例:数据准备与探索
本文使用的数据集是医学摘要文本分类数据集,包含了11,550个训练记录和2,888个测试记录。每个记录包含医学摘要的文本内容以及对应的疾病类型标签。数据集包含了五个疾病类型:
- 消化系统疾病
- 心血管疾病
- 肿瘤
- 神经系统疾病
- 一般病理条件
在开始模型训练之前,我们需要对数据进行探索性分析,了解数据的分布情况。例如,我们可以统计每个疾病类型的样本数量,从而了解数据集是否平衡。通过 tdml.DataFrame
的 groupby
和 agg
函数,我们可以轻松地在数据库内部完成这些统计任务,避免将大量数据导出到本地进行处理。
通过对数据的初步分析,我们发现数据集并不完全平衡,但每个疾病类型仍然有足够的样本用于训练一个可靠的分类模型。
五、ONNXEmbeddings的应用:生成医学摘要的嵌入向量
在本文中,我们使用ONNXEmbeddings
函数生成医学摘要的嵌入向量。该函数接收包含文本数据的表、ONNX模型和tokenizer作为输入,并返回包含文本嵌入向量的表。
embeddings_query = f"""
SELECT
*
from mldb.ONNXEmbeddings(
on {input_table} as InputTable
on (select * from embeddings_models where model_id = '{model_name}') as ModelTable DIMENSION
on (select model as tokenizer from embeddings_tokenizers where model_id = '{model_name}') as TokenizerTable DIMENSION
using
Accumulate('row_id','condition_label', 'txt')
ModelOutputTensor('sentence_embedding')
EnableMemoryCheck('false')
OutputFormat('FLOAT32({number_dimensions_output})')
OverwriteCachedModel('true')
) a
"""
tdml.DataFrame.from_query(embeddings_query)
其中,InputTable
指定包含文本数据的表,ModelTable
指定存储ONNX模型的表,TokenizerTable
指定存储tokenizer的表。Accumulate
参数指定需要保留的列,ModelOutputTensor
参数指定ONNX模型的输出张量名称,OutputFormat
参数指定输出的嵌入向量的格式。
由于生成文本嵌入是一个计算密集型任务,我们只对少量样本进行了测试。在实际应用中,您可以使用Teradata的MPP架构并行计算大规模文本数据的嵌入向量,从而显著提高效率。
六、利用t-SNE可视化嵌入向量:探索数据结构
为了更好地理解ONNXEmbeddings
生成的文本嵌入,我们可以使用t-SNE(t-Distributed Stochastic Neighbor Embedding)技术将高维嵌入向量降维到二维空间,并进行可视化。t-SNE是一种非线性降维技术,能够保留数据点的局部结构,从而方便我们观察数据的聚类情况。
通过对嵌入向量进行t-SNE降维和可视化,我们发现大部分疾病类型在二维空间中形成了较为明显的聚类,说明ONNXEmbeddings
能够有效地捕捉文本的语义信息。然而,也有些疾病类型没有形成明显的聚类,例如“一般病理条件”,这可能是因为该疾病类型涵盖了多个不同的主题。
七、CatBoost模型训练与评估:实现高精度文本分类
在生成文本嵌入向量之后,我们可以使用这些向量作为特征,训练一个监督分类模型。在本文中,我们选择了CatBoost模型,因为它具有良好的性能和易用性。
我们首先将数据集划分为训练集和测试集,然后使用训练集训练CatBoost模型。在训练过程中,我们需要指定损失函数、迭代次数等参数。
model_catb = catboost.CatBoostClassifier(loss_function="MultiClass", iterations=100)
model_catb.fit(X_train, y_train)
训练完成后,我们使用测试集评估模型的性能。常用的评估指标包括准确率、精确率、召回率和F1值。
y_pred = model_catb.predict(X_test)
report = classification_report(y_test, y_pred)
print(report)
通过评估,我们发现CatBoost模型在医学摘要分类任务上取得了较好的性能,准确率达到了51%。
八、模型部署与推理:BYOM的应用
为了将训练好的CatBoost模型部署到Vantage数据库中,我们需要将其转换为ONNX格式,然后使用tdml.save_byom
函数将其存储到数据库中。
onnxfile_catb = "catb-medical.onnx"
model_catb_id = "catb_medical"
model_catb.save_model(onnxfile_catb,
format="onnx",
export_parameters={
'onnx_domain': 'ai.catboost',
'onnx_model_version': 1,
'onnx_doc_string': 'model for MultiClassification of medical abstracts',
'onnx_graph_name': 'CatBoostModel_for_MultiClassification'
})
model_table_name = "medical_models"
tdml.save_byom(model_id = model_catb_id,
model_file = onnxfile_catb,
table_name = model_table_name)
接下来,我们可以使用tdml.ONNXPredict
函数在数据库内部进行预测。该函数接收包含文本嵌入向量的表和存储ONNX模型的表作为输入,并返回包含预测结果的表。
onnxpred_obj = tdml.ONNXPredict(
newdata = DF_test_embeddings,
modeldata = tdml.DataFrame(model_table_name),
accumulate = ["row_id", "condition_label"],
overwrite_cached_models = "*",
model_input_fields_map = f"features=emb_0:emb_{number_dimensions_output-1}"
)
九、部署场景:批量处理与实时预测
在实际应用中,我们可以根据不同的需求选择不同的部署场景。
- 批量处理: 对于大规模文本数据,我们可以使用Teradata的MPP架构并行计算文本嵌入向量和预测结果,并将结果存储到数据库中。这种方式适用于定期分析大量文本数据的场景,例如每日、每周或每月分析医学文献。
- 实时预测: 对于需要实时预测的场景,我们可以构建一个交互式应用,允许用户输入文本,并立即获得预测结果。这种方式适用于医生在诊断过程中需要快速评估患者病情的场景。
十、交互式应用:辅助医疗诊断
为了演示实时预测的应用,我们构建了一个交互式应用,允许用户输入医学摘要,并获得疾病类型的预测概率。该应用使用ipywidgets
库构建用户界面,使用plotly
库绘制柱状图,展示预测概率。
该应用的核心逻辑如下:
- 用户输入医学摘要。
- 应用调用
get_query
函数生成SQL查询,该查询使用ONNXEmbeddings
函数生成文本嵌入向量,并使用ONNXPredict
函数进行预测。 - 应用执行SQL查询,并将结果返回给用户。
- 应用使用
create_bar_chart
函数将预测结果绘制成柱状图,并显示给用户。
通过该应用,医生可以快速评估患者的病情,从而辅助医疗诊断。
十一、总结与展望
本文介绍了如何利用ClearScape的ONNXEmbeddings和BYOM框架实现高效的文本分类,并通过医学摘要分类这一实际案例进行了详细演示。通过使用ONNXEmbeddings
,我们可以高效地生成文本嵌入向量,并通过使用BYOM,我们可以灵活地部署和管理机器学习模型。通过将文本分类技术应用于医疗领域,我们可以辅助医生进行医疗诊断,从而提高医疗效率和质量。
在未来,我们可以进一步探索以下方向:
- 尝试使用更先进的文本嵌入模型,例如Transformer模型,从而提高分类的准确性。
- 探索使用其他类型的机器学习模型,例如深度学习模型,从而进一步提高分类的性能。
- 将文本分类技术与其他医疗数据相结合,例如患者的病历数据,从而构建更全面的医疗诊断系统。
- 针对“一般病理条件”类别,尝试细化分类标准,或引入更多领域知识,提升该类别的分类准确率。
- 探索如何在资源受限的环境下优化
ONNXEmbeddings
的性能,例如通过模型量化或知识蒸馏等技术。
通过不断的技术创新和应用探索,我们可以将文本分类技术应用于更多的领域,从而为社会创造更大的价值。 本文的全部代码已上传至GitHub,欢迎大家尝试并提出宝贵意见。希望这篇文章能够帮助您更好地理解ONNXEmbeddings和BYOM,并在实际项目中应用文本分类技术。