1. 程式人生 > 其它 >前向匹配演算法(c#實現)

前向匹配演算法(c#實現)

1 前向最大匹配演算法

例項: 以“我們經常有意見分歧”這一句為例,進行分詞,流程如下:

2 前向匹配演算法的步驟

  1. 設定最大匹配的字串長度N;
  2. 從index = word_len開始,選取N個字(符);

  3. 判斷選取的字串在語料庫中是否存在,如果是,選中的字元分詞成功,轉到步驟(4),否則刪除當前字串中最後一個字元,迴圈步驟(3)直到分詞成功。

  4. 指標移動sentence_length-word_len位,重複步驟(3);

注:其中,sentence_length表示整個待分詞的句子長度,word_len位表示所有已經成功分詞的字串長度。

3演算法實現——c#

public
static 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);
}

執行結果為: