字串關聯度求解演算法改進模型

2021-08-11 02:45:42 字數 4044 閱讀 1140

注意要把string型別的詞轉成unicode32的,這樣計算的長度就是字元的長度

如果文字中有英文,如「abc」,把」abc」看成乙個詞來計算,返回乙個vector>型別的詞

vector

> getrealword(vector

result)

else

temp.push_back(*it);}}

realword.push_back(temp);

return realword;

}

#include "utf8.h"

std::vector

utf8toutf32(const

char* str)

//計算最大長度

int max(std::string str1, std::string str2)

int min(int a,int b)
//求兩個vector向量是否有交集

void vectorintersect(const

vector

& v1, const

vector

& v2, vector

& des)//求交集

else

if (v1[i] < v2[j]) //不相等時,指示較小元素額標記加一

else

}}//判斷字串是否部分包含另乙個字串

bool searchpartstr(std::string str1, std::string str2)

else

}

bool searchallstr(const

char *psource, const

char *psearch)

//遍歷字串 找到第乙個相同的字元位置 firstcharnum

for (int i = 0; i < lensource; i++)

}if (firstcharnum > lensource || (lensource - firstcharnum) < lensearch)

//首字元之後字元連續相同返回true

int j = 1;

for (int i = firstcharnum + 1; i < (firstcharnum + lensearch); i++)

else

}return

true;

}

參考文章《編輯距離及編輯距離演算法》

編輯距離矩陣

//編輯距離矩陣

int ** geteditmatrix(std::string str1, std::string str2)

for (int i = 0; i < max1 + 1; i++)

for (int i = 0; i < max2 + 1; i++)

for (int i = 1; i < max1 + 1; i++)

else

ptr[i][j] = min(temp, ptr[i - 1][j - 1] + d);}}

return ptr;

}

編輯距離

//編輯距離

double geteditdistance(std::string str1, std::string str2)

delete ptr;

ptr = null;

return dis;

}

//兩個字串之間最長的相同子字串的長度

int longestcommonsubstring(std::string s1, std::string s2)

else }}

return dp[len1][len2];

}

//記錄對角線上元素值第一次發生改變的元素行下標

int getfirstchange(std::string str1, std::string str2)

}/*cout << ptr[i][j] << "";*/

}/*cout << endl;*/

}for (int i = 0; i < max1 + 1; i++)

delete ptr;

if (!result.empty())

else

}

**上的公式

//計算關聯度

double getcorrelation(std::string str1, std::string str2, int flag)

//字串部分包含編輯距離替換最小字串長度減去字串交集部分長度後取平均值

else

if (searchpartstr(str1.c_str(), str2.c_str(),result) || searchpartstr(str2.c_str(), str1.c_str(),result))

else

/*cout << editlen << endl;*/

correla = double(1 - ( optimilen/ max(str1, str2)));

correlb = double(longestcommonsubstring(str1, str2) / double( optimilen + longestcommonsubstring(str1, str2) + double((m - getfirstchange(str1, str2)) / m)));

/*cout << correla << "," << correlb << endl;*/

//返回兩種方法的最大值

if ( optimilen != 0)

else

break;

case

1: //方法一: 關聯度=1-(編輯距離/詞最大長度)

correlation = double(1 - (geteditdistance(str1, str2) / max(str1, str2)));

break;

case

2: //方法二: 關聯度=最大子串長度/(最大子串長度+編輯距離+(第乙個字串長度-對角線上元素值第一次發生改變的元素行下標)/第乙個字串長度))

correlation = double(longestcommonsubstring(str1, str2) / double(geteditdistance(str1,str2) + longestcommonsubstring(str1, str2) + double((m - getfirstchange(str1, str2)) / m)));

break;

case

3: //方法三: 關聯度=1/(編輯距離+1)

演算法 求解最大回文子字串

第一種方法 暴力求解,時間複雜度o n 3 兩個巢狀迴圈遍歷字串中的所有子字串,另乙個迴圈用來判斷當前子字串是否為回文。func longestpalindromicstring on3 s string string if ispalindromic true return str 第二種方法 採...

java字串相似度演算法

按順序匹配的,如下 判斷兩個字串相似度,可設定level param strsource 原字串 param strcompared 比較字串 param level 評分閥值 param morecount 比較字串比原字串多多少個限制 return public staticboolean is...

mysql字串相似度 LD演算法獲取字串相似度

最近幫乙個專案分析資料庫瓶頸,於是想先通過sql profiler把sql語句的執行資料抓下來,再對不同語句分類統計。這其中涉及乙個如何識別相似語句的問題,於是上網找了找,乙個叫levenshtein distance的演算法比較簡單,就寫了段 實現了一下,效果還不錯。這個演算法是乙個 人lvens...