Web アプリケーション内でコメントからのセンチメントをリアルタイムで分析する方法について説明します。
このチュートリアルでは、Web サイトのコメントからのセンチメントをリアルタイムで分類する ASP.NET Core Razor Pages アプリケーションを作成する方法について説明します。
このチュートリアルでは、以下の内容を学習します。
- ASP.NET Core Razor Pages アプリケーションを作成する
- データを準備して理解する
- シナリオを選択する
- データを読み込む
- モデルをトレーニングする
- モデルを評価する
- 予測にモデルを使用する
このチュートリアルのソース コードは 、dotnet/machinelearning-samples リポジトリにあります。
Prerequisites
前提条件とインストール手順の一覧については、 Model Builder インストール ガイドを参照してください。
Razor Pages アプリケーションを作成する
ASP.NET Core Razor Pages アプリケーションを作成します。
- Visual Studio で、[ 新しいプロジェクトの作成 ] ダイアログを開きます。
- [新しいプロジェクトの作成] ダイアログで、 ASP.NET Core Web App プロジェクト テンプレートを選択します。
- [名前] テキスト ボックスに「SentimentRazor」と入力し、[次へ] を選択します。
- [追加情報] ダイアログで、すべての既定値をそのままにして、[ 作成] を選択します。
データを準備して理解する
Wikipedia のデトックス データセットをダウンロードします。 Web ページが開いたら、ページを右クリックし、[ 名前を付けて保存] を選択し、コンピューター上の任意の場所にファイルを保存します。
wikipedia-detox-250-line-data.tsv データセットの各行は、Wikipedia のユーザーが残した別のレビューを表します。 最初の列はテキストのセンチメントを表し (0 は無毒、1 は有毒)、2 番目の列はユーザーが残したコメントを表します。 列はタブで区切られます。 データは次のようになります。
Sentiment | SentimentText |
---|---|
1 | ==RUDE== 男、あなたはカールの写真を元に戻す、または他の失礼なアップロードです。 |
1 | == OK! == 私は野生のものを破壊するつもりです WIKI その後!! |
0 | 私はこれが役に立つことを願っています。 |
モデル ビルダー構成ファイルを作成する
最初に機械学習モデルをソリューションに追加すると、 mbconfig
ファイルを作成するように求められます。
mbconfig
ファイルは、セッションを再度開くために Model Builder で行うすべての操作を追跡します。
- ソリューション エクスプローラーでSentimentRazor プロジェクトを右クリックし、[Add>Machine Learning Model] を選択します。
- ダイアログで、モデル ビルダー プロジェクト SentimentAnalysis.mbconfig に名前を付け、[ 追加] を選択します。
シナリオを選択する
モデルをトレーニングするには、モデル ビルダーによって提供される利用可能な機械学習シナリオの一覧から選択する必要があります。
このサンプルでは、タスクはテキスト分類です。 モデル ビルダー拡張機能の シナリオ ステップで、 テキスト分類 シナリオを選択します。
環境を選択する
モデル ビルダーは、選択したシナリオに応じて異なる環境でトレーニングできます。
環境として [ローカル (GPU)] を選択し、[ 次のステップ ] ボタンをクリックします。
Note
このシナリオでは、GPU 環境で最適なディープ ラーニング手法を使用します。 GPU がない場合は、ローカル (CPU) 環境を選択しますが、トレーニングに予想される時間が大幅に長くなることに注意してください。 モデル ビルダーで GPU を使用する方法の詳細については、 モデル ビルダー ガイドの GPU サポートを参照してください。
データを読み込む
モデル ビルダーは、SQL Server データベースまたはローカル ファイルの 2 つのソースからのデータを csv
または tsv
形式で受け入れます。
- モデル ビルダー ツールのデータ ステップで、データ ソース オプションから [ファイル ] を選択します。
- [ ファイルの選択 ] テキスト ボックスの横にあるボタンを選択し、エクスプローラーを使用して wikipedia-detox-250-line-data.tsv ファイルを参照して選択します。
- [予測する列] (ラベル) ドロップダウンから [センチメント] を選択します。
- [テキスト列] ドロップダウンから [SentimentText] を選択します。
- [ 次のステップ ] ボタンを選択して、モデル ビルダーの次のステップに移動します。
モデルをトレーニングする
このチュートリアルで感情分析モデルをトレーニングするために使用される機械学習タスクは、テキスト分類です。 モデル トレーニング プロセス中に、モデル ビルダーは NAS-BERT ニューラル ネットワーク アーキテクチャを使用してデータセットのテキスト分類モデルをトレーニングします。
[ トレーニングの開始] を選択します。
トレーニングが完了すると、[トレーニング] 画面の [トレーニング結果] セクションにトレーニング プロセスの結果が表示されます。 トレーニング結果を提供するだけでなく、 SentimentAnalysis.mbconfig ファイルの下に 3 つの分離コード ファイルが作成されます。
-
SentimentAnalysis.consumption.cs - このファイルには、
ModelInput
スキーマとModelOutput
スキーマ、およびモデルを使用するために生成されたPredict
関数が含まれています。 - SentimentAnalysis.training.cs - このファイルには、モデルをトレーニングするためにモデル ビルダーによって選択されたトレーニング パイプライン (データ変換、トレーナー、トレーナーハイパーパラメーター) が含まれています。 このパイプラインは、モデルの再トレーニングに使用できます。
- * SentimentAnalysis.mlnet - このファイルには、ML.NET モデルのメタデータと構成の詳細が含まれています。
-
SentimentAnalysis.consumption.cs - このファイルには、
[次のステップ] ボタンを選択して、次のステップに進みます。
モデルを評価する
トレーニング 手順の結果は、最高のパフォーマンスを持つ 1 つのモデルになります。 モデル ビルダー ツールの評価手順では、出力セクションに、最もパフォーマンスの高いモデルで使用されるトレーナーと評価メトリックが含まれます。
評価メトリックに満足できない場合は、より多くのデータを使用してモデルのパフォーマンスを向上させる簡単な方法がいくつかあります。
それ以外の場合は、[ 次のステップ ] ボタンを選択して、モデル ビルダーの [使用 ] ステップに移動します。
消費プロジェクト テンプレートを追加する (省略可能)
[使用] ステップでは、モデル ビルダーに、モデルの使用に使用できるプロジェクト テンプレートが用意されています。 この手順は省略可能であり、モデルを使用するためのニーズに最も適した方法を選択できます。
- Console application
- Web API
予測を行うコードを追加する
PredictionEngine プールを構成する
1 つの予測を作成するには、PredictionEngine<TSrc,TDst> を作成する必要があります。
PredictionEngine<TSrc,TDst> はスレッド セーフではありません。 さらに、アプリケーション内で必要なすべての場所にインスタンスを作成する必要があります。 アプリケーションの規模が拡大すると、このプロセスが管理不能になる可能性があります。 パフォーマンスとスレッド セーフを向上させるには、依存性の挿入と PredictionEnginePool
サービスを組み合わせて使用します。これにより、アプリケーション全体で使用する ObjectPool<T> オブジェクトの PredictionEngine<TSrc,TDst> が作成されます。
Microsoft.Extensions.ML NuGet パッケージをインストールします。
- ソリューション エクスプローラーで、プロジェクトを右クリックし、 [NuGet パッケージの管理] を選択します。
- パッケージ ソースとして [nuget.org] を選択します。
- [ 参照 ] タブを選択し、 Microsoft.Extensions.ML を検索します。
- 一覧からパッケージを選択し、[インストール] を選択 します。
- [変更のプレビュー] ダイアログで [OK] ボタンを選択する
- 一覧表示されているパッケージのライセンス条項に同意する場合は、[ライセンスの同意] ダイアログで [同意する] ボタンを選択します。
SentimentRazor プロジェクトでProgram.cs ファイルを開きます。
次の
using
ディレクティブを追加して 、Microsoft.Extensions.ML NuGet パッケージと SentimentRazorML.Model プロジェクトを参照します。using Microsoft.Extensions.ML; using static SentimentRazor.SentimentAnalysis;
Program.cs ファイルでアプリケーションのPredictionEnginePool<TData,TPrediction>を構成します。
builder.Services.AddPredictionEnginePool<ModelInput, ModelOutput>() .FromFile("SentimentAnalysis.mlnet");
センチメント分析ハンドラーを作成する
予測は、アプリケーションのメイン ページ内で行われます。 したがって、ユーザー入力を受け取り、 PredictionEnginePool<TData,TPrediction> を使用して予測を返すメソッドを追加する必要があります。
Pages ディレクトリにあるIndex.cshtml.cs ファイルを開き、次の
using
ディレクティブを追加します。using Microsoft.Extensions.ML; using static SentimentRazor.SentimentAnalysis;
Program.cs ファイルで構成されたPredictionEnginePool<TData,TPrediction>を使用するには、それを使用するモデルのコンストラクターに挿入する必要があります。
Pages/Index.cshtml.cs ファイル内の
IndexModel
クラス内のPredictionEnginePool<TData,TPrediction>を参照する変数を追加します。private readonly PredictionEnginePool<ModelInput, ModelOutput> _predictionEnginePool;
IndexModel
クラスのコンストラクターを変更し、PredictionEnginePool<TData,TPrediction> サービスを挿入します。public IndexModel(ILogger<IndexModel> logger, PredictionEnginePool<ModelInput, ModelOutput> predictionEnginePool) { _logger = logger; _predictionEnginePool = predictionEnginePool; }
PredictionEnginePool
を使用して、Web ページから受信したユーザー入力から予測を行うメソッド ハンドラーを作成します。OnGet
メソッドの下に、次の名前の新しいメソッドを作成します。OnGetAnalyzeSentiment
public IActionResult OnGetAnalyzeSentiment([FromQuery] string text) { }
OnGetAnalyzeSentiment
メソッド内で、ユーザーからの入力が空白または null の場合は、ニュートラルセンチメントを返します。if (String.IsNullOrEmpty(text)) return Content("Neutral");
有効な入力がある場合は、
ModelInput
の新しいインスタンスを作成します。var input = new ModelInput { SentimentText = text };
PredictionEnginePool<TData,TPrediction>を使用してセンチメントを予測します。
var prediction = _predictionEnginePool.Predict(input);
次のコードを使用して、予測された
bool
値を有毒または毒性に変換します。var sentiment = Convert.ToBoolean(prediction.PredictedLabel) ? "Toxic" : "Not Toxic";
最後に、センチメントを Web ページに返します。
return Content(sentiment);
Web ページを構成する
OnGetAnalyzeSentiment
によって返された結果は、Index
Web ページに動的に表示されます。
Pages ディレクトリで Index.cshtml ファイルを開き、その内容を次のコードに置き換えます。
@page @model IndexModel @{ ViewData["Title"] = "Home page"; } <div class="text-center"> <h2>Live Sentiment</h2> <p><textarea id="Message" cols="45" placeholder="Type any text like a short review"></textarea></p> <div class="sentiment"> <h4>Your sentiment is...</h4> <p>😡 😐 😍</p> <div class="marker"> <div id="markerPosition" style="left: 45%;"> <div>▲</div> <label id="markerValue">Neutral</label> </div> </div> </div> </div>
次に、wwwroot\css ディレクトリの site.css ページの末尾に css スタイルコードを追加します。
/* Style for sentiment display */ .sentiment { background-color: #eee; position: relative; display: inline-block; padding: 1rem; padding-bottom: 0; border-radius: 1rem; } .sentiment h4 { font-size: 16px; text-align: center; margin: 0; padding: 0; } .sentiment p { font-size: 50px; } .sentiment .marker { position: relative; left: 22px; width: calc(100% - 68px); } .sentiment .marker > div { transition: 0.3s ease-in-out; position: absolute; margin-left: -30px; text-align: center; } .sentiment .marker > div > div { font-size: 50px; line-height: 20px; color: green; } .sentiment .marker > div label { font-size: 30px; color: gray; }
その後、Web ページから
OnGetAnalyzeSentiment
ハンドラーに入力を送信するコードを追加します。wwwroot\js ディレクトリにある site.js ファイルで、
getSentiment
という関数を作成して、OnGetAnalyzeSentiment
ハンドラーへのユーザー入力を使用して GET HTTP 要求を行います。function getSentiment(userInput) { return fetch(`Index?handler=AnalyzeSentiment&text=${userInput}`) .then((response) => { return response.text(); }) }
その下に、センチメントの予測に従って Web ページ上のマーカーの位置を動的に更新するために、
updateMarker
と呼ばれる別の関数を追加します。function updateMarker(markerPosition, sentiment) { $("#markerPosition").attr("style", `left:${markerPosition}%`); $("#markerValue").text(sentiment); }
updateSentiment
というイベント ハンドラー関数を作成してユーザーから入力を取得し、getSentiment
関数を使用してOnGetAnalyzeSentiment
関数に送信し、マーカーをupdateMarker
関数で更新します。function updateSentiment() { var userInput = $("#Message").val(); getSentiment(userInput) .then((sentiment) => { switch (sentiment) { case "Not Toxic": updateMarker(100.0, sentiment); break; case "Toxic": updateMarker(0.0, sentiment); break; default: updateMarker(45.0, "Neutral"); } }); }
最後に、イベント ハンドラーを登録し、
id=Message
属性を使用してtextarea
要素にバインドします。$("#Message").on('change input paste', updateSentiment)
アプリケーションを実行する
アプリケーションがセットアップされたら、ブラウザーで起動するアプリケーションを実行します。
アプリケーションが起動したら、「 このモデルには十分なデータがありません! 」と入力します。 表示される予測センチメントは 有害である必要があります。
Note
PredictionEnginePool<TData,TPrediction> は、 PredictionEngine<TSrc,TDst>の複数のインスタンスを作成します。 モデルのサイズのため、初めてモデルを使用して予測を行う場合、数秒かかることがあります。 後続の予測は瞬時に行う必要があります。
Next steps
このチュートリアルでは、次の方法を学習しました。
- ASP.NET Core Razor Pages アプリケーションを作成する
- データを準備して理解する
- シナリオを選択する
- データを読み込む
- モデルをトレーニングする
- モデルを評価する
- 予測にモデルを使用する
Additional Resources
このチュートリアルで説明されているトピックの詳細については、次のリソースを参照してください。
.NET