В документации 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>
, будут веса для каждого из слов! К сожалению, это не то, что я вижу. Прежде всего, тот же массив Vocabulary присутствует в Annotations
:
И значения в строках: 1
/ 0
, что не должно возвращать TfIdf:
Так что для меня это больше похоже на "Слово i
из Словаря , присутствующее в текущем ряду", а не частоту его TfIdf, что я и пытаюсь получить.