首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问FeaturizeText in Microsoft.ML生成的n-克?

如何访问FeaturizeText in Microsoft.ML生成的n-克?
EN

Stack Overflow用户
提问于 2022-02-09 17:40:59
回答 1查看 145关注 0票数 0

我设法在Microsoft.ML中运行了第一个文本分析器,我想要找到由模型确定的ngram列表,但是我只能得到数字向量“计数”事件,而不知道它们所指的是什么。

到目前为止,以下是我工作代码的核心:

代码语言:javascript
复制
var mlContext = new MLContext();
var articles = SampleData.Articles.Select(a => new TextData{ Text=a }).ToArray();
var dataview = mlContext.Data.LoadFromEnumerable(articles);
var options = new TextFeaturizingEstimator.Options() {
  OutputTokensColumnName = "OutputTokens",
  CaseMode = TextNormalizingEstimator.CaseMode.Lower,
  KeepDiacritics = false,
  KeepPunctuations = false,
  KeepNumbers = false,
  Norm = TextFeaturizingEstimator.NormFunction.L2,
  StopWordsRemoverOptions = new StopWordsRemovingEstimator.Options() {
    Language = TextFeaturizingEstimator.Language.Dutch,
  },
  WordFeatureExtractor = new WordBagEstimator.Options() {
    NgramLength = 4,
    SkipLength = 1,
    UseAllLengths = true,
    MaximumNgramsCount = new int[] { 20, 10, 10, 10 },
    Weighting = NgramExtractingEstimator.WeightingCriteria.TfIdf,
  },
  CharFeatureExtractor = null,
};
var textPipeline = mlContext.Transforms.Text   
  .FeaturizeText("Features", options, "Text");
var textTransformer = textPipeline.Fit(dataview);
var predictionEngine = mlContext.Model.CreatePredictionEngine<TextData, TransformedTextData>(textTransformer);
foreach (var article in articles)
{
  var prediction = predictionEngine.Predict(article);
  Console.WriteLine($"Article: {article.Text.Substring(0, 30)}...");
  Console.WriteLine($"Number of Features: {prediction.Features.Length}");
  Console.WriteLine($"Features: {string.Join(",", prediction.Features.Take(50).Select(f => f.ToString("0.00")))}\n");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-10 13:35:56

嗯,我想明白了,如果有人碰到同样的问题,我想在这里分享。首先,像往常一样创建模型。注意放置Ngram步骤输出的列的名称(在我们的例子中是"ProduceNgrams")。

然后,"Schema.GetSlotNames“和"slotNames.GetValues”的组合完成了获取所需ngram的任务:

代码语言:javascript
复制
var textPipeline =
    mlContext.Transforms.Text.NormalizeText("Tokens", "Text", TextNormalizingEstimator.CaseMode.Lower, false, false, false)
    .Append(mlContext.Transforms.Text.TokenizeIntoWords("Tokens"))
    .Append(mlContext.Transforms.Text.RemoveDefaultStopWords("Tokens", language: StopWordsRemovingEstimator.Language.Dutch))
    .Append(mlContext.Transforms.Conversion.MapValueToKey("Tokens"))
    .Append(mlContext.Transforms.Text.ProduceNgrams("NgramFeatures", "Tokens"))
    .Append(mlContext.Transforms.Text.LatentDirichletAllocation("LDAFeatures", "NgramFeatures", 
      numberOfTopics: 10
    ))
    .Append(mlContext.Transforms.NormalizeLpNorm("Features", "LDAFeatures"));

var textTransformer = textPipeline.Fit(dataview);
var transformedDataView = textTransformer.Transform(dataview);

VBuffer<ReadOnlyMemory<char>> slotNames = default;
transformedDataView.Schema["NgramFeatures"].GetSlotNames(ref slotNames);
var ngrams = slotNames.GetValues().ToArray().Select(x => x.Span.ToString()); //.Replace('|',' '));
Console.WriteLine($"Ngrams: {string.Join(", ", ngrams)}\n");

var predictionEngine = mlContext.Model.CreatePredictionEngine<TextData, TransformedTextData>(textTransformer);
var articlesWithFeatures = new List<(TextData, TransformedTextData)>();
foreach (var article in articles)
{
  var articleWithFeatures = predictionEngine.Predict(article);
  Console.WriteLine($"Article: {article.Text.Substring(0, 30)}...");
  Console.WriteLine($"Number of Features: {articleWithFeatures.Features.Length}");
  Console.WriteLine($"Features: {string.Join(",", articleWithFeatures.Features.Take(50).Select(f => f.ToString("0.00")))}\n");

  articlesWithFeatures.Add((article, articleWithFeatures));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71054258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档