如何使用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
相关产品推荐
相关产品推荐

