ML.NET 的文档展示了如何使用context.Transforms.Text.ProduceWordBags获取词袋。该方法将Transforms.Text.NgramExtractingEstimator.WeightingCriteria作为参数之一,因此可以请求使用TfIdf权重。最简单的例子是:
// Get a small dataset as an IEnumerable and then read it as a ML.NET data set.
IEnumerable<SamplesUtils.DatasetUtils.SampleTopicsData> data = SamplesUtils.DatasetUtils.GetTopicsData();
var trainData = ml.Data.LoadFromEnumerable(data);
var pipeline = ml.Transforms.Text.ProduceWordBags("bags", review, ngramLength: 1, weighting: Transforms.Text.NgramExtractingEstimator.WeightingCriteria.TfIdf);
var transformer = pipeline.Fit(trainData);
var transformed_data = transformer.Transform(trainData);
Run Code Online (Sandbox Code Playgroud)
一切都很好,但我如何得到实际结果transformed_data呢?
我在调试器中做了一些挖掘,但我仍然对这里实际发生的事情感到困惑。
首先,运行管道会添加三个额外的列transformed_data:
预览数据后,我可以看到这些列中的内容。为了让事情更清楚,这里是GetTopicsData返回的内容,这就是我们运行转换的内容:
animals birds cats dogs fish horse
horse birds house fish duck cats
car truck driver bus pickup
car truck driver bus pickup horse
Run Code Online (Sandbox Code Playgroud)
这正是我在第一bags列中看到的,输入为Vector<string>:
转到第二bags列,输入为Vector<Key<UInt32, 0-12>>(0-12顺便说一句,不知道这里是什么)。
这个上面有KeyValues注释,看起来每一行都将单词映射到全局Vocabulary数组中的索引中。
的词汇阵列的一部分Annotations:
所以这是有希望的。您会认为最后一bags列的输入方式与Vector<Single, 13>每个单词的权重相同!不幸的是,这不是我所看到的。首先,相同的Vocabulary数组存在于Annotations:
行中的值是1/ 0,这不是 TfIdf 应该返回的:
所以对我来说,这看起来更像是“当前行中是否存在i来自词汇表的单词”,而不是它的 TfIdf 频率,这正是我想要得到的。