您的位置:首页 > 其它

计算两个字符串之间是否包含的简单方法

2013-11-23 16:02 399 查看
在前面介绍了两个字符串之间的匹配度 的算法

计算字符串相似度算法—Levenshtein

它解决了字符串A和B之间的相识度的问题,但是我现在遇到了一个新的问题,就是有字符串A是固定值,字符串C包括了字符串B,希望求出字符串C包括A的比率.但是我并没有找到很好的解决方案.于是自己写了一个可用的简单算法 .

算法原理

1.对固定的字符串A进行二元分词.得到一个字符数组.

2.循环得到的数组,如果数组中的某个字符串在C中存在,计数加1

3.计算下一个数组与上一个数组之间的距离做0.7(可根据实际需求调整)的指数距离并加到计数器

4.将计数/数组的长度,得到一个比例.

代码

public static float IncludeStr(string val, string str)
{
//1.将val二远分词
List<string> words = new List<string>();
int i = 0;
while (i < val.Length)
{
int m =  2;
if (i + m >= val.Length)
m = 1;
words.Add(val.Substring(i, m));
i = i + 2;
}

float num = 0;
int wordIndex = -1;
foreach (string s in words)
{
int index = str.IndexOf(s);

if (index >= 0)
{
num = num + 1;
if (wordIndex > 0)
{
num += (float)Math.Pow(0.7, (index - wordIndex - s.Length + 1));
}
wordIndex = index;
}
}

return num / words.Count;
}

2014.6.27日补

在实际的使用过程中发现上面的效果并不是很好,于是用了一个更加简单暴力的方法。

循环短的那个字符串,长度为n,循环n次

每次取两个字符,一直到最后

如果在长的字符串里面能够找到,将变量m加1

最后返回m/n的比率

发现这种简单粗暴的方法可以解决80%的问题。

public static float includeStr1(string fname, string name)
{
int m = 0;
for (int i = 0; i < name.Length; i++)
{
string s;
if (i + 1 < name.Length)
{
s = name.Substring(i, 2);

}
else
{
s = name.Substring(i);

}
if (fname.IndexOf(s) >= 0)
{
m++;
}
}
return (float)m / (float)name.Length;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: