如何在ml.net中获取带有tf-idf单词袋权重的词汇表?

时间:2019-03-28 21:52:22

标签: 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);

这很好,但是如何从transformed_data中获取实际结果?

我在调试器中进行了一些挖掘,但是我对这里实际发生的事情仍然感到困惑。

首先,运行管道会为transformed_data添加三列:

enter image description here

在预览数据之后,我可以看到这些列中的内容。为了使事情更清楚,这里是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>

enter image description here

转到第二个bags列,键入为Vector<Key<UInt32, 0-12>>(不知道0-12在这里是什么)。

该单词上面带有KeyValues批注,看起来每一行都将单词映射到全局 Vocabulary 数组的索引中。

enter image description here

词汇数组是Annotations的一部分:

enter image description here

这太过分了。您会认为最后一个bags列(输入为Vector<Single, 13>)将具有每个单词的权重!不幸的是,这不是我所看到的。首先,Annotations中存在相同的 Vocabulary 数组:

enter image description here

行中的值为1 / 0,这不是TfIdf应该返回的值:

enter image description here

对于我来说,它看起来更像是“当前行中的词汇中的单词i”,而不是它的TfIdf频率,这就是我想要得到的

0 个答案:

没有答案