Как получить словарь с весами для пакетов слов tf-idf в ml.net? - PullRequest
0 голосов
/ 29 марта 2019

В документации 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 аннотация на нем, и похоже, что для каждой строки он отображает слова в индексы в глобальном Словарном массиве.

enter image description here

Массив Vocabulary является частью Annotations:

enter image description here

Так что это многообещающе. Можно подумать, что в последнем столбце bags, набранном как Vector<Single, 13>, будут веса для каждого из слов! К сожалению, это не то, что я вижу. Прежде всего, тот же массив Vocabulary присутствует в Annotations:

enter image description here

И значения в строках: 1 / 0, что не должно возвращать TfIdf:

enter image description here

Так что для меня это больше похоже на "Слово i из Словаря , присутствующее в текущем ряду", а не частоту его TfIdf, что я и пытаюсь получить.

...