お疲れ様です。たなしょです。
今日は昨日に引き続きテンプレート用の返信する処理を作成していきます。
テンプレート返信用クラスを作成する
1.ParseItemオブジェクトを1つずつ取り出して、ユーザーの発言にキーワードが含まれていた場合リストに追加します。
public override string Response(string input, int mood, List<string[]> parts)
{
List<string> keywords = new();
foreach (string[] morpheme in parts)
{
if (Analyzer.KeyWordCheck(morpheme[1]).Success)
{
keywords.Add(morpheme[0]);
}
}
2.キーワードの単語が1個以上あり、テンプレート辞書にcountと同じキー値が存在する場合、処理に入ります。
if ((count > 0) && (Cdictionary.Template.ContainsKey(Convert.ToString(count))))
3-1.count変数と同じ数の%noun%をもつ、テンプレート文字列のリストを取得します。
var templates = Cdictionary.Template[Convert.ToString(count)];
3-2.取得したリストからランダムに1個のテンプレートを抽出します。
string temp = templates[rdm.Next(0, templates.Count)];
3-3.正規表現として%noun%を登録します。
Regex re = new("%noun%");
4.キーワードのリストからキーワードを取り出して、テンプレートの%noun%をキーワードに置き換えます。
foreach (string word in keywords)
{
temp = re.Replace(temp, word, 1);
}
return temp;
5.キーワードの単語が0、またはキーワード認定の単語の数が合わない場合はランダム辞書からフレーズを抽出します。
return Cdictionary.Random[rdm.Next(0, Cdictionary.Random.Count)];
各返信用モジュールに形態素解析の結果を取得するパラメーターを追加する
今まで作成してきた返信クラスの引数に形態素解析用のパラメータを追加します。下記はスーパークラスに追加したときのものです。
public virtual string Response(string input, int mood, List<string[]> parts)
本体クラスにテンプレート返信用のオブジェクトを実装する
private TemplateResponder _res_template;
応答フレーズにもテンプレート返答を追加します。
else if (num < 7)
_responder = _res_template;
実行してみるとカノジョの文言のバリエーションがさらに増えて、会話らしい会話ができるようになりました!
ダイアログを見てみるとそこそこ会話できるようになっています。
最後に
テンプレート辞書を用いた会話ができました。
これで少しは楽しく会話できそうです!
明日は最終日なので今までの総括をします。