第八話 面白い人達が集まっているところで遊んでいたらマイクロソフトが動き出してAI開発をやってくれるらしい 「手で触れられて始めて存在を確認する人もいるらしい」
前回の続き。
今日、大学院の教授から「このままだと修士の期間もう六ヶ月追加だけど延長する?」ってカラオケみたいなノリで言われたのでこのプロジェクトが29日の最終発表でいい感じに終わってくれることがちょうどよい。せっかく合間合間にやってきたから成果も出したい。
先回、メンターの方から「言語感が出てきていい!」と言っていただいたので、言語感をより増すために、出力を容易に発音できる単語にすることを試みた。以下全スクリプト。
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
//
// Generated with Bot Builder V4 SDK Template for Visual Studio EchoBot v4.9.2
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 MeCab;
using System.Collections;
namespace _02conlang_maker.Bots
{
public class EchoBot : ActivityHandler
{
protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
string[] consonants = new string[] { "b", "d", "f", "g", "j", "k", "l", "m", "n", "p", "s", "t", "v" };
string[] vowels = new string[] { "a", "i", "u", "e", "o" };
string[] syllable = new string[] { "cv", "cvc", "ccvc", "cvcc", "ccvcc" };
{
Random n = new System.Random();
var replyText = "";
var words = new Dictionary<String, String>();
var sentence_pseudo = turnContext.Activity;
var parameter = new MeCabParam();
var tagger = MeCabTagger.Create(parameter);
var sentence = sentence_pseudo.RemoveRecipientMention();
foreach (var node in tagger.ParseToNodes(sentence))
{
string conword = "";
string cv_disignator = syllable[n.Next(0, 5)];
if (node.CharType > 0)
{
for (int i = 0; i < cv_disignator.Length; i++)
{
if (syllable[i] == "c")
{
conword += consonants[n.Next(0, 13)];
}
else if (syllable[i] == "v")
{
conword += vowels[n.Next(0, 5)];
}
string displayFeatures = node.Surface;
if (words.ContainsKey(displayFeatures))
{
;
}
else
{
if (node.Surface == "?")
{
words.Add(displayFeatures, "?");
}
else
{
if (node.Surface == "!")
{
words.Add(displayFeatures, "!");
}
else
{
words.Add(displayFeatures, conword);
}
}
}
replyText += $"{words[node.Surface]} ";
}
}
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);
}
}
}
}
}
多分重要なのは以下。
string[] consonants = new string[] { "b", "d", "f", "g", "j", "k", "l", "m", "n", "p", "s", "t", "v" };
string[] vowels = new string[] { "a", "i", "u", "e", "o" };
string[] syllable = new string[] { "cv", "cvc", "ccvc", "cvcc", "ccvcc" };
中略
string cv_disignator = syllable[n.Next(0, 5)];
if (node.CharType > 0)
{
for (int i = 0; i < cv_disignator.Length; i++)
{
if (syllable[i] == "c")
{
conword += consonants[n.Next(0, 13)]
}
else if (syllable[i] == "v")
{
conword += vowels[n.Next(0, 5)];
}
c,vはそれぞれconsonant(子音)とvowel(母音)を意味している。
前回までの実装だと、xslt, tkcvといったどう読めばいいかわからないような単語を出力していた。まあ文字だけの言語と考えればそれでも成立すると思うが。
せっかくなので(?)、vol, tesk, maといった、口で言えるような単語を目指すことにした。子音に関して、一部の文字しか用いていないのは、わかりやすさ重視である。(cは[k]なのか[s]なのかわからない、kがあるからqはいらない、など。)
経験上、cv, cvc, ccvc, cvcc, ccvccらへんが揃っておけばいい感じに言語感出ると思ったのでそうしている。このへんは思いつき。
結果こう。
何も返ってこない。エラーメッセージさえも。
無限ループかなんかになっているのかもしれない。
この記事が気に入ったらサポートをしてみませんか?