- using System;
- using System.Collections.Generic;
- using System.Text;
- /*
- ' 迅龙中文分类搜索引擎 v0.6
- '
- ' LGPL 许可发行
- '
- ' 宁夏大学 张冬 康彩 zd4004@163.com
- '
- ' 官网 http://blog.163.com/zd4004/
- */
- namespace XunLong.UrlStringLib
- {
- /// <summary>
- /// URL相似度比较类
- /// </summary>
- public static class ClassUrlString
- {
- /// <summary>
- /// 比较2个url相似度
- /// </summary>
- /// <param name="url1"></param>
- /// <param name="url2"></param>
- /// <returns>相同时返回相似度 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16</returns>
- public static int Url2Url20(string url1, string url2)
- {
- if (url1 == null | url2 == null)
- {
- return 0;
- }
- url1 = url1.Trim();
- url2 = url2.Trim();
- if (url1.Length == 0 | url2.Length == 0)
- {
- return 0;
- }
- if (url1 == url2)
- {
- return 50; //去掉空格完全相同的返回20
- }
- //http://ent.163.com/06/0908/10/2QG8EN3N00031H2L.html
- string[] url1S = url1.Split('/');
- string[] url2S = url2.Split('/');
- if (url1S.Length < 3 | url2S.Length < 3)
- {
- return 0;
- }
- if ((url1S[0] + "_" + url1S[2]) == (url2S[0] + "_" + url2S[2]))
- {
- }
- else
- {
- return 0;
- }
- //识别目录和文件 http;//sss/ss/s= http://dd.dd/ddd
- //目录主体
- string url1Dir = "";
- //文件主体
- string url1File = "";
- //目录深度
- int url1DicNum = 0;
- for (int i = 0; i < url1S.Length-1; i++)
- {
- if (url1S[i].IndexOf('=') > -1 | url1S[i].IndexOf('?') > -1)
- {
- for (int j = i; j < url1S.Length; j++)
- {
- url1File = url1File + url1S[i] + "\";
- }
- //去掉多余的 "\"
- url1File = url1File.Substring(0, url1File.Length - 1);
- break;
- }
- else
- {
- url1Dir= url1Dir+url1S[i]+"\";
- url1DicNum = i - 1;
- }
- }
- if (url1File.Length == 0)
- {
- url1File = url1S[url1S.Length - 1];
- }
- //目录主体
- string url2Dir = "";
- //文件主体
- string url2File = "";
- //目录深度
- int url2DicNum = 0;
- for (int i = 0; i < url2S.Length - 1; i++)
- {
- if (url2S[i].IndexOf('=') > -1 | url2S[i].IndexOf('?') > -1)
- {
- for (int j = i; j < url2S.Length; j++)
- {
- url2File = url2File + url2S[i] + "\";
- }
- //去掉多余的 "\"
- url2File = url2File.Substring(0, url2File.Length - 1);
- break;
- }
- else
- {
- url2Dir = url2Dir + url2S[i] + "\";
- url2DicNum = i - 1;
- }
- }
- if (url2File.Length == 0)
- {
- url2File = url2S[url2S.Length - 1];
- }
- if (url1Dir != url2Dir)
- {
- return 10; // 1 首先 链接的目录部分必须相同 +5 否则返回 10
- }
- if (url1File.IndexOf('?') > -1)
- {
- if (url2File.IndexOf('?') > -1)
- {
- //2个都有参数
- // http://www.baidu.com/s?tn=baiduadv&q1=33&q2=&q3=&q4=&rn=10&lm=0&ct=0&ft=&q5=&q6=
- // // http://www.baidu.com/s.asp?ll=ll
- // 1 判断其名是否相同
- char[] x = { '?'};
- string[] url1FileName = url1File.Split(x);
- string[] url2FileName = url2File.Split(x);
- if (url1FileName[0] == url2FileName[0])
- {
- string CanShu1 = url1FileName[1];
- string CanShu2 = url2FileName[1];
- char[] xx ={'=','&'};
- string[] Can1S = CanShu1.Split(xx);
- string[] Can2S = CanShu2.Split(xx);
- int Tmp2 = 0;
- if (CanShu1.IndexOf('&') >-1)
- {
- if (CanShu2.IndexOf('&') >-1)
- {
- Tmp2 = 1;
- }
- else
- {
- return 12;
- }
- }
- else
- {
- if (CanShu2.IndexOf('&') >-1)
- {
- return 12;
- }
- else
- {
- Tmp2 = 2;
- }
- }
- int TmpNum = 0;
- if (CanShu1.Length != CanShu2.Length)
- {
- return 12 + Tmp2;
- }
- else
- {
- for (int h = 0; h < CanShu1.Length; h++)
- {
- if (CanShu1[h] == CanShu2[h])
- {
- TmpNum = TmpNum + 1;
- }
- }
- if (14 + TmpNum > 40)
- {
- return 40;
- }
- else
- {
- return 14 + TmpNum;
- }
- }
- }
- else
- {
- return 10;
- }
- }
- else
- {
- return 10; //一个有参数 1个没参数
- }
- }
- else
- {
- if (url2File.IndexOf('?') > -1)
- {
- return 10; //一个有参数 1个没参数
- }
- else
- {
- //2个没有参数
- if (url1File.IndexOf('.') > 0)
- {
- if (url2File.IndexOf('.') > 0)
- {
- //2个都有扩展名
- string[] url1FileExName = url1File.Split('.');
- string[] url2FileExName = url2File.Split('.');
- if (url1FileExName[url1FileExName.Length - 1] == url2FileExName[url2FileExName.Length - 1])
- {
- string EXN = url1FileExName[url1FileExName.Length - 1];
- if (EXN.ToLower() == "htm" | EXN.ToLower() == "html" | EXN.ToLower() == "shtml")
- {
- if (12 + url2DicNum > 18)
- {
- return 18;
- }
- else
- {
- return 12 + url2DicNum;
- }
- }
- else
- {
- if (11 + url2DicNum > 16)
- {
- return 16;
- }
- else
- {
- return 11 + url2DicNum;
- }
- // return 11 + url2DicNum;
- }
- }
- else
- {
- return 10;
- }
- }
- else
- {
- return 10;
- }
- }
- else
- {
- if (url2File.IndexOf('.') > 0)
- {
- return 10;
- }
- else
- {
- //2 个都没有扩展名
- // return 11 + url2DicNum;
- return 13;
- }
- }
- }
- }
- // 比较原则
- // 对于有参数的
- // 2 文件相同 参数结构相同 + 5 如果参数结构不同 直接返回 12
- // 3 参数 相同1项 +1
- // 对于没有参数的
- //
- // 1 扩展名相同 + 1 不同 直接返回 10
- // 根据目录层次 不算域名层n层 + n
- //
- }
- /// <summary>
- /// URL相似度 同一站点 返回 10 属于1组模版 返回 12
- /// </summary>
- /// <param name="url1"></param>
- /// <param name="url2"></param>
- /// <returns></returns>
- public static int Url2Url(string url1, string url2)
- {
- url1 = url1.ToLower().Trim();
- url2 = url2.ToLower().Trim();
- if (url1 + "/" == url2 | url1 == url2 + "/")
- {
- return 12;
- }
- int RT = 0;
- if (url1.IndexOf("http://") != 0 | url2.IndexOf("http://") != 0)
- {
- return 0;
- }
- string[] ax1 = url1.Split('/');
- string[] ax2 = url2.Split('/');
- if (ax1[2] == ax2[2])
- {
- RT = 10; //在同一站点
- }
- else
- {
- return 0;
- }
- if (ax1.Length != ax2.Length & ax1[2] == ax2[2])
- {
- return 10; //两者在同1站点
- }
- for (int i = 2; i < ax1.Length - 1; i++)
- {
- if (ax1[i] != ax2[i])
- {
- return 10;
- }
- }
- string url1file = ax1[ax1.Length - 1];
- string url2file = ax2[ax2.Length - 1];
- // 检查是否有 ? 出现
- if (url1file.IndexOf('?') > -1)
- {
- if (url2file.IndexOf('?') > -1)
- {
- string[] kzms1 = url1file.Split('?');
- string[] kzms2 = url2file.Split('?');
- if (kzms1[0] == kzms2[0])
- {
- return 12;
- }
- else
- {
- return 10;
- }
- }
- else
- {
- return 10;
- }
- }
- else
- {
- if (url2file.IndexOf('?') > -1)
- {
- return 10;
- }
- else
- {
- // 没有参数 检测扩展名是否相同
- if (url1file.IndexOf('.') == -1 | url2file.IndexOf('.') == -1)
- {
- return 10;
- }
- else
- {
- string[] kzm1 = url1file.Split('.');
- string[] kzm2 = url2file.Split('.');
- if (kzm1[kzm1.Length - 1] == kzm2[kzm2.Length - 1])
- {
- return 12;
- }
- else
- {
- return 10;
- }
- }
- }
- }
- }
- }
- }