如何在C#中计算两个字符串之间的相似性
本文关键字:两个 字符串 之间 相似性 计算 | 更新日期: 2023-09-27 18:27:20
我想评估两个字符串之间的相似性(包括大小写),并给出一个介于0和1之间的值。
我尝试了Levenstein距离实现,但它只给出整数,不比较内部字母。
例如,比较"ABCD"answers"ABCD"可以得出3的距离,"AOOO"也可以得出3,但显然"ABCD)"比"AOOO(AOOO)"更匹配。
因此,与"ABCD"相比,我希望"ABCD"与"ABCD"最相似,然后是"AOOO",再是"AOOOO"
我也看了这里,但我不是在寻找一个可变长度的算法。
感谢
试试这样的
double d = (LevenshteinDist(s, t) + LevenshteinDist(s.ToLower(), t.ToLower())) /
2.0 * Math.Max(s.Length, t.Length);
如果你想把大小写差异的重要性降低到字母差异,你可以给这个术语不同的权重
double d = (0.15*LevenshteinDist(s, t) +
0.35*LevenshteinDist(s.ToLower(), t.ToLower())) /
Math.Max(s.Length, t.Length);
请注意,权重的总和为0.5,因此2.0的除法已过时。
使用自定义表T调整Levenstein距离。让插入成本=1。删除的成本也是1。设T(c,d)表示用d代替c的惩罚。T(c,d)应为<=2.
将Max(n,m)定义为长度为n和m的字符串的最大理论距离。显然,Max(n、m)=n+m。
定义距离(s,t)是将s更改为t的成本除以Max(s,t)。给你。
定义T时要小心,使定义服从距离公理:
- 距离(s,s)=0
- 距离(s,t)=距离(t,s)
- 距离(s,t)<=距离(s,u)+距离(u,t)
然后在更多的情况下它会更有用。
bool check(string[] a, string s)
{
for (int i = 0; i < a.Length; i++)
if (s == a[i])
return true;
return false;
}
public double simi(string string1, string string2)
{
int sub1 = 0;
int sub2 = 0;
string[] sp1 = new string[string1.Length - 1];
string[] sp2 = new string[string2.Length - 1];
string[] sp3 = new string[string1.Length - 1];
string[] sp4 = new string[string2.Length - 1];
for (int i = 0; i < string1.Length - 1; i++)
{
string x = "";
x = string1.Substring(i, 2);
sp1[sub1] = x;
++sub1;
}
for (int i = 0; i < string2.Length - 1; i++)
{
string x = "";
x = string2.Substring(i, 2);
sp2[sub2] = x;
++sub2;
}
int j = 0, k = 0;
for (int i = 0; i < sp1.Length; i++)
if (check(sp3, sp1[i]) == true)
{
continue;
}
else
{
sp3[j] = sp1[i];
j++;
}
for (int i = 0; i < sp2.Length; i++)
if (check(sp4, sp2[i]) == true)
{
continue;
}
else
{
sp4[k] = sp2[i];
k++;
}
Array.Resize(ref sp3, j);
Array.Resize(ref sp4, k);
Array.Sort<string>(sp3);
Array.Sort<string>(sp4);
int n = 0;
for (int i = 0; i < sp3.Length; i++)
{
if (check(sp4, sp3[i]))
{
n++;
}
}
double resulte;
int l1 = sp3.Length;
int l2 = sp4.Length;
resulte = ((2.0 * Convert.ToDouble(n)) / Convert.ToDouble(l1 + l2)) * 100;
return resulte;
}