LoginSignup
2
0

More than 1 year has passed since last update.

お疲れ様です。たなしょです。
今日は昨日に引き続きテンプレート用の返信する処理を作成していきます。

テンプレート返信用クラスを作成する

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;

実行してみるとカノジョの文言のバリエーションがさらに増えて、会話らしい会話ができるようになりました!
image.png
ダイアログを見てみるとそこそこ会話できるようになっています。

最後に

テンプレート辞書を用いた会話ができました。
これで少しは楽しく会話できそうです!
明日は最終日なので今までの総括をします。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0