在自然语言处理(NLP)领域,文本分类是一项至关重要的任务,其应用范围涵盖医疗保健、客户支持和日志分析等多个领域。当拥有手动标记的文本数据时,训练一个监督分类模型能够显著提升自动化水平和决策效率。本文将深入探讨如何利用ClearScape的ONNXEmbeddingsBYOM(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.DataFramegroupbyagg 函数,我们可以轻松地在数据库内部完成这些统计任务,避免将大量数据导出到本地进行处理。

通过对数据的初步分析,我们发现数据集并不完全平衡,但每个疾病类型仍然有足够的样本用于训练一个可靠的分类模型。

五、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库绘制柱状图,展示预测概率。

该应用的核心逻辑如下:

  1. 用户输入医学摘要。
  2. 应用调用get_query函数生成SQL查询,该查询使用ONNXEmbeddings函数生成文本嵌入向量,并使用ONNXPredict函数进行预测。
  3. 应用执行SQL查询,并将结果返回给用户。
  4. 应用使用create_bar_chart函数将预测结果绘制成柱状图,并显示给用户。

通过该应用,医生可以快速评估患者的病情,从而辅助医疗诊断。

十一、总结与展望

本文介绍了如何利用ClearScape的ONNXEmbeddingsBYOM框架实现高效的文本分类,并通过医学摘要分类这一实际案例进行了详细演示。通过使用ONNXEmbeddings,我们可以高效地生成文本嵌入向量,并通过使用BYOM,我们可以灵活地部署和管理机器学习模型。通过将文本分类技术应用于医疗领域,我们可以辅助医生进行医疗诊断,从而提高医疗效率和质量。

在未来,我们可以进一步探索以下方向:

  • 尝试使用更先进的文本嵌入模型,例如Transformer模型,从而提高分类的准确性。
  • 探索使用其他类型的机器学习模型,例如深度学习模型,从而进一步提高分类的性能。
  • 将文本分类技术与其他医疗数据相结合,例如患者的病历数据,从而构建更全面的医疗诊断系统。
  • 针对“一般病理条件”类别,尝试细化分类标准,或引入更多领域知识,提升该类别的分类准确率。
  • 探索如何在资源受限的环境下优化ONNXEmbeddings的性能,例如通过模型量化或知识蒸馏等技术。

通过不断的技术创新和应用探索,我们可以将文本分类技术应用于更多的领域,从而为社会创造更大的价值。 本文的全部代码已上传至GitHub,欢迎大家尝试并提出宝贵意见。希望这篇文章能够帮助您更好地理解ONNXEmbeddingsBYOM,并在实际项目中应用文本分类技术。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注