第三話 面白い人達が集まっているところで遊んでいたらマイクロソフトが動き出してAI開発をやってくれるらしい 「できないことは人にやらせよう」

何事も、一人でできることは限られている。

「みんなで力を合わせれば……!」は劇場版プリキュアのお約束である。いや、「ドキドキ!プリキュア」のやつしか見たことないけど。

キュアダイアモンド役の寿美菜子さんが好きなんです。


今日は、ライブラリ(拡張機能のようなもの)をインポートすることにより単体ではきついことをできるようになったという話です。


今回使いたかったライブラリはこちら。

MeCabという名前で知られていますが、本当はC#に適合したNMeCabというものを使います。MeCabはPythonという別の言語のものです。

NMeCabやMeCabがどんなものかというと、形態素分解とか形態素解析とか言われるものをやってくれます。

コメント 2020-07-20 183932

こういうやつです。文脈に応じて単語ごとに分解してくれます。かわいいですね。

今回の私の企みは、

人間が打ち込んだ入力を形態素解析し、バラバラにして文字も変えて、あたかも別言語のようなものを出力する

ことです。クールですね。

しかし、私はC#に慣れておらず、頭の中では完成していてもそれが実装となるとうまく行かず、非常にもどかしいものでした。

閑話休題、Azureのデプロイ(botサービスなどをAzure上で利用可能な状態にする)の方法には2つあります。

1.Azureの上で開発する
2.Visual studio2019(推奨だとこれだけど他のIDEでもできるかも)でアルティメットエクストリームハードモードなデプロイをする

1.の方法でやりたかったのですが、ライブラリの管理が難しそうで2.のアルティメットエクストリームハードな方法を選ばざるを得ないのでした……


こちら、お世話になっているおーちょさん(ドラクエがお好きらしい。何にせよ大好きなものがあると自己紹介で役立つなと思った)の記事を参考にデプロイ自体は進めて行けたのですが……

コメント 2020-07-20 185206

これ。using NMeCab。赤い波線を取り除くのにかなりかかりました。

Pythonしか触ったことない人としては、ターミナルからパッケージマネージャを使えばいいのかなと思っていましたが、この環境だとIDEから「NuGetパッケージの管理」を使う必要があるようですね。

コメント 2020-07-20 185439

ここを右クリックすれば出ました。

私は普段IDEではなくエディタと呼ばれがちなVisual Studio Codeを使っているのですが、IDEとエディタってこの辺が違うのですかね。エディタのはスクリプトを書くだけで、開発機能は制限されているみたいな記事は見ました。

コメント 2020-07-20 185658

NuGetパッケージの管理から、NMeCabを見つけてインストール。

できた。

しかし!インポート自体はできても、また新たな壁が待ち受けているのでした。

using System;
using System.Collections.Generic;
using System.Security;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Schema;
using NMeCab;

namespace _02conlang_maker.Bots
{
   public class EchoBot : ActivityHandler
   {
       protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
       {
           var mecab = MeCabTagger.Create();
           string[] alphabets = new string[] {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z" };
           string[] stringArray; //ここに形態素分解したものを配列として格納
           string non_processed = "震えてる声振り絞り潤んだ瞳の奥で怖いくらい君は覚悟を決めてた"; //入力を文字列として受け取る(これは仮文字列)
           //string non_processed = turnContext.Activity.Text; //これが入力として与えられる本当の文字列
           var node = mecab.ParseToNode(non_processed);
           Console.WriteLine(node.Surface);
           //var node = mecab.ParseToNode(non_processed);
           var replyText = $"Echo: {turnContext.Activity.Text}";
           await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
       }

       protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
       {
           var welcomeText = "Hello and welcome!";
           


           foreach (var member in membersAdded)
           {
               if (member.Id != turnContext.Activity.Recipient.Id)
               {
                   await turnContext.SendActivityAsync(MessageFactory.Text(welcomeText, welcomeText), cancellationToken);
               }
           }
       }
   }
}

データ構造がわからんぺ。

Pythonでいうリスト型に入力として与えられた文の各単語を受け取って、for文で繰り返し処理できればなと思うのですが。次回の課題です。

この記事が気に入ったらサポートをしてみませんか?