找出兩個字串中相同的詞語,返回一個分值
阿新 • • 發佈:2019-01-06
前言:
由於筆者工作的需求,給定一個字串,需要從一堆字串中找出與其最相似的字串,網路的一些演算法發現跟自己的需求不匹配,於是自己寫了一個,話不多說,請看下文。
目標:
給定兩個字串,能將兩個字串中相同詞語的相似度返回一個分值。
計分方式:
分值跟次數的個數有關,具體舉例如下:
source="我有一個小毛驢,我從來都不騎"
target="我哈一個哈哈哈,我從來哈哈哈"
上邊兩個詞語中,相同的字有“我,一個,我從來”,因為我們說的是詞,所以我不算
所以相同詞語為“一個,我從來”,“一個”有兩個字,記兩分,“我從來”有三個字記三分,共計5分。
程式碼思想:
取source的第一個詞“我有”,看target中是否包含,如果不包含則不計分,繼續看下一個詞“有一”,如果包含,繼續擴大
詞的長度“有一個”,還是繼續前邊的方法,直到將source全部遍歷完,
程式碼實現:
本文選用C#來實現程式碼,如果讀者使用其他語言,看程式碼註釋自己修改一下即可,註釋寫的很詳細。
/// <summary> /// 目標: /// 給定兩個字串,能將兩個字串中相同詞語的相似度返回一個分值 /// 計分方式: /// 分值跟次數的個數有關,具體舉例如下: /// source="我有一個小毛驢,我從來都不騎" /// target="我哈一個哈哈哈,我從來哈哈哈" /// 上邊兩個詞語中,相同的字有“我,一個,我從來”,因為我們說的是詞,所以我不算 /// 所以相同詞語為“一個,我從來”,“一個”有兩個字,記兩分,“我從來”有三個字記三分,共計5分。 /// 程式碼思想: /// 取source的第一個詞“我有”,看target中是否包含,如果不包含則不計分,繼續看下一個詞“有一”,如果包含,繼續擴大 /// 詞的長度“有一個”,還是繼續前邊的方法,直到將source全部遍歷完, /// </summary> /// <param name="source"></param> /// <param name="target"></param> /// <returns>分數</returns> public static int CountSameWords(string source,string target) { //對於長度為0的字串返回分數0 int sum = 0; int columnSize = source.Length; int rowSize = target.Length; if (columnSize == 0) { return rowSize; } if (rowSize == 0) { return columnSize; } //定義一個集合,用來儲存相同的詞語,防止一個字串中出現重複詞語,重複計分 ArrayList tempList=new ArrayList(); //遍歷source的詞語, for (int i=0;i<source.Count()-1;i++) { //定義詞語初始的長度 int k = 2; //while迴圈後的k值就是這個詞語的長度 while (i+k<=source.Count()&&target.Contains(source.Substring(i, k))) { //也可把K++放在source.Substring(i, k++)中 k++; } //k=2時,說明沒有相同的,同時判斷是否有重複詞語 if (k>2) { string tempStr = source.Substring(i, k - 1); if (!tempList.Contains(tempStr)) { //滿足條件的話加入到鍵值對集合中 tempList.Add(tempStr); //防止下次迴圈繼續計算重複的詞 i = i + k - 2; //計入總分 sum = sum + k - 1; } } } return sum; }
以上方法可以用於兩個字串的匹配,如有問題,請留言。