机器学习算法需要作用于数据, 用来训练算法模型. 数据集通常是以纯文本文件存储的表格数据, 文件的每一行是一条数据记录, 每条记录由多列组成, 列之间用分隔符 (一般是逗号,) 分开, 例如前面用到过的鸢尾花数据集.
在 ML.NET 中, 使用 TextLoader 将文本文件导入到数据集. 使用方式如下:
new TextLoader(filePath).CreateFrom<TInput>()
filePath 是数据集文件路径. TInput 是数据类, 数据类中的每个属性对应数据集文件中的一列, 属性使用 ColumnAttribute 匹配指定源列的索引, 例如:
- [Column("0")]
- public float SepalLength;
CreateFrom 方法包含多个参数, 用于指定如何处理文本:
useHeader: 文件第一行是否为列名, 默认为 false
separator: 列分隔符, 默认是制表符 \ t
allowQuotedStrings: 列值是否是有引号字符串, 默认是 true, 例如 "ABC" 实际值是 ABC, 不包含引号
trimWhitespace: 是否去除列值结尾空白, 默认是 false, 例如 "ABC" 实际值的长度是 4, 包含一个空格
示例程序
假设有一个数据集 test-data.txt, 包含 1 列 Id 和一列文本数据, 列名分别是 Col1 和 Col2, 文件内容如下:
- "Col1","Col2"
- 1,"包含逗号和结尾空格,"
2, 包含逗号,
3, 包含结尾空格
创建对应的数据类, 数据类属性名可以不和列名一致, 只要索引对应就可以了:
- public class TestData
- {
- [Column("0")]
- public float ID;
- [Column("1")]
- public string Text;
- }
创建 TextLoader:
- var loader = new Microsoft.ML.Data.TextLoader("test-data.txt").CreateFrom<TestData>(
- useHeader: true,
- separator: ',',
- allowQuotedStrings: true,
- trimWhitespace: true);
接着我们载入数据集:
- using (var environment = new TlcEnvironment())
- {
- var experiment = environment.CreateExperiment();
- var output = loader.ApplyStep(null, experiment) as ILearningPipelineDataStep;
- experiment.Compile();
- loader.SetInput(environment, experiment);
- experiment.Run();
- var data = experiment.GetOutput(output.Data);
- using (var cursor = data.GetRowCursor((a => true)))
- {
- var IDGetter = cursor.GetGetter<float>(0);
- var TextGetter = cursor.GetGetter<DvText>(1);
- while(cursor.MoveNext())
- {
- float ID = 0;
- IDGetter(ref ID);
- DvText Text = new DvText();
- TextGetter(ref Text);
- Console.WriteLine($"ID:{ID},Text:\"{Text}\",Text 长度为{Text.Length}");
- }
- }
- }
最后的输出结果:
ID:1,Text:"包含逗号和结尾空格,",Text 长度为 11
ID:2,Text:"包含逗号",Text 长度为 4
ID:3,Text:"包含结尾空格",Text 长度为 6
第一行列名被过滤.
第二行的文本列用引号引着, 结果是原样输出.
第三行的文本列虽然有逗号, 但是作为了分隔符.
第四行的文本列的结尾空白被去除.
来源: https://www.cnblogs.com/feiyun0112/p/ML-NET-3.html