幾種句子相似度實現演算法(簡單了解一下)

2021-10-01 04:47:23 字數 2821 閱讀 1027

最近在做乙個虛擬客服的專案,簡單的了解了一下中文語境的集中句子相似度的演算法

看了大佬的專案和部落格,不明覺厲,鏈結送上:

基於音形碼,editdistance的字串糾正相似度演算法

音形碼格式:【韻母,聲母,結構,四角編碼,筆畫數】 共8位

音形碼相似度演算法 參考部落格

todo 字串錯誤匹配演算法 參考

結構、四角編碼 抓取 資料

韻母、聲母 使用pinyin包

筆畫數抓取 資料

入口函式在string_similarity.py

繁簡切換 done ongoing 相似度分值對映調整(sigmod函式對映) todo 字串包含關係 ongoing 相似度演算法新增與調整(bm25)

todo 字串錯位

除了大佬介紹的幾種解決方案,大概介紹一下常用和我能直接理解的三種簡單演算法:

暴力檢索,這種方法最容易想到,也是最容易實現的,從首字母開始挨個的將關鍵字和做比對

package other.string.textmatch;

/** * 暴力檢索

*/public class bfmatch

if (j == keyword.length() - 1) }}

}public static void main(string... args)

}

rk 演算法是對 bf 演算法的乙個改進,rk 對於 bf 的改進就在於嘗試進行一次比較來判斷兩者是否相等。rk 演算法首先計算子串的雜湊值,然後在原字串中取出同樣長度的字串計算雜湊值,如果二者的雜湊值不等那麼他們一定不同。如果雜湊值相同,由於雜湊衝突的存在,也需要再次比對一下是否相同。一般情況肯定高於bf的

package other.string.textmatch;

public class rkmatch }}

}}

public static void main(string... args)

}

「部分匹配值」是指字串字首和字尾所共有元素的長度。字首是指除最後乙個字元外,乙個字串全部頭部組合;字尾是指除第乙個字元外,乙個字串全部尾部組合。以」abcdabd」為例:

「ab」的字首為[a],字尾為[b],共有元素的長度為0;

「abc」的字首為[a, ab],字尾為[bc, c],共有元素的長度0;

「abcd」的字首為[a, ab, abc],字尾為[bcd, cd, d],共有元素的長度為0;

「abcda」的字首為[a, ab, abc, abcd],字尾為[bcda, cda, da, a],共有元素為」a」,長度為1;

「abcdab」的字首為[a, ab, abc, abcd, abcda],字尾為[bcdab, cdab, dab, ab, b],共有元素為」ab」,長度為2;

「abcdabd」的字首為[a, ab, abc, abcd, abcda, abcdab],字尾為[bcdabd, cdabd, dabd, abd, bd, d],共有元素的長度為0。

/**

* 計算部分匹配值

*/public static int calcpartmatch(string keyword)

string subkey = keyword.substring(0, i + 1);

// 求字首

list1.clear();

for (int j = 1; j < subkey.length(); j++)

// 求字尾

list2.clear();

for (int j = 1; j < subkey.length(); j++)

system.out.println("\ni = " + i);

for (string s : list1)

for (string s : list2)

// 求交集

list1.retainall(list2);

if (list1.size() == 0) partmatchval[i] = 0;

else

system.out.println("\n長度為:" + partmatchval[i]);

}return partmatchval;

}

輸入 ada ,輸出:

i = 1

字首:a

字尾:d

長度為:0

i = 2

字首:a

字首:ad

字尾:da

字尾:a

長度為:1

計算得出的部分匹配值就是0、0、1

kmp演算法實現:

/**

* 流程比較複雜,注釋裡比較難寫清,具體可見

* * * 具體的操作流程就是:

* 1.計算 keyword 的部分匹配值

* 2.進行匹配操作,碰到部分匹配成功,下一次 起始點索引 = 原位置 + 已匹配的字元數 - 對應的部分匹配值

*/public static void kmpmatch(string origintext, string keyword)

count++;

if (j == keyword.length() - 1)

}if (count == 0) else

if (i > origintext.length()) break;

}}

輸入:kmpmatch(「asdfasdfasdfasdfadae4rqe***sdfv」, 「ada」);

輸出:找到匹配字串,起始:16 終止:18

標題相似度演算法 乙個簡單的計算文章相似度功能!

在做文章系統的時候,很多時候需要為這篇文章推薦最相近的文章。通過這樣進行匹配,查詢出來的結果是包含 茶 和 功效 的所有文章。在顯示上,第一篇排在第二篇的上面。那麼,如何做到最匹配的文章呢?words 茶,功效 otitle 用靈芝泡茶的功效 otitletwo 泡茶的功效與作用 echo strp...

文字相似度 自己實現文字相似度演算法(餘弦定理)

最近由於工作專案,需要判斷兩個txt文字是否相似,於是開始在網上找資料研究,因為在程式中會把文字轉換成string再做比較,所以最開始找到了這篇關於 距離編輯演算法 blog寫的非常好,受益匪淺。於是我決定把它用到專案中,來判斷兩個文字的相似度。但後來實際操作發現有一些問題 直接說就是查詢一本書中的...

python結巴分詞余弦相似度演算法實現

附上 coding utf 8 from jieba import posseg import math import time def simicos str1,str2 對兩個要計算的字串進行分詞,使用隱馬爾科夫模型 也可不用 由於不同的分詞演算法,所以分出來的結果可能不一樣 也會導致相似度會有...