お疲れ様です。たなしょです。
今日は辞書クラスを改良して形態素解析した名詞を辞書に取り組めるようにしていきたいと思います。この実装でだいぶ会話のバリエーションが増えますね。
辞書クラスと単語を分割するクラスの改良
studyメソッドにランダム辞書に登録する処理とパターン辞書に登録する処理を2つ記載していきます。
1.ランダム辞書に存在しない場合、ユーザー発言をランダム辞書に追加します。
public void StudyRandom(string userInput)
{
if (_randomList.Contains(userInput) == false)
{
_randomList.Add(userInput);
}
}
2.パターン辞書に追加します。ここはちょっと複雑なので細かく説明します。
2-1.形態素と品詞情報を取り出します
foreach (string[] morpheme in parts)
2-2.品詞情報がKeyWordCheck()にマッチするか判定します。
if (Analyzer.KeyWordCheck(morpheme[1]).Success)
2-3パターンマッチした場合はParseItemオブジェクトに格納します。
foreach (ParseItem item in _patternList)
{
if (!string.IsNullOrEmpty(item.Match(userInput)))
{
depend = item;
break;
}
}
2-4.ParseItemオブジェクトに存在する場合はParseItemに名詞を追加、形態素のパターンにマッチしなかった場合はパターン辞書に追加します。
if (depend != null)
{
depend.AddPhrase(userInput);
}
else
{
_patternList.Add(new ParseItem(
morpheme[0],
userInput));
}
2-5.キーワード認定されたユーザ発言を辞書に追加します。
public void AddPhrase(string userInput)
{
foreach (var p in _phrases)
{
if (p["phrase"] == userInput)
break;
}
_phrases.Add(
new Dictionary<string, string> {
{ "need", "0" }, { "phrase", userInput }
});
}
2-6.パターンリストの整形して辞書型に保存して、パターン辞書ファイルに書き込みます。
List<string> patternLine = new();
foreach (ParseItem item in _patternList)
{
patternLine.Add(item.MakeLine());
}
File.WriteAllLines(
@"dics\pattern.txt",
patternLine,
System.Text.Encoding.UTF8
);
2-7.辞書に登録するためのテンプレートを整形します。名詞とそれに対する応答フレーズを作成しています。イメージは0##晴れ\t0##今日は晴れだね|0##晴れているよ
のような文字列を整形する。
public string MakeLine()
{
string pattern = Convert.ToString(_modify) + "##" + _pattern;
StringBuilder responseList = new();
foreach (var dic in _phrases)
{
responseList.Append("|" + dic["need"] + "##" + dic["phrase"]);
}
return pattern + "\t" + responseList;
}
少しは賢くなったカノジョ
pattern.txtにも今回のワードが保存されていました。
最後に
形態素解析を取り入れたことによって会話のバリエーションがアップしました!
明日はテンプレートを用意してさらに会話していきます。
残すところあと3日ですね。最後まで頑張ります。