判断两个字符串的相似度很容易,关键是如何提高速度。在搜索引擎中,往往有上百万的网页,怎么去重。速度最快。下面用一个hash的办法来快速计算相似度。
首先,我们用hash的方法把一个字符串变为一个整数数组:
void
hashString(
const
string
&
buf,
set
<
int
>
&
ret)
{
for(int i = 0; i < buf.length() - 4; ++i)
{
string tmp;
tmp += buf[i];
tmp += buf[i+1];
tmp += buf[i+2];
tmp += buf[i+3];
ret.insert(hash(tmp));
}
}
相当于每4个字节把字符串hash成一个整数存起来。
那么如果我们有两个字符串 a, b
我们首先把它们hash成两个集合sa,sb
假设 sa sb的交集有 k个元素
那么相似度就可以定义为
k / max(|sa|,|sb|)
然后给定一个阈值就可以去重了。
这个方法特点是效果比较好,速度很快。
首先,我们用hash的方法把一个字符串变为一个整数数组:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
相当于每4个字节把字符串hash成一个整数存起来。
那么如果我们有两个字符串 a, b
我们首先把它们hash成两个集合sa,sb
假设 sa sb的交集有 k个元素
那么相似度就可以定义为
k / max(|sa|,|sb|)
然后给定一个阈值就可以去重了。
这个方法特点是效果比较好,速度很快。