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 频率,这正是我想要得到的。
归档时间: |
|
查看次数: |
601 次 |
最近记录: |