Sdílet prostřednictvím


Kurz: Analýza mínění recenzí filmů pomocí předem natrénovaného modelu TensorFlow v ML.NET

V tomto kurzu se dozvíte, jak pomocí předem natrénovaného modelu TensorFlow klasifikovat mínění v komentářích na webu. Klasifikátor binárního mínění je konzolová aplikace jazyka C# vyvinutá pomocí sady Visual Studio.

Model TensorFlow použitý v tomto kurzu byl natrénován pomocí recenzí filmů z databáze IMDB. Jakmile aplikaci dokončíte, budete schopen zadat text recenze filmu a aplikace vám řekne, jestli má recenze pozitivní nebo negativní hodnocení.

V tomto návodu se naučíte, jak:

  • Načtení předem natrénovaného modelu TensorFlow
  • Transformace textu komentáře webu na funkce vhodné pro model
  • Použití modelu k vytvoření předpovědi

Zdrojový kód pro tento kurz najdete v úložišti dotnet/samples .

Požadavky

Nastavení

Vytvoření aplikace

  1. Vytvořte konzolovou aplikaci jazyka C# s názvem TextClassificationTF. Klikněte na tlačítko Next.

  2. Jako architekturu, která se má použít, zvolte .NET 8. Klikněte na tlačítko Vytvořit.

  3. Vytvořte adresář s názvem Data v projektu a uložte soubory datové sady.

  4. Nainstalujte balíček NuGet Microsoft.ML:

    Poznámka:

    Tato ukázka používá nejnovější stabilní verzi uvedených balíčků NuGet, pokud není uvedeno jinak.

    V Průzkumníku řešení klikněte pravým tlačítkem na projekt a vyberte Spravovat balíčky NuGet. Jako zdroj balíčku zvolte "nuget.org" a pak vyberte kartu Procházet . Vyhledejte Microsoft.ML, vyberte požadovaný balíček a pak vyberte Nainstalovat. Pokračujte v instalaci tím, že souhlasíte s licenčními podmínkami pro balíček, který zvolíte. Opakujte tyto kroky pro Microsoft.ML.TensorFlow, Microsoft.ML.SampleUtils a SciSharp.TensorFlow.Redist.

Přidání modelu TensorFlow do projektu

Poznámka:

Model pro tento kurz pochází z úložiště dotnet/machinelearning-testdata na GitHubu. Model je ve formátu TensorFlow SavedModel.

  1. Stáhněte soubor zip sentiment_model a rozbalte ho.

    Soubor ZIP obsahuje:

    • saved_model.pb: Samotný model TensorFlow. Model zpracovává celočíselné pole (velikost 600) představující text v řetězci recenze IMDB a vypíše dvě pravděpodobnosti, které se sčítají na hodnotu 1: pravděpodobnost, že vstupní recenze má pozitivní sentiment, a pravděpodobnost, že vstupní recenze má negativní sentiment.
    • imdb_word_index.csv: mapování z jednotlivých slov na celočíselnou hodnotu. Mapování se používá ke generování vstupních funkcí pro model TensorFlow.
  2. Zkopírujte obsah nejvnitřnějšího sentiment_model adresáře do adresáře projektu sentiment_model. Tento adresář obsahuje model a další podpůrné soubory potřebné pro tento kurz, jak je znázorněno na následujícím obrázku:

    obsah adresáře sentiment_model

  3. V Průzkumníku řešení klikněte pravým tlačítkem na všechny soubory v sentiment_model adresáři a podadresáři a vyberte Vlastnosti. V části Upřesnit změňte hodnotu „Kopírovat do výstupního adresáře“ na „Kopírovat, pokud je novější“.

Přidání using direktiv a globálních proměnných

  1. Na začátek souboru using přidejte následující další direktivy:

    using Microsoft.ML;
    using Microsoft.ML.Data;
    using Microsoft.ML.Transforms;
    
  2. Vytvořte globální proměnnou hned za using direktivami pro uložení uložené cesty k souboru modelu.

    string _modelPath = Path.Combine(Environment.CurrentDirectory, "sentiment_model");
    
    • _modelPath je cesta k souboru vytrénovaného modelu.

Modelování dat

Recenze filmů jsou texty volného formátu. Aplikace převede text do vstupního formátu očekávaného modelem v řadě diskrétních fází.

První je rozdělit text na samostatná slova a pomocí zadaného souboru mapování namapovat každé slovo na celé číslo kódování. Výsledkem této transformace je pole s proměnnou délkou celého čísla s délkou odpovídající počtu slov ve větě.

Vlastnictví Hodnota Typ
Text recenze tento film je opravdu dobrý řetězec
VariableLengthFeatures 14,22,9,66,78,... int[]

Pole funkce proměnné délky se pak změní na pevnou délku 600. Jedná se o délku, kterou model TensorFlow očekává.

Vlastnictví Hodnota Typ
Text recenze tento film je opravdu dobrý řetězec
VariableLengthFeatures 14,22,9,66,78,... int[]
Features 14,22,9,66,78,... int[600]
  1. Vytvořte třídu pro vstupní data v dolní části souboru Program.cs :

    /// <summary>
    /// Class to hold original sentiment data.
    /// </summary>
    public class MovieReview
    {
        public string? ReviewText { get; set; }
    }
    

    Vstupní datová třída , MovieReviewstring pro komentáře uživatele (ReviewText).

  2. Vytvořte třídu pro funkce proměnné délky za MovieReview třídou:

    /// <summary>
    /// Class to hold the variable length feature vector. Used to define the
    /// column names used as input to the custom mapping action.
    /// </summary>
    public class VariableLength
    {
        /// <summary>
        /// This is a variable length vector designated by VectorType attribute.
        /// Variable length vectors are produced by applying operations such as 'TokenizeWords' on strings
        /// resulting in vectors of tokens of variable lengths.
        /// </summary>
        [VectorType]
        public int[]? VariableLengthFeatures { get; set; }
    }
    

    Vlastnost VariableLengthFeaturesVectorType atribut, který jej označí jako vektor. Všechny vektorové prvky musí být stejného typu. V datových sadách s velkým počtem sloupců se načtením více sloupců jako jednoho vektoru sníží počet průchodů daty při aplikaci datových transformací.

    Tato třída se používá v ResizeFeatures akci. Názvy jeho vlastností (v tomto případě pouze jeden) slouží k označení sloupců v DataView, které lze použít jako vstup vlastní akce mapování.

  3. Vytvořte třídu pro funkce s konstantní délkou po třídě VariableLength:

    /// <summary>
    /// Class to hold the fixed length feature vector. Used to define the
    /// column names used as output from the custom mapping action,
    /// </summary>
    public class FixedLength
    {
        /// <summary>
        /// This is a fixed length vector designated by VectorType attribute.
        /// </summary>
        [VectorType(Config.FeatureLength)]
        public int[]? Features { get; set; }
    }
    

    Tato třída se používá v ResizeFeatures akci. Názvy jeho vlastností (v tomto případě pouze jeden) slouží k označení sloupců v DataView, které lze použít jako výstup vlastní akce mapování.

    Všimněte si, že název vlastnosti Features je určen modelem TensorFlow. Tento název vlastnosti nelze změnit.

  4. Vytvořte třídu pro predikci za FixedLength třídou:

    /// <summary>
    /// Class to contain the output values from the transformation.
    /// </summary>
    public class MovieReviewSentimentPrediction
    {
        [VectorType(2)]
        public float[]? Prediction { get; set; }
    }
    

    MovieReviewSentimentPrediction je prediktivní třída použitá po trénování modelu. MovieReviewSentimentPrediction má jednu float matici (Prediction) a VectorType atribut.

  5. Vytvořte další třídu, která bude obsahovat konfigurační hodnoty, například délku vektoru funkce:

    static class Config
    {
        public const int FeatureLength = 600;
    }
    

Vytvoření mlContextu, vyhledávacího slovníku a akce pro změnu velikosti funkcí

Třída MLContext je výchozím bodem pro všechny operace ML.NET. Inicializace mlContext vytvoří nové ML.NET prostředí, které lze sdílet napříč objekty pracovního postupu vytváření modelu. Je to podobné, koncepčně, jako DBContext v Entity Frameworku.

  1. Console.WriteLine("Hello World!") Nahraďte řádek následujícím kódem, který deklaruje a inicializuje proměnnou mlContext:

    MLContext mlContext = new MLContext();
    
  2. Vytvořte slovník pro kódování slov jako celá čísla pomocí LoadFromTextFile metody pro načtení mapovacích dat ze souboru, jak je vidět v následující tabulce:

    Slovo Index
    děti 362
    chtít 181
    nesprávný 355
    účinky 302
    pocit 547

    Přidejte následující kód pro vytvoření vyhledávací mapy:

    var lookupMap = mlContext.Data.LoadFromTextFile(Path.Combine(_modelPath, "imdb_word_index.csv"),
        columns: new[]
            {
                new TextLoader.Column("Words", DataKind.String, 0),
                new TextLoader.Column("Ids", DataKind.Int32, 1),
            },
        separatorChar: ','
        );
    
  3. Přidejte Action k změně velikosti pole celých čísel s proměnnou délkou na pole celých čísel s pevnou velikostí pomocí následujících řádků kódu:

    Action<VariableLength, FixedLength> ResizeFeaturesAction = (s, f) =>
    {
        var features = s.VariableLengthFeatures;
        Array.Resize(ref features, Config.FeatureLength);
        f.Features = features;
    };
    

Načtení předem natrénovaného modelu TensorFlow

  1. Přidejte kód pro načtení modelu TensorFlow:

    TensorFlowModel tensorFlowModel = mlContext.Model.LoadTensorFlowModel(_modelPath);
    

    Po načtení modelu můžete extrahovat jeho vstupní a výstupní schéma. Schémata jsou zobrazena pouze pro zájem a učení. Tento kód nepotřebujete, aby konečná aplikace fungovala:

    DataViewSchema schema = tensorFlowModel.GetModelSchema();
    Console.WriteLine(" =============== TensorFlow Model Schema =============== ");
    var featuresType = (VectorDataViewType)schema["Features"].Type;
    Console.WriteLine($"Name: Features, Type: {featuresType.ItemType.RawType}, Size: ({featuresType.Dimensions[0]})");
    var predictionType = (VectorDataViewType)schema["Prediction/Softmax"].Type;
    Console.WriteLine($"Name: Prediction/Softmax, Type: {predictionType.ItemType.RawType}, Size: ({predictionType.Dimensions[0]})");
    
    

    Vstupní schéma je pole s pevnou délkou celých čísel kódovaných slov. Výstupní schéma je pole s plovoucí maticí pravděpodobností označující, zda je mínění revize záporné nebo kladné . Tyto hodnoty se sčítají na 1, protože pravděpodobnost, že je pozitivní, je doplněk pravděpodobnosti negativního mínění.

Vytvoření kanálu ML.NET

  1. Vytvořte kanál a rozdělte vstupní text na slova pomocí transformace TokenizeIntoWords a rozdělte text na slova jako další řádek kódu:

    IEstimator<ITransformer> pipeline =
        // Split the text into individual words
        mlContext.Transforms.Text.TokenizeIntoWords("TokenizedWords", "ReviewText")
    

    Transformace TokenizeIntoWords používá mezery k analýze textu nebo řetězce na slova. Vytvoří nový sloupec a rozdělí každý vstupní řetězec na vektor podřetězců na základě uživatelem definovaného oddělovače.

  2. Namapujte slova na jejich celočíselné kódování pomocí vyhledávací tabulky, kterou jste deklarovali výše:

    // Map each word to an integer value. The array of integer makes up the input features.
    .Append(mlContext.Transforms.Conversion.MapValue("VariableLengthFeatures", lookupMap,
        lookupMap.Schema["Words"], lookupMap.Schema["Ids"], "TokenizedWords"))
    
  3. Změňte velikost celočíselného kódování délky proměnné na pevnou délku požadovanou modelem:

    // Resize variable length vector to fixed length vector.
    .Append(mlContext.Transforms.CustomMapping(ResizeFeaturesAction, "Resize"))
    
  4. Klasifikujte vstup pomocí načteného modelu TensorFlow:

    // Passes the data to TensorFlow for scoring
    .Append(tensorFlowModel.ScoreTensorFlowModel("Prediction/Softmax", "Features"))
    

    Výstup modelu TensorFlow se nazývá Prediction/Softmax. Všimněte si, že název Prediction/Softmax je určen modelem TensorFlow. Tento název nelze změnit.

  5. Vytvořte nový sloupec pro predikci výstupu:

    // Retrieves the 'Prediction' from TensorFlow and copies to a column
    .Append(mlContext.Transforms.CopyColumns("Prediction", "Prediction/Softmax"));
    

    Musíte zkopírovat Prediction/Softmax sloupec do takového se jménem, které lze použít jako vlastnost ve třídě C#: Prediction. Znak / není povolen v názvu vlastnosti jazyka C#.

Vytvoření modelu ML.NET z předzpracovatelského řetězce

  1. Přidejte kód pro sestavení modelu z pipeline:

    // Create an executable model from the estimator pipeline
    IDataView dataView = mlContext.Data.LoadFromEnumerable(new List<MovieReview>());
    ITransformer model = pipeline.Fit(dataView);
    

    Model ML.NET se vytvoří z řetězce estimátorů v pipeline voláním metody Fit. V tomto případě nepřizpůsobujete žádná data k utváření modelu, protože model TensorFlow už byl dříve natrénován. Zadáte prázdný objekt zobrazení dat, který splňuje požadavky metody Fit .

Použití modelu k vytvoření předpovědi

  1. Přidejte metodu PredictSentimentMovieReview nad třídu:

    void PredictSentiment(MLContext mlContext, ITransformer model)
    {
    
    }
    
  2. Přidejte následující kód, který vytvoří PredictionEngine jako první řádek v PredictSentiment() metodě:

    var engine = mlContext.Model.CreatePredictionEngine<MovieReview, MovieReviewSentimentPrediction>(model);
    

    PredictionEngine je pohodlné rozhraní API, které umožňuje provádět predikce pro jednu instanci dat. PredictionEngine není bezpečný pro přístup z více vláken. Je přijatelné použít v jednovláknovém nebo prototypovém prostředí. Pokud chcete zvýšit výkon a bezpečnost vláken v produkčních prostředích, použijte PredictionEnginePool službu, která vytvoří ObjectPoolPredictionEngine objekty pro použití v celé aplikaci. V tomto průvodci se dozvíte, jak používat PredictionEnginePool webové rozhraní API ASP.NET Core.

    Poznámka:

    PredictionEnginePool Rozšíření služby je aktuálně ve verzi Preview.

  3. Přidejte komentář k otestování předpovědi vytrénovaného modelu v Predict() metodě vytvořením instance MovieReview:

    var review = new MovieReview()
    {
        ReviewText = "this film is really good"
    };
    
  4. Předejte data testovacího komentáře do Prediction Engine přidáním následujících řádků kódu do metody PredictSentiment().

    var sentimentPrediction = engine.Predict(review);
    
  5. Funkce Predict() vytvoří předpověď na jednom řádku dat:

    Vlastnictví Hodnota Typ
    Prediction [0.5459937, 0.454006255] float[]
  6. Pomocí následujícího kódu zobrazte predikci mínění:

    Console.WriteLine($"Number of classes: {sentimentPrediction.Prediction?.Length}");
    Console.WriteLine($"Is sentiment/review positive? {(sentimentPrediction.Prediction?[1] > 0.5 ? "Yes." : "No.")}");
    
  7. Po volání PredictSentiment metody přidejte voláníFit():

    PredictSentiment(mlContext, model);
    

Results

Sestavte a spusťte svou aplikaci.

Výsledky by měly být podobné následujícímu. Během zpracování se zobrazí zprávy. Může se zobrazit upozornění nebo zpracování zpráv. Tyto zprávy byly odebrány z následujících výsledků, aby byly přehledné.

Number of classes: 2
Is sentiment/review positive ? Yes

Gratulujeme! Nyní jste úspěšně vytvořili model strojového učení pro klasifikaci a predikci mínění zpráv opětovným použitím předem natrénovaného TensorFlow modelu v ML.NET.

Zdrojový kód pro tento kurz najdete v úložišti dotnet/samples .

V tomto kurzu jste se naučili:

  • Načtení předem natrénovaného modelu TensorFlow
  • Transformace textu komentáře webu na funkce vhodné pro model
  • Použití modelu k vytvoření předpovědi