前向匹配演算法(c#實現)
阿新 • • 發佈:2021-07-01
1 前向最大匹配演算法
例項: 以“我們經常有意見分歧”這一句為例,進行分詞,流程如下:2 前向匹配演算法的步驟
- 設定最大匹配的字串長度N;
-
從index = word_len開始,選取N個字(符);
-
判斷選取的字串在語料庫中是否存在,如果是,選中的字元分詞成功,轉到步驟(4),否則刪除當前字串中最後一個字元,迴圈步驟(3)直到分詞成功。
-
指標移動sentence_length-word_len位,重複步驟(3);
注:其中,sentence_length表示整個待分詞的句子長度,word_len位表示所有已經成功分詞的字串長度。
3演算法實現——c#
publicstatic List<string> SplitSeq1(string senquence, List<string> corpus, int maxLength) { var result = new List<string>(); var alreadySplitWord = string.Empty; while (senquence.Length > 0) { var tempStr = senquence.Length >= maxLength ? senquence.Substring(0, maxLength) : senquence; // 逐個移除字元並匹配 while (tempStr.Length > 0) { if (corpus.Contains(tempStr)) { result.Add(tempStr); alreadySplitWord += tempStr; senquence = senquence.Remove(0, tempStr.Length);break; } tempStr = tempStr.Remove(tempStr.Length - 1, 1); } } return result; } public static string Print(List<string> words) { var result = string.Empty; foreach (var item in words) { result += $"{item}|"; } return result; }
業務呼叫:
static void Main(string[] args) { var corpus = new List<string>(){"我們", "經常", "有", "意見", "分歧"}; var splitResult = SplitSeq1("我們經常有意見分歧", corpus, 5); var result = Print(splitResult); Console.WriteLine(result); }
執行結果為: