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);
这很好,但是如何从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
这正是我在第一行bags
列中看到的内容,其键入为Vector<string>
:
转到第二个bags
列,键入为Vector<Key<UInt32, 0-12>>
(不知道0-12
在这里是什么)。
该单词上面带有KeyValues
批注,看起来每一行都将单词映射到全局 Vocabulary 数组的索引中。
词汇数组是Annotations
的一部分:
这太过分了。您会认为最后一个bags
列(输入为Vector<Single, 13>
)将具有每个单词的权重!不幸的是,这不是我所看到的。首先,Annotations
中存在相同的 Vocabulary 数组:
行中的值为1
/ 0
,这不是TfIdf应该返回的值:
对于我来说,它看起来更像是“当前行中的词汇中的单词i
”,而不是它的TfIdf频率,这就是我想要得到的