幽霊と話す:エイダ・ラブレース

ハロウィーンの恐怖は、窓の外の幽霊や同僚が来た怖い衣装だけではありません。 真の内向者にとっては、それだけでなく、休暇中に大勢の人とコミュニケーションをとることになります。 昨年、私は世界初の女性プログラマーであるボットAda Lovelaceの作成に参加しました 。 一年中、私は定期的に彼女とおしゃべりをし、彼女をより完璧にすることを夢見ていました。 Ada自身からの引用、Adaからの数学的問題、画像認識など、追加した新機能についてお読みください。













最近、マイクロソフトパートナーの学生向けのハッカソンが開催されました。チームの1つが、以前のバージョンのAda Lovelaceボットを改善するというアイデアを取り上げました。 何が起こったのか見てみましょう。







エイダが教えたように



Ada LovelaceのボットはMicrosoft Bot Framework上に構築されており、Telegramだけでなく、Skype、Slack、Facebook Messenger、Web Chat、Cortana、SMSなどの他のチャネルにも展開できます。 連中は、Ada Lovelaceの実際の引用をベースとして、ボットを再現しようとしました。 その瞬間に女の子が何を考えていたのかは非常に興味深いです-強力な数学者であり、最初のプログラマーです。







新しい機能から :Adaは数学に関する問題、およびアルゴリズムに関する問題を解決することを提案します 。彼女は数学が非常に好きであり、「サイクル」や「ワークセル」などの用語が初めて導入されたことを知っています。 今回、楽しいコンポーネントに加えて、Adaは数学、1つの数値システムから別の数値システムへの変換、および「サイクル」と「ワーキングセル」の基本概念について説明します。 すべてのタスクにはひどい伝説があり、情熱を刺激します。







以下は、Adaが解決を求めるタスクの1つの例です。

夕方には、ベランダに座って、数学の分野での新しい研究を日記に追加するのが好きです。 でも、隣人のサンダースさんは、夜になるといつも隣の庭に行くことに気付きました。 私は興味を持ちました。 真夜中を待った後、月明かりに照らされた白い霧が庭の広がりを包むとき、私はその秘密を見つけることにしました。 かろうじて見える月明かりの下で四方から噴水を回っていると、噴水の底に奇妙なパターンがありました。 それは、「1010」、「1100」、「10010」、「1111」の4つの別々に配置された碑文を描写しました。 おそらく、これらは10進法の数値です。 私の仮定が正しいのか、そこにどのような数字がエンコードされているのだろうか? サンダース氏が隠した秘密は何ですか? 何か提案はありますか? 以下に総合的に答えを入力してください。」 または、たとえば次のようになります。「朝、朝食後、父のオフィスに滞在して父の研究を読むのが大好きです。 再び、彼の日記を読んで、私はいくつかの数学的計算のぼろぼろのメモを見つけました。 この数学的計算では、特定の他の数字によって増加(+)または減少(-)された数字がありました。 この計算は、金額が特定の値に達したときにのみ完了しました。 この繰り返し、私は「サイクル」と呼ぶことにしました。 私の用語の正しい定義を実際に確認するために、簡単な数学的計算を行うことにしました。 開始番号が5、増分値が3、サイクルを終了するためのしきい値が35である場合、サイクルが何回アクションを停止した後です。







一部のタスクには手がかりが用意されています。最初に解決できない場合は手がかりを受け取り、3回間違えた場合は答えが通知されます。 対談者が数学またはプログラミングについての会話を開始するとすぐに、エイダは問題を解決するために彼を提供することができます。







ボットは、IDialogダイアログのラッパーを使用して対話者にタスクを発行します。 Randomは、ユーザーにタスクを与えるタイミングをランダムに選択します。 次に、BlobからMicrosoft Azureへのjsonファイルからタスクを設定するダイアログが作成されます。







コードはこちらです。
public async System.Threading.Tasks.Task MessageRecieveAsync(IDialogContext context, IAwaitable<IActivity> result) { IActivity message = await result; string reply = ""; if (tasks.Unreaded) { reply = "           "; await context.PostAsync(reply); reply = tasks.Tasks[tasks.Number].Condition; await context.PostAsync(reply); tasks.Unreaded = false; context.Wait(MessageRecieveAsync); } else if (Helpers.NumParser(message.AsMessageActivity().Text) == tasks.Tasks[tasks.Number].Answer) { reply = "  !"; await context.PostAsync(reply); tasks.Tasking = false; context.Done(this); return; } else { reply = ".    . \n\n\u200C" + tasks.Tasks[tasks.Number].Explanation + "\n\n\u200C    "; await context.PostAsync(reply); context.Done(this); return; } }
      
      





エイダが見たように



エイダは対談者に課題を設定することを学んだという事実に加えて、彼女は見ることも学んだ。 彼女に何らかの写真を送れば、エイダは彼女を見て、彼女に示されていることを言うことができるでしょう。 Adaのビジョンは、 Microsoft Cognitive Servicesを通じて得られました 。 Adaのビジョンを実装するために、Vision APIを使用しました。 写真に人がいる場合、彼女は写真に写っている人の感情的な気分を評価することができます。







ボットが画像を認識するためには、メッセンジャーのメッセージに添付されたファイルを読む必要があります。 このようにします:







コードはこちらです。
 if (activity.Attachments?.Any() == true)
      
      





Attachments



ファイルにファイル(特に画像)がAttachments



れる場合、最初に写真を送信するhttpクライアントを作成します。 次に、写真のストリームを開き、リンクを使用してファイルを作成します。 認識自体は、画像の認識後に取得したDescription



に従って行われます。







コードはこちらです。
 private async System.Threading.Tasks.Task StartRecognize(MemoryStream photo) { try { \_analysisResult = await \_visionServiceClient.DescribeAsync(photo); \_isVision = true; } catch { } } public async Task<string> MakeSomeSummary(MemoryStream photo) { string result = "nothing"; await StartRecognize(photo); if (\_isVision) { if (\_analysisResult.Description.Captions.Length > 0) { result = \_analysisResult.Description.Captions[0].Text; } } return await Helpers.TranslateText(result, "ru", await Helpers.GetAuthenticationToken("SubKey")); }
      
      





Adaがロシア語で回答するために、 Translation APIを使用してDescription



翻訳します







コードはこちらです。
 public static async Task<string> TranslateText(string inputText, string language, string accessToken) { string result = ""; string url = " [http://api.microsofttranslator.com/v2/Http.svc/Translate](http://api.microsofttranslator.com/v2/Http.svc/Translate)"; string query = $"?text={System.Net.WebUtility.UrlEncode(inputText)}&to={language}&contentType=text/plain"; using (var client = new HttpClient()) { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); var response = await client.GetAsync(url + query); result = await response.Content.ReadAsStringAsync(); if (!response.IsSuccessStatusCode) return "Hata: " + result; var translatedText = XElement.Parse(result).Value; return translatedText; } return result; } public static async Task<string> GetAuthenticationToken(string key) { string endpoint = " [https://api.cognitive.microsoft.com/sts/v1.0/issueToken](https://api.cognitive.microsoft.com/sts/v1.0/issueToken)"; using (var client = new HttpClient()) { client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", key); var response = await client.PostAsync(endpoint, null); var token = await response.Content.ReadAsStringAsync(); return token; } }
      
      





認識後、答えを作成し、感情が認識されるかどうかを確認します。 ここではもっと面白いです。 Adaは、写真全体の平均的な感情活動を認識し、すべての顔を認識し、写真にどの感情が含まれているかを判断します。 私たちは各人のすべての感情を収集し、各感情の算術平均から病院の平均気温を見つけます;。







コードはこちらです。
 public async Task<string> MakeAboveEmotion(MemoryStream photo) { string result = "nothing"; await StartRecognize(photo); if (\_isEmotion) { double[] aboveEmo = new double[8]; Emotions.ToList().ForEach(x => { aboveEmo[0] += x.Scores.Anger; }); Emotions.ToList().ForEach(x => { aboveEmo[1] += x.Scores.Contempt; }); Emotions.ToList().ForEach(x => { aboveEmo[2] += x.Scores.Disgust; }); Emotions.ToList().ForEach(x => { aboveEmo[3] += x.Scores.Fear; }); Emotions.ToList().ForEach(x => { aboveEmo[4] += x.Scores.Happiness; }); Emotions.ToList().ForEach(x => { aboveEmo[5] += x.Scores.Neutral; }); Emotions.ToList().ForEach(x => { aboveEmo[6] += x.Scores.Sadness; }); Emotions.ToList().ForEach(x => { aboveEmo[7] += x.Scores.Surprise; }); int mx = aboveEmo.ToList().IndexOf(aboveEmo.ToList().Max()); switch (mx) { case 0: result = "anger emotions"; break; case 1: result = "contempt emotions"; break; case 2: result = "disgust emotions"; break; case 3: result = "fear emotions"; break; case 4: result = "happiness emotions"; break; case 5: result = "neutral emotions"; break; case 6: result = "sadness emotions";; break; case 7: result = "surprise emotions"; break; default: result = "nothing"; break; } } return await Helpers.TranslateText(result, "ru", await Helpers.GetAuthenticationToken("SubKey")); }
      
      





エイダが言ったように



ボットの主な機能を忘れないでください。 新しいバージョンでは、連中は意図のデータベースを拡張しようとしました。 今、Ada Lovelaceからの引用を聞くことができます。 たとえば、世界初のプログラマーの生活に関する事実を含む質問の1つに対する回答を得ることができます。







たとえば、数学に関する引用です。

数理科学を抽象的で議論の余地のない真理の巨大なセットだけでなく、その内部の美しさ、対称性、論理的完全性を互いに関連して考慮し、一般的に深い論理的心の利益を満たすと考える人にとっては、数学はさらに深いこの科学が自然界の偉大な事実と、明示的または間接的な関係のこれらの進行中の変化を単独で適切に表現できる言語であることを思い出せば、人類への関心 私たちの直接の物理的知覚で、私たちの周りに、いつの間にか意識的に、または無意識に発生します:このように考える人は、数学的な真実を人の弱い心が彼の創造者の作品を最も効果的に読むことができる道具として考えますが、すべてに特に興味があります自然の原則の理解を促進し、それらを明示的な実用的な形にすることができます。







これが偉大な数学者の考えに飛び込むのに役立つことを願っています。 もちろん、それは基本的な答えの基盤を広げることなしではありませんでした。







TelegramでAdaと話すことができます: @adalovelacebot_bot







ボットの改善に参加したい場合は、 プルリクエストを歓迎します。







著者について






All Articles