第七話 面白い人達が集まっているところで遊んでいたらマイクロソフトが動き出してAI開発をやってくれるらしい 「霧晴れて渦中に在るを知る」
重要なことと緊急なことは違うという話がある。
重要なことは「やりたいこと」で、緊急なことは「やらなくてはならないこと」、緊急なことはいずれやるから、重要なことを先決すべきという。
いま、緊急のタスクを終えたところで、通常であれば一息できるところである。
今回は息抜きに重要なことをした。
前回生じた問題として、同じ単語が複数個含まれる文(文章)を入力するとエラーが起きることがあった。
コレはきっとC#の辞書型の仕様によるものだとアタリを付けて、改善を行った。以下抜粋。
foreach (var node in tagger.ParseToNodes(sentence))
{
int number_letter = n.Next(2, 6);
string conword = "";
if (node.CharType > 0)
{
for (int i = 0; i < number_letter; i++)
{
conword += alphabets[n.Next(0, 25)];
}
string displayFeatures = node.Surface;
if (words.ContainsKey(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);
コレが改善後。
改善前は↓。
foreach (var node in tagger.ParseToNodes(sentence))
{
int number_letter = n.Next(2,6);
string conword = "";
for (int i = 0; i < number_letter; i++)
{
conword += alphabets[n.Next(0, 25)];
}
if (node.CharType > 0)
{
if (node.Surface == "?")
{
string displayFeatures = node.Surface;
words.Add(displayFeatures, "?");
}
else
{
string displayFeatures = node.Surface;
words.Add(displayFeatures, conword);
}
replyText += $"{words[node.Surface]} ";
}
}
await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
改善点はたった一つ。ContainsKeyメゾットを用いた条件分岐を導入したところである。
ContainsKeyは辞書型に、あるデータが存在するかどうかを調べてくれて、今回は入力として与えた単語(スクリプト中の変数だとnode.surface)がもしすでに与えたものであれば何もいじらず、新しい単語のときだけ新しく謎文字列(conword)を追加するようになっている。
結果こう。
「位」がhxvr、「じゃ」がvqu、「で」がnf、「す」がollb、「か」がjoifになっていることなどが分かる。複数の「?」も問題なく対処できている。
また、「ダメ」はrns、「だめ」はxnseになっている。別の単語扱いをされているらしい。
加えて、
テキストを送るたびに単語の辞書は初期化されている。
というわけで、次回までの目標は、
・辞書を保持する設定。たぶん非同期プログラミングとかいうやつが絡んできて難しいやつ。余裕ができたらで。
・異なる表記のものを何とかする
ところで、語順がそのままなのは面白くない。謎言語を謳っておきながら文字列に変えただけとは。
そんななか、こんなものを見つけた。
左下部。Translatorである。外国語に翻訳してくれる。
一旦、外国語に翻訳した後に形態素解析して、それらを順次謎文字列にしたら語順も変わってでも意味は分かりそうな文ができるのでは……?
Google翻訳を用いたイメージ。インドネシア語のsayaは「私」という意味(しってた)なので、日本語で人称を省略しているのを勝手に「私」だと思っている。
ざっと見たかんじ、日本語の口語はかなり翻訳が難しいようだ。
あとは、Mecabで動詞を見つけて格助詞「が」「は」「を」などで名詞の格を見定めてSOVをSVOにしたり、他にもいろんな格があるので色々変えたり。
関係ない愚痴ですが、「英語と中国語は語順が同じ」とかいう言説を見るたびに(どっちもSVOだけどSとVとOだけが語順やないやろ……)といつも思っています。I ate noodle yesterday.と我昨天吃面了。やぞ。
この場合は時を表す副詞句が主語と動詞の間に来るか文末に来るかが違いますよね。はあ、どう実装しよう。
この記事が気に入ったらサポートをしてみませんか?