1. 程式人生 > >找出兩個字串中相同的詞語,返回一個分值

找出兩個字串中相同的詞語,返回一個分值

前言:

由於筆者工作的需求,給定一個字串,需要從一堆字串中找出與其最相似的字串,網路的一些演算法發現跟自己的需求不匹配,於是自己寫了一個,話不多說,請看下文。

目標:

給定兩個字串,能將兩個字串中相同詞語的相似度返回一個分值。

計分方式:

分值跟次數的個數有關,具體舉例如下:

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;
        }

以上方法可以用於兩個字串的匹配,如有問題,請留言。