You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用ML.NET对给定文本进行多标签预测?

实现ML.NET多标签文本分类

我需要对给定文本(比如邮件主题)做多标签分类,比如输入“我需要电脑方面的帮助”时,能同时返回“IT”和“support”两个标签。但目前只能实现单标签分类,不知道怎么修改代码支持多标签,现有核心代码如下:

static PredictionEngine<EmailSubject, DepartmentPrediction> _predictionEngine;

public class EmailSubject
{
    [LoadColumn(0)]
    public string Subject { get; set; }
    [LoadColumn(1)]
    public string Department { get; set; }
}

public class DepartmentPrediction
{
    [ColumnName("PredictedLabel")]
    public string? Deaprtment { get; set; }
}

解决方案

  • 调整数据模型
    单标签场景下的Department字段仅存储单个标签,多标签需要改为存储用分隔符(如逗号)拼接的标签字符串,后续加载后再拆分。修改EmailSubject类:

    public class EmailSubject
    {
        [LoadColumn(0)]
        public string Subject { get; set; }
        [LoadColumn(1)]
        public string Labels { get; set; } // 示例值:"IT,support"
    }
    
  • 重构预测输出类
    多标签预测需要返回所有标签的置信度,并筛选出达标结果。新增标签-分数映射类,再扩展预测类:

    public class LabelScore
    {
        public string Label { get; set; }
        public float Score { get; set; }
    }
    
    public class DepartmentPrediction
    {
        [ColumnName("Score")]
        public float[]? Scores { get; set; }
        public IEnumerable<string>? AllLabels { get; set; }
    
        // 自动筛选置信度>0.5的标签,阈值可按需调整
        public IEnumerable<string> PredictedLabels => AllLabels?.Zip(Scores ?? Array.Empty<float>(), (label, score) => new { label, score })
            .Where(item => item.score > 0.5f)
            .Select(item => item.label) ?? Enumerable.Empty<string>();
    }
    
  • 修改训练Pipeline
    多标签分类可采用一对多(OneVsRest)策略,基于二分类模型扩展。调整训练流程:

    var mlContext = new MLContext();
    
    // 加载训练数据时,先将标签列转换为键类型
    var data = mlContext.Data.LoadFromTextFile<EmailSubject>("train-data.csv", separatorChar: ',');
    var labelMapping = mlContext.Data.MapValueToKey("LabelKey", nameof(EmailSubject.Labels));
    
    var pipeline = mlContext.Transforms.Text.FeaturizeText("Features", nameof(EmailSubject.Subject))
        .Append(mlContext.MulticlassClassification.Trainers.OneVsRest(
            mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(),
            labelColumnName: "LabelKey"))
        .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
    
    var model = pipeline.Fit(labelMapping);
    _predictionEngine = mlContext.Model.CreatePredictionEngine<EmailSubject, DepartmentPrediction>(model);
    
    // 保存所有标签列表到预测引擎的上下文(或直接硬编码已知标签)
    var labelNames = mlContext.Data.GetColumn<string>(labelMapping, nameof(EmailSubject.Labels)).Distinct().ToList();
    // 可通过扩展方法或自定义逻辑将labelNames传入_predictionEngine的预测类实例
    
  • 执行多标签预测
    调用预测方法后,直接通过PredictedLabels获取匹配的标签集合:

    var input = new EmailSubject { Subject = "我需要电脑方面的帮助" };
    var prediction = _predictionEngine.Predict(input);
    var matchedLabels = prediction.PredictedLabels; // 输出:["IT", "support"]
    

内容的提问来源于stack exchange,提问作者coolblue2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 10:04:53