第六話 面白い人達が集まっているところで遊んでいたらマイクロソフトが動き出してAI開発をやってくれるらしい 「過去について語ったからって今そうでもないとも限らない」
忙殺されていた、といったな。あれは嘘だ。
実際は今も忙殺されている。
というわけで、今回の進捗も僅少です。ないわけではないところが偉いよね。
具体的には、文中に「?」が含まれていると、謎文字列じゃなくて?のまま保持するというところを実装した。謎文字列が半角なので、周りに合わせて半角クエスチョンマークに変換してある。
foreach (var node in tagger.ParseToNodes(sentence))
{
int number_letter = n.Next(2,6);
string conword = "";
for (int i = 0; i < number_letter; i++)
{
//Random r = new System.Random();
conword += alphabets[n.Next(0, 25)];
}
if (node.CharType > 0)
{
string displayFeatures = node.Surface;
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++)
{
//Random r = new System.Random();
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);
node.suefaceが文字列型の変数で、入力した文を形態素分解し、逐次単語として受け取る。
もし、そのnode.surfaceが「?」だった場合に、文字列に変換する(else節)のではなく、“?”に変換するという処理をif文を用いて行った。
結果がこれである。「こんにちは」が"rxe"に、「?」が”?”に変換されているのが分かる。
ところで、発生条件不明のバグが以前より見られていた。
何もわからない。いくらおだててもバグるらしい。
これは「?」が二つでも正常に動作するかという試みである。正常に動作しなかった。
では、「?」以外の単語が二つダブっているとどうか。
同様にバグった。
エディタを用いて精査してみたところ、スクリプト内のwordsがDictionary型の変数で、入力単語と出力される謎単語をペアで保持しているらしい。Dictionary型をご存じでない方は、文字列同士、文字列と数値など、異なるデータをペアで管理するためのものと考えてほしい。
これは仮説だが、入力された文字列がダブっているとき、新たに謎単語を生成して、同じ入力単語をキーとする異なる謎単語の値があって、それがC#の仕様上ダメなのだろうか。
いずれ単語を辞書型で管理したいと思っていたので、この問題に対処しなくてはならないことはむしろ好都合である。
忙殺されているけれど。
この記事が気に入ったらサポートをしてみませんか?