最近在做乙個虛擬客服的專案,簡單的了解了一下中文語境的集中句子相似度的演算法
看了大佬的專案和部落格,不明覺厲,鏈結送上:
基於音形碼,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 對兩個要計算的字串進行分詞,使用隱馬爾科夫模型 也可不用 由於不同的分詞演算法,所以分出來的結果可能不一樣 也會導致相似度會有...