如何在ml.net中为tf-idf词袋获得带权重的词汇?

Mar*_*zek 5 c# tf-idf ml.net

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 频率,这正是我想要得到的。