文本相似度算法(一):LCS动态规划

来源:互联网 发布:美国学费 知乎 编辑:程序博客网 时间:2024/06/08 02:45
#include<iostream>#include<algorithm>#include<string>#include<cassert>#include<fstream>using namespace std;char s1[100];char s2[100];int dp[105][105] = { 0 };int s1_len;int s2_len;/* 求出两文件的最长子序列 */int LCS(){    s1_len = strlen(s1);    s2_len = strlen(s2);    cout << s1_len << " " << s2_len << endl;    for (int i = 1; i <= s1_len; i++)    {        for (int j = 1; j <= s2_len; j++)        {            if (s1[i - 1] == s2[j - 1])                dp[i][j] = dp[i - 1][j - 1] + 1;            else                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);        }    }    return dp[s1_len][s2_len];}/* 打印最长子序列内容 */void Print(int i, int j){    if (i == -1 || j == -1)        return;    if (s1[i] == s2[j])    {        Print(i - 1, j - 1);        cout << s1[i];    }    else    {        if (dp[i - 1][j] > dp[i][j - 1])            Print(i - 1, j);        else            Print(i, j - 1);    }}int main(){    string file_name1("s1.txt");    string file_name2("s2.txt");    ifstream fin;    fin.open(file_name1.data());    if (!fin.is_open())    {        cout << file_name1 << " 无法打开\n";        return -1;    }    fin.getline(s1, 100);    fin.close();    fin.open(file_name2.data());    if (!fin.is_open())    {        cout << file_name2 << " 无法打开\n";        return -1;    }    fin.getline(s2, 100);    fin.close();    int lcs = LCS();    cout << "最长公共子序列长度为:" << lcs << endl;    cout << "最长公共子序列为:";    Print(s1_len - 1, s2_len - 1);    cout << "\n相似度为:" << (lcs * 2 * 100) / (s1_len + s2_len) << "%\n";    return 0;}

此算法是针对最长公共子序列,不是子串。
具体情况远不止如此简单,还要考虑相似度基于的是字符还是单词,具体算法看实际情况。

1 0