Я новичок в машинном обучении и ML.NET. Я хочу решить задачу по идентификации столбцов Excel.
Столбцы в Excel, такие как 序号
, 编号
, 编码
, 名称
, 项目名称
, и для каждого столбца есть соответствующее имя поля, как показано ниже: <414602>>229688
Column_Field.csv
Столбец | ИмяПоля |
---|---|
序号 | КодЗаказа |
编号 | КодЗаказа |
编码 | КодЗаказа |
名称 | Имя |
项目名称 | Имя |
Каждое поле может иметь одно или несколько имен столбцов, например 序号
, 编号
, 编码
для OrdCode
. И задача состоит в том, чтобы попытаться идентифицировать или найти соответствующее имя поля для входящего столбца.
Основываясь на приведенном выше наборе данных, я использую ML.NET и хочу предсказать правильное поле для столбцов, считываемых из файла Excel.
Я использую алгоритм наивного Байеса. Код:
public class Program
{
private static readonly string _dataPath = Path.Combine(Environment.CurrentDirectory, "Data", "Column_Field.csv");
private static void Main(string[] args)
{
MLContext mlContext = new MLContext();
IDataView dataView = mlContext.Data.LoadFromTextFile<ColumnInfo>(_dataPath, hasHeader: true, separatorChar: '\t');
var pipeline = mlContext.Transforms.Conversion.MapValueToKey(inputColumnName: "Label", outputColumnName: "Label")
.Append(mlContext.Transforms.Text.FeaturizeText(outputColumnName: "Features", inputColumnName: "Column"))
.Append(mlContext.MulticlassClassification.Trainers.NaiveBayes())
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
var model = pipeline.Fit(dataView);
// evaluate
//List<ColumnInfo> dataForEvaluation = new List<ColumnInfo>()
//{
// new ColumnInfo{ Column="名称", FieldName="Name" },
// new ColumnInfo{ Column="<名称>", FieldName="Name" },
// new ColumnInfo{ Column="序号", FieldName="OrdName" },
//};
//IDataView testDataSet = mlContext.Data.LoadFromEnumerable(dataForEvaluation);
//var metrics = mlContext.MulticlassClassification.Evaluate(testDataSet);
//Console.WriteLine($"MicroAccuracy: {metrics.MicroAccuracy:P2}");
//Console.WriteLine($"MicroAccuracy: {metrics.MicroAccuracy:P2}");
// predict
var dataForPredictation = new List<ColumnInfo>();
dataForPredictation.Add(new ColumnInfo { Column = "名称" });
dataForPredictation.Add(new ColumnInfo { Column = "ABC" });
dataForPredictation.Add(new ColumnInfo { Column = "名" });
var engine = mlContext.Model.CreatePredictionEngine<ColumnInfo, Predication>(model);
foreach (var data in dataForPredictation)
{
var result = engine.Predict(data);
Console.WriteLine($"{data.Column}: \t{result.FieldName}");
}
Console.ReadLine();
}
}
public class ColumnInfo
{
[LoadColumn(0)]
public string Column { get; set; }
[LoadColumn(1), ColumnName("Label")]
public string FieldName { get; set; }
}
public class Predication
{
[ColumnName("PredictedLabel")]
public string FieldName { get; set; }
}
Однако результат не такой, как ожидалось.
Результат:
名称: OrdCode
ABC: OrdCode
名: OrdCode
Так что не так с кодом? Я предполагаю, что проблема может заключаться в отсутствии правильной обработки данных в pipeline
перед тренировкой.
Спасибо.