首页 新闻 赞助 找找看

求 C# 文本去重算法

0
悬赏园豆:80 [已关闭问题] 关闭于 2013-03-28 12:26

现在需要建立一个文章资源库,
很多相似的文章资源添加一次就够了,
需要把相似度达到80%的文章不能再添加入库

需求类似百度大规模网页去重判断

网上搜索了很多论文
也看了几个字符串相似度计算的算法
但是如果文本很长的话 误差就比较大 可行性不高
诚心求助

Frida-的主页 Frida- | 初学一级 | 园豆:80
提问于:2012-08-14 22:42
< >
分享
所有回答(2)
0

把句号作为一个提取的位置,分别在句号两边提取L/2长的词串构成网页的一个特征码。之所以要在句号的两边分别取L/2长的词串,是因为在 L/2-1和L/2处的字很难构成一个词,因此更能保证特征码的唯一性。下面是几个特征码的例子:“百七十二人其中很多是”,“的社会效果但是大陆报”,“率几十倍这表明法律”。

参考文章:

http://ir.hit.edu.cn/ir_papers/Vol_1/%B4%F3%B9%E6%C4%A3%CD%F8%D2%B3%BF%EC%CB%D9%C8%A5%D6%D8%CB%E3%B7%A8.pdf

 

网上还有说用hash算法去重复,好像好厉害的样子,LZ可以百度

CrazyJinn | 园豆:799 (小虾三级) | 2012-08-15 08:23
0

楼主可以在网上查一下LD算法。我在一个项目中用到了,效果还不错。当然我比较的字符串长度比较小。

 #region  比较字符串相似度
        private static int min(int one, int two, int three)
        {
            int min = one;
            if (two < min)
            {
                min = two;
            }
            if (three < min)
            {
                min = three;
            }
            return min;
        }
        public static int LD(String str1, String str2)
        {
            int[,] d;     // 矩阵 
            int n = str1.Length;
            int m = str2.Length;
            int i;     // 遍历str1的 
            int j;     // 遍历str2的 
            char ch1;     // str1的 
            char ch2;     // str2的 
            int temp;     // 记录相同字符,在某个矩阵位置值的增量,不是0就是1 
            if (n == 0)
            {
                return m;
            }
            if (m == 0)
            {
                return n;
            }
            d = new int[n + 1, m + 1];
            for (i = 0; i <= n; i++)
            {     // 初始化第一列 
                d[i, 0] = i;
            }
            for (j = 0; j <= m; j++)
            {     // 初始化第一行 
                d[0, j] = j;
            }
            for (i = 1; i <= n; i++)
            {     // 遍历str1 
                ch1 = str1[i - 1];
                // 去匹配str2 
                for (j = 1; j <= m; j++)
                {
                    ch2 = str2[j - 1];
                    if (ch1 == ch2)
                    {
                        temp = 0;
                    }
                    else
                    {
                        temp = 1;
                    }
                    // 左边+1,上边+1, 左上角+temp取最小 
                    d[i, j] = min(d[i - 1, j] + 1, d[i, j - 1] + 1, d[i - 1, j - 1] + temp);
                }
            }
            return d[n, m];
        }

        //返回两个字符串的相似度,返回一个0到100之间的整数,值越大,表示相似度越高
        public static int similar(String newStr, String targetStr)
        {
            int ld = LD(newStr, targetStr);
            double i = 1 - (double)ld / (double)Math.Max(newStr.Length, targetStr.Length);
            int similar = Convert.ToInt32(Math.Round((Convert.ToDecimal(i)), 2, MidpointRounding.AwayFromZero) * 100);
            return similar;
        }
        #endregion
穿裤子的云 | 园豆:162 (初学一级) | 2012-08-15 17:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册