/// <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> /// unfoldLatticeから呼びだされる再帰関数 /// </summary> /// <param name="yakyuuTokens">探索を初める位置</param> /// <returns></returns> private List <List <string> > _unfoldLattice(YakyuuTokens yakyuuTokens) { var _llist = new List <List <String> >(); var _list = new List <String>(); if (yakyuuTokens == null) { _list.Add("[end]"); _llist.Add(_list); return(_llist); } foreach (var n in yakyuuTokens.token) { _llist = _llist.Union( _unfoldLattice(n.Value) .Select <List <String>, List <String> >( (s => insertRet(s, n.Key)) ) ).ToList(); } return(_llist); }