/// <summary> /// 野球選手名読み込み /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ToolStripMenuItemLoadNameDB_Click(object sender, EventArgs e) { if (openFileDialogYakyuuName.ShowDialog() == DialogResult.OK) { yakyuuNameDic = new YakyuuDic(openFileDialogYakyuuName.FileName); } }
/// <summary> /// 文字列からマッチする母音のラティス構造を生成します. /// </summary> /// <param name="tokens">文字列と同じ長さを持った空の配列</param> /// <param name="str">対象文字列</param> /// <param name="dic">野球名辞書データ</param> /// <param name="index">最初に呼び出す時はゼロ</param> private void makeLattice(YakyuuTokens[] tokens, String str, YakyuuDic dic, int index) { string _str = ""; int length = str.Length; tokens[index] = new YakyuuTokens(); for (int i = 1; index + i <= length; i++) { // 文字を1文字読みこむ _str += str[index + i - 1]; // 該当の母音が存在するかを探す var readv = dic.selectReadV(_str); if (readv.Count() != 0) { // 末尾まで探索が終了したらそれを辞書に追加する if (index + i == length) { Debug.WriteLine("find token " + _str); tokens[index].token.Add(_str, null); return; } // もし一つでも存在し, かつその先の探索が行なわれてなければ // そこから再帰的に探索をする. if (tokens[index + i] == null) { makeLattice(tokens, str, dic, index + i); } // その先からの探索が成功していれば // 単語の追加を行う. if (tokens[index + i].token.Count != 0) { Debug.WriteLine("find token " + _str); tokens[index].token.Add(_str, tokens[index + i]); } } } }
/// <summary> /// 文字列からラティス構造を生成する. /// </summary> /// <param name="str">対象文字列</param> /// <param name="dic">野球選手名辞書オブジェクト</param> public LatticedString(String str, YakyuuDic dic) { tokens = new YakyuuTokens[str.Length]; baseString = str; makeLattice(tokens, str, dic, 0); }
/// <summary> /// フォームが読まれた時の動作. /// 辞書データをnull初期化してるだけ. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load(object sender, EventArgs e) { yakyuuNameDic = null; }
/// <summary> /// 歌詞を野球選手名の読みのトークン列に変換する関数 /// </summary> /// <param name="dic"></param> /// <returns></returns> public String convertLyricYakyuu(YakyuuDic dic) { LyricsYakyuu.Flush(); StringReader lybRd = new StringReader(lyricsVowel.ToString()); String lyb; StringWriter buf = new StringWriter(); StringWriter bufY = new StringWriter(); var dt = dic.ReadTable; { foreach (var r in dt) { Debug.WriteLine(r.NameReadV); } } lyb = lybRd.ReadLine(); while (lyb != null) { foreach (Char c in lyb) { buf.Write(c); //バッファに文字を1文字追加 var _buf = buf.ToString(); if (_buf.Length >= 2) { // 完全一致の検索 var rows = from r in dt where r.NameReadV == _buf select r; if (rows.Count() != 0) // 一致する物があった場合 { // その選手名をバッファに書きこむ bufY.Write(rows.ElementAt(0).NameRead); bufY.Write("/"); Debug.WriteLine(_buf + ":" + rows.ElementAt(0).NameRead); buf = new StringWriter(); } else { // 前方一致の検索 var rowsp = from r in dt where _buf.StartsWith(r.NameReadV) select r; //var rowsp = dt.Select("readV like \'" + buf.ToString() + "%\'"); if (rowsp.Count() == 0 && _buf.Length > 2) { // 前方一致も無かった場合は var length = _buf.Length; string _lyb = _buf.Substring(0, length - 1); // 1文字だけ消してみる var aimai = from r in dt where r.NameReadV.Length == length && r.NameReadV.Substring(0, length - 1) == _lyb select r; //var q = "readV like \'" + _lyb.Substring(0, _lyb.Length - 1) + "%\'"; //var aimai = dt.Select(q); if (aimai.Count() == 0) // やっぱりヒットしなかったら { //バッファの内容をそのまま書きこむ bufY.Write("(" + _buf + ")"); } else { // ヒットしたらそれを入れる bufY.Write("[" + aimai.ElementAt(0).NameRead + "]/"); Debug.WriteLine(_buf + ":" + aimai.ElementAt(0).NameRead); } buf = new StringWriter(); } } } } // 行を全て読んでしまったらバッファを書きこむ bufY.Write(buf.ToString()); buf = new StringWriter(); // 選手名バッファの内容を変換後歌詞に書きこむ LyricsYakyuu.WriteLine(bufY.ToString()); bufY = new StringWriter(); // もう一行読みこむ lyb = lybRd.ReadLine(); } return(LyricsYakyuu.ToString()); }