はつねの日記

Kinect, Windows 10 UWP, Windows Azure, IoT, 電子工作

Azure CognitiveServices TextAnalyticsの「テキスト要約」をクライアントアプリから使ってみる(REST API編)

前回:
hatsune.hatenablog.jp

前回は、AzureポータルでTextAnalyticsを有効にして、Azure.AI.TextAnalytics SDKを使って「テキスト要約」を行うクライアントアプリの動作を確認してみました。
今回は、クライアントアプリからREST APIにて同様の動作を実現してみます。

準備

.NET 6ベースのWPFアプリとしてクライアントアプリを作成します。

新しいプロジェクトの作成

Visual Studio 2022で、新しいプロジェクトの作成で「WPFアプリケーション」のテンプレートを選択すると、.NET Frameworkベースではなく.NET 6ベースのWPFアプリが作成できます。
名前は「TextSummarizationAPISample」と名付けることにしましょう。

コードを記述

サンプルコードは、MVVMデザインパターンで作成しているので、画面はViewsフォルダ配下に「MainWindows.xaml」として記述し、REST APIを呼び出すロジックはModelsフォルダ配下に「TextSummarizationModel.cs」として記述します。

画面を作成

MVVMの良いところは、ViewとModelが分離できるところです。前回のSDKからの変更はModelの差し替えだけになるので、画面については、SDKのサンプル画面と同じく「入力欄」「実行ボタン」「出力欄」として、XAMLコードなどは名前空間だけかえてそのままコピペしてきます。名前空間変更前のものを再掲しておきます。
gist.github.com
このXAMLのx:classとxmlns:localを「TextSummarizationSDKSample」から「TextSummarizationAPISample」に変更します。

ロジックを作成

TextSummarizationModelクラスとしてREST API呼び出し部分を記述してみましょう。
gist.github.com
「your key」や「your resourcename」のところは、AzureでTextAnalyticsを有効化したときに生成されたキーとリソース名を設定します。
SDKのときよりもかなり複雑なコードになっています。
最初にREST APIのBODYとしてパラメタをJSON文字列として設定するためのクラスにパラメタを設定しています(9~39行目)。
67行目でPostによりREST APIをたたいていますが、この戻り値が要約結果ではありません。
72行目で取得できるのは、要約結果を得るためのjob番号付きURLです。
86行目では、72行目で得られたob番号付きURLを指定して要約結果をGetしています。
もちろん非同期実行ですから、Azure側で要約が完成して初めてSendAsycメソッドは値を返します。
そして、97行目から100行目で戻ってきた要約(今回は3文)を取得しています。

なお、上記には載せていませんがJSON形式とやり取りするためのクラス定義も必要です。

実行

対象のテキストを入力

Language Studioで試したように現在開催されているMicrosoft Build 2022のBook of NewsにあるAzureAIの説明を要約してみましょう。
news.microsoft.com
場所は、「1.1 Azure AI」の部分にしてみましょう。

実行結果

[Exec]ボタンをクリックして少し待つとテキスト要約結果が表示されます。

Microsoft Azure AIは、開発者が高品質なモデルをAPIとしてデプロイし、言語機能をより効率的かつ責任を持ってアプリに注入できるように、Azure Cognitive Servicesに2つのアップデートを導入します。
Azure Cognitive Serviceの1つであるAzure OpenAI Serviceは、現在プレビューで利用可能です。
Azure Cognitive Service for Languageは、文書や会話の要約を提供する新機能で、開発者が文書やコンタクトセンターの通話に含まれる重要な情報(通話理由や解決策など)を迅速に表面化できるよう支援します。

まとめ

TextAnalytics用のREST APIを使ってテキスト要約を行うクライアントアプリを作成してみました。
同じ文章を入力すればSDK版と同じ結果が当たり前ですが得ることができました。
こうやって記載してもるとREST APIに比べて、SDKが使いやすいので非常にシンプルなコードで実装できるのが分かってもらえたら嬉しいです。

Azure CognitiveServices TextAnalyticsの「テキスト要約」をクライアントアプリから使ってみる(SDK編)

前回:Azure CognitiveServices TextAnalyticsでテキスト要約を試してみる - はつねの日記

前回は、AzureポータルでTextAnalyticsを有効にして、Language Studioで「テキスト要約」動作を確認してみました。
今回は、クライアントアプリから前回有効にしたTextAnalyticsにつないでみましょう。

準備

.NET 6ベースのWPFアプリとしてクライアントアプリを作成します。
TextAnalyticsとの接続には、Azure.AI.TextAnalytics SDKを使います。
まずは、そのために準備として、Visual Studioで新しいプロジェクトを作成してNuGetから必要なライブラリを取得しましょう。

新しいプロジェクトの作成


Visual Studio 2022で、新しいプロジェクトの作成で「WPFアプリケーション」のテンプレートを選択すると、.NET Frameworkベースではなく.NET 6ベースのWPFアプリが作成できます。
名前は「TextSummarizationSDKSample」と名付けることにしましょう。

NuGetからSDKの取得

Azure.AI.TextAnalytics SDKをNuGetから取得しましょう。
www.nuget.org
ソリューションエクスプローラーでプロジェクトファイルを右クリックして[NuGetパッケージの管理]メニューでNuGetパッケージマネージャーを起動して、Azure.AI.TextAnalytics SDKをプロジェクトに追加します。

この時に注意しないといけないのは、(2022年6月4日現在)テキスト要約は「プレビュー」機能なので、NuGetから取得するAzure.AI.TextAnalytics SDKもプレリリース版が必要な点です。

そこで、「プレリリースを含める」をチェックして、プレリリース版の最新を取得してきます。
現時点でのプレリリース版は5.2.0-beta3ですので将来的に5.2.0が正式版となるまではプレリリース版を追加するようにしましょう。

コードを記述

サンプルコードは、MVVMデザインパターンで作成しているので、画面はViewsフォルダ配下に「MainWindows.xaml」として記述し、TextAnalytics APIを呼び出すロジックはModelsフォルダ配下に「TextSummarizationModel.cs」として記述します。

画面を作成

サンプルなので「入力欄」「実行ボタン」「出力欄」のシンプルが画面を作成してみます。
gist.github.com

ロジックを作成

TextSummarizationModelクラスとしてAPI呼び出し部分を記述してみましょう。
gist.github.com
「your key」や「your resourcename」のところは、AzureでTextAnalyticsを有効化したときに生成されたキーとリソース名を設定します。

実行

対象のテキストを入力

Language Studioで試したように現在開催されているMicrosoft Build 2022のBook of NewsにあるAzureAIの説明を要約してみましょう。
news.microsoft.com
場所は、「1.1 Azure AI」の部分にしてみましょう。

実行結果

[Exec]ボタンをクリックして少し待つとテキスト要約結果が表示されます。

Microsoft Azure AIは、開発者が高品質なモデルをAPIとしてデプロイし、言語機能をより効率的かつ責任を持ってアプリに注入できるように、Azure Cognitive Servicesに2つのアップデートを導入します。
Azure Cognitive Serviceの1つであるAzure OpenAI Serviceは、現在プレビューで利用可能です。
Azure Cognitive Service for Languageは、文書や会話の要約を提供する新機能で、開発者が文書やコンタクトセンターの通話に含まれる重要な情報(通話理由や解決策など)を迅速に表面化できるよう支援します。

まとめ

TextAnalytics用のSDKを使ってテキスト要約を行うクライアントアプリを作成してみました。
SDKが使いやすいので非常にシンプルなコードで実装できるのが分かってもらえたら嬉しいです。
次回は、今回作成したコードをベースにしてTextAnalytics APISDKではなくREST APIとして呼び出す方法について説明する予定です。
TextAnalytics APIを直に呼び出すことで更に理解が進むと思いますし、SDKが提供されていない環境から使うときのサンプルになればと思っています。

Azure CognitiveServices TextAnalyticsでテキスト要約を試してみる

Microsoft Build 2022が日本時間の2022/05/25 00:15から始まりました。
そのオープニングセッションでサティアCEOが話している内容で「~テキスト要約して~」と話しているところがありました。
Cognitive Servicesでテキスト要約とかできたんだっけ?と思ったので調べてみたらできるみたいですね。

Azure側の準備

Azureマーケットプレイスから探す

リソースを作成するで「TextAnalytics」と検索するとマーケットプレイスからMicrosoftが提供している「テキスト分析」を検索できます。

リソースを作成する


[作成]をクリックすると「追加機能の選択」に移動します。URL直指定だといきなり「追加機能の選択」に飛べます。

追加機能の選択


もしURL直でここまで行きたい場合は、次のURLからも作成を開始できます。
https://portal.azure.com/#create/Microsoft.CognitiveServicesTextAnalytics
検索で似たようなものから探すよりもURL直の方が確実なので好きです。
「テキスト要約」は基本機能にあるので、特に追加機能は選ばずに進めましょう。

TextAnalytics の作成


日本リージョンも選べますし、無料プラン(月上限5000呼び出し)もありますね。
「法的条項」や「責任ある AI 通知」にもチェックをいれて[確認と作成]クリックして検証が通ったら、[作成]をクリックと進んでいきましょう。

Language Studioで試す

Azure側でテキスト要約のリソース(API)の準備ができたので、次はクライアント側というのが従来のステップになりますが、最近のAzureではAPIを試す機能も充実しています。
テキスト要約も「Language Studio」で手軽に試すことができます。
https://language.cognitive.azure.com/home

試すリソースを指定

Language Studioにアクセスするとどのリソースで実行するかの聞かれますので、サブスクリプションやリソース名などを指定します。

Summarize textをTry it outする


翻訳がされていないツールなので「テキスト要約」を試すためには、「Summarize text」のトライを選びます。
UIは日本語化されていませんが、もちろん、対象言語として日本語もサポートしています。

日本語文章を要約する

現在開催されているMicrosoft Build 2022のBook of NewsにあるAzureAIの説明を要約してみましょう。
news.microsoft.com
テキスト要約は5000文字まで1度に要約できますので、要約の効果がわかりやすいように1000文字以上は対象テキストとしてみましょう。

入力データを設定したら、少し下にスクロールして[Run]をクリックします。

要約を確認する

実行結果は、人が見やすいように成形されたResultと、APIからの戻り値であるJSONの2つの形式で表示されます。
まずは、ResultのSummaryを確認してみます。

結果は約220文字となり、元の文章が約1200文字でしたので、元の文章の約20%に要約されています。
Original text欄を見ると文章のどこの文をチョイスして要約したかが分かりやすく表示されています。

これをみると1文の中を要約してというよりも、全体の中からキーとなる文をランク付けして上位(今回は)3つ選んで要約結果としているようです。

APIの戻り値を確認する

実行結果をJSON形式で確認してみましょう。

結果はsentencesというJSON配列に返却されます。今回は3つにしているので配列要素は最大で3つになります。
sentencesの各要素は「text」「rankscore」「offset」「length」となっており、それぞれ「該当文」「重要度スコア(0~1)」「文先頭からの位置」「文字数」となります。

まとめ

最近のAzureは、アプリ作らなくても確認するためのページが用意されていて、すぐにAPIの動作確認ができるのがとても良いですね。
1文の中まで要約はしてくれないので、なんとなく日本人が考える「要約」というイメージと若干差異があるかもしれませんが、長文の中から重要なセンテンス3文を探してきてくれると考えると使い道はいろいろ広がりますね。

BFG Repo-CleanerをWindowsで使って、gitリポジトリからファイルを削除する

Gitリポジトリから不要なファイルを削除したいような場合、直前ならばまだしも過去のコミットから削除しようとすると大変です。
そんな時に便利なのが「BFG Repo-Cleaner」です。
github.com

検索すればネット上にいろいろ情報はありますが、「あれ?Windowsのときはどうするんだ?」と検索結果を読みながら若干手探りなところがあったので、忘備録として記載しておきます。

前提

  • Visual Studio 2022を使っていて、OpenJDKもインストール済

  • SourceTreeと使っている(Git for Windowsなどでもよい)

背景

リモート側を別の場所に移行する必要に迫られてローカルリポジトリをpushしようとしたところ、過去のコミットで大きなファイル(その後はそのファイルはいらなくなったので削除もコミットされている)があるということでpushが失敗してしまいました。
Git LFSが使うという方法もあるのですが、いらないファイルなので該当ファイルを削除してからPushする方法をとりたい。

悩んだポイント

Windowsではbfgの実行はどこですればいいのか?

手順

事前準備

事前にGitリポジトリをcloneしておくと万が一失敗したときにリカバリーできるそうです。

bfgのダウンロード

GitHubのBFG-Windowsリポジトリのリリースページからbgfのjarファイルをダウンロードします。
2022/05/09時点では1.13.0が最新です。
Release BFG-1.13.0 (2020-01-08) · wjk/BFG-Windows · GitHub

Open in Terminal

Visual Studioで該当ソリューションを右クリックして「Open in Terminal」を開きます。

これでソリューションのルートフォルダで「開発者用PowerShell」が起動できます。

java -jar c:\Users\hatsune\Downloads\bfg-1.14.0.jar --delete-files hogehoge.a .git

と入力すれば、ソリューションフォルダ直下の「.git」フォルダの内容を参照してリポジトリから「hogehoge.a」ファイルを削除してくれます。
正常に動作した場合は最後に次のように表示されます。

BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive

2つのgitコマンド、git reflog expireと git gcを実行するように即されていますね。

後処理

次に、ここがキモなのですが、「開発者用PowerShell」からいったん離れて「Git for Windows」や「SourceTree」などのコマンドプロンプトを開いて次のコマンドを実行します。

$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
Enumerating objects: 24347, done.
Counting objects: 100% (24347/24347), done.
Delta compression using up to 4 threads
Compressing objects: 100% (23104/23104), done.
Writing objects: 100% (24347/24347), done.
Total 24347 (delta 18601), reused 4215 (delta 0), pack-reused 0
Removing duplicate objects: 100% (256/256), done.

リモートにpush

これであとはリモートにpushします。

$ git push -u origin master

リモートとローカルのリポジトリの整合性がとれないので怒られると思うので「-f」で強制プッシュします。

$ git push -f

まとめ

パスをきちんと設定しておけばよいのかもしれないけれど、「開発者用PowerShell」と「Gitツールのターミナル」の二刀流でサクッとやってしまうのもいいのかなと思いました。

転生先で捨てられたので、もふもふ達とお料理します~お飾り王妃はマイペースに最強です~

I was abandoned in my reincarnation, so I'll cook with the fluffers - the ornamental queen is the strongest at her own pace!

amzn.to
The work introduced here follows the pattern of gaining allies through cooking, which is common in otherworldly reincarnations. The combination of this with a love of "Mof-Mof" makes for a lighthearted success story that moves along quickly and smoothly.
This work has been changed to "R" from the second volume.

amzn.to
If you start reading from "R", there is no introduction and you will be confused by the sudden development, so I suggest you start reading from "without R".
The "R" version has a more "Honwaka" style, so it is suitable for those who prefer the style of "R".

転生先で捨てられたので、もふもふ達とお料理します~お飾り王妃はマイペースに最強です~

amzn.to

今回紹介する作品は、異世界転生にありがちの料理で周りを味方につけていくパターンの作品です。そこに「もふもふ」好きという要素もかけ合わさって、さくさくと進むサクセスストーリーとしても軽快に話が進んでいきます。
こちらの作品、2巻目からは「R」としてコミカライズされる方が変更になっております。
amzn.to
「R」から読み始めると導入部分がなくて、いきなりな展開にとまどってしまうので、「Rなし」から読み始めるといいと思います。
そして、「R」の方の絵柄の方がより「ほんわか」していますので、そちらの絵柄がより好みの人向けの作品です。

0歳児スタートダッシュ物語

0-year-old starting story

I would like to introduce a comic adaptation of a novel about a different world (Isekai Tensei or Isekai Tani) that has not yet been made into an anime (as of the time of the blog post).

The term "Isekai Tensei" here refers to cases in which the main character died in Japan and was born as a child in another world, or in a body born as a child in which the memories of the time when he/she lived in Japan were revived. There are cases in which a so-called god intervenes and bestows a benefit (cheat), and there are also cases in which the current knowledge itself is a cheat. Therefore, the original status in another world is a characteristic of Isekai Tensei.

"Isekai Teni" refers to cases where a person is transferred from Japan to another world. In this case, there is no otherworldly status, and the name is usually the same as before birth.

Another world transfer" is when a person is transferred from Japan to another world. In this case, there is no otherworldly status, and the name is usually the same as before birth (?). In this case, the person has no otherworldly status, and his/her name is often the same as his/her name before birth (?).

The following is an example.
amzn.to

The main character, Lilia, was born with memories of her previous life. She is a 0-year-old child of the so-called "reincarnation to another world.
Moreover, that world is a game that she played in her previous life, and she tries to avoid it by any means possible because if she doesn't do so, she will become a villainess.
The picture is cute and there are no erotic elements, so it is safe for those who are not good at such things.

0歳児スタートダッシュ物語

異世界もの(異世界転生や異世界転移)のラノベをコミカライズしたもので、(blog投稿時点で)まだアニメ化されていないものを紹介していきたいと思います。

ここでいう「異世界転生」とは、日本で死んだ主人公が異世界で子供として生まれて、もしくは、子供として生まれた体に、日本で生活していたころの記憶がよみがえったケースを指します。いわゆる神様が介在して恩恵(チート)をさずける場合もあるし、現在の知識そのものがチートの場合もあります。なので異世界での身分というのがもともとあるのが異世界転生の特徴です。

また、「異世界転移」は、日本から異世界に転移させられた場合をいいます。このときは異世界の身分はなく、名前も生前(?)の名前の場合がおおいですね。

今回ご紹介するのは次の作品です。
amzn.to

主人公のリリアは、前世の記憶を持って生まれました。いわゆる「異世界転生」の0歳児です。
しかも、その世界は自分が前世でプレイしていたゲームで、このままでは悪役令嬢になってしまうと、あの手この手でそれを避けようとするのですが、天然やらかし属性があるので無自覚にチート披露してしまうというハートフルストーリーです。
絵柄もかわいいし、エロ要素皆無なので、そういったのが苦手な人にも安心ですね。