Template Responderは、名詞を取り除いた文章を用意しておき、入力文から名詞を抽出して当てはめて文章を作成する。
ほとんど日本語にならないので、あまり使い道はないかも。
Botの3つ目の応答は、入力文に名詞がないのでRandom Responderが返答していると思う。
一応ソースを掲載しておく。 学習の部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
private void studyTemplate(string input, List<string> output) { if (output.Count == 0) return; var str = input; var cnt = 0; if (output.Count > 2) cnt = 2; else cnt = output.Count; for (var i = 0; i < cnt; i++) str = str.Replace(output[i], "%noun" + (i + 1).ToString() + "%"); var num = cnt.ToString(); if (!_template.ContainsKey(num)) _template.Add(num, new List<string>() { str }); else { var list = _template[num]; if (!list.Contains(str)) { list.Add(str); _template[num] = list; } } |
文章作成部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public override string response(string input) { var list = _morph.analyze_noun(input); var output = ""; if (list.Count > 1) { var nn = new Random().Next(1, 3); var nouns = _utils.randomList2(list, nn); output = _utils.randomList(_template[nouns.Count.ToString()]); for(var i = 0; i < nn; i++) output = output.Replace("%noun"+(i+1).ToString() + "%",nouns[i]); } else if (_random.Count == 1) { output = _utils.randomList(_template["1"]); output = output.Replace("%noun1%", list[0]); } else output = _utils.randomList(_random); return output; } |