AutoBuildModelClassBAK.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:18k
源码类别:

搜索引擎

开发平台:

C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Collections;
  5. using System.Threading;
  6. using System.IO;
  7. namespace XunLong.AutoModelBuilder
  8. {
  9.     /// <summary>
  10.     /// 自动建立模板类
  11.     /// </summary>
  12.     class AutoBuildModelClass
  13.     {
  14.         /// <summary>
  15.         /// 记录采样的数据
  16.         /// </summary>
  17.         struct CaiYangShuJu
  18.         {
  19.             /// <summary>
  20.             /// 采样数据列表
  21.             /// </summary>
  22.             public ArrayList ListOne;
  23.             /// <summary>
  24.             /// 记录本次采样所使用的优先级
  25.             /// </summary>
  26.             public int TNUM;
  27.         
  28.         }
  29.         /// <summary>
  30.         /// 模版的数量
  31.         /// </summary>
  32.         int xnum = 0;
  33.         //D:XunLongXunLong.BINSpiderWEB  
  34.         /// <summary>
  35.         /// 文件系统路径
  36.         /// </summary>
  37.         string aPath = "";
  38.         
  39.         /// <summary>
  40.         /// 模版文件路径
  41.         /// </summary>
  42.         string bPath = "";
  43.         
  44.         /// <summary>
  45.         /// 要生成的模版文件路径
  46.         /// </summary>
  47.         string cPath = "";
  48.         /// <summary>
  49.         /// 是否允许建模版
  50.         /// </summary>
  51.         bool isSURE = false;
  52.         /// <summary>
  53.         /// 线程需要的模板建立参数
  54.         /// </summary>
  55.         Hashtable TMMS = new Hashtable();
  56.         /// <summary>
  57.         /// 文件系统对象
  58.         /// </summary>
  59.         NetHashTableAPI.ClassNHT db = new NetHashTableAPI.ClassNHT();
  60.         /// <summary>
  61.         ///存放已经采样过的数据  模板名称(由原始模板数据MD5生成)
  62.         /// </summary>
  63.         ArrayList OLDMD5Name = new ArrayList();
  64.         /// <summary>
  65.         /// 已经生成过模版的url
  66.         /// </summary>
  67.         ArrayList olgurl = new ArrayList();
  68.         /// <summary>
  69.         ///存放已经采样过的数据 key = 第一个采样的url  val = 该模版是在url相似度为多少的情况下建立的
  70.         /// </summary>
  71.         Hashtable OLDUrl = new Hashtable();
  72.         /// <summary>
  73.         /// 得到的URL列表  需要计算 去掉其中 已经建立过模板的部分
  74.         /// </summary>
  75.         ArrayList LIST = new ArrayList();
  76.         /// <summary>
  77.         /// 数据抽取使用 得到的URL列表  需要计算 去掉其中 已经建立过模板的部分
  78.         /// </summary>
  79.         ArrayList LIST2 = new ArrayList();
  80.         // 1  读取 URL列表  提取数据特征  a 以不同的动态页面区别 b以结构相似的静态页面区别 c以参数结构相似的页区别
  81.         //    只要该集合内数据大于160 则建立模板  采样按80来进行  模板的命名采用 模板数据的MD5 数据 有一个好处就是可以去掉完全相同的模板 
  82.         // 2  模板分析 检测出模板*前方 不属于HTML标示的第一个元素 <S>XX<4545><xxxx>*<xxsss>  自动匹配80源数据得到 每个元素的数据平均长度
  83.         // 平均长度小于 20的 放在类聚模版中   然后 把所有的  生成 放在搜索模板中  平均长度是0的 取消此项
  84.         /// <summary>
  85.         /// 系统运行
  86.         /// </summary>
  87.         public void Run()
  88.         {
  89.             //初始化分类器  
  90.            // foreach (string a_a in LIST)
  91.             while(LIST.Count>0)
  92.             {
  93.                  Random ra = new Random();
  94.                  int nowPort = ra.Next();
  95.                  int i007 = LIST.Count * nowPort;
  96.                  string a_a = LIST[i007].ToString();
  97.                 int uuu1 = 0;
  98.                 int uuu2 = 0;
  99.                 foreach (string a_c in olgurl)
  100.                 {
  101.                     if (a_c == a_a)
  102.                     {
  103.                         goto NEXTIT;  //当遇到 已经完成的模版中有比此更相似的url 建立的模板时  表示此url 不用建立模版了 
  104.                     }
  105.                 }
  106.                 foreach (System.Collections.DictionaryEntry a_b in OLDUrl)
  107.                 {
  108.                     // 和已经建立过模板的url数据比较其相似度
  109.                      int n1 = XunLong.UrlStringLib.ClassUrlString.Url2Url(a_a , a_b.Key.ToString()) ;
  110.                    
  111.                     //得到该模板建立时个个 url 的相似度
  112.                     int n2 = (int)a_b.Value;
  113.                     uuu1 = n1;
  114.                     uuu2 = n2;
  115.                      if ( n2>= n1  & n1 > 10 )       
  116.                      {
  117.                          LIST.Remove(a_a);
  118.                          goto NEXTIT;  //当遇到 已经完成的模版中有比此更相似的url 建立的模板时  表示此url 不用建立模版了 
  119.                      }
  120.                 }
  121.                 LIST.Remove(a_a);
  122.                 //建立模板
  123.                 CaiYangShuJu CaiYang = GetADCUrlList(a_a);
  124.                 olgurl.Add(a_a);
  125.                 ArrayList urlList = CaiYang.ListOne;
  126.                 if (urlList == null)
  127.                 {
  128.                     goto NEXTIT;
  129.                 }     
  130.                  //已经开始生成模板的 加入已生成行列
  131.                 if (OLDUrl.Contains(a_a) == false)
  132.                 {
  133.                     int n1U = XunLong.UrlStringLib.ClassUrlString.Url2Url(urlList[0].ToString(), urlList[1].ToString());
  134.                     OLDUrl.Add(a_a, n1U);
  135.                 }
  136.                 Hashtable htms = new Hashtable();
  137.                 htms.Clear();
  138.                 foreach (string akcc in urlList)
  139.                 {
  140.                     string htmData = db.Value(akcc);
  141.                     htmData = XunLong.HtmlClassLibrary.ClassHTML.HTML2CLEAR(htmData);
  142.                     htms.Add(akcc, htmData);
  143.                 
  144.                 }
  145.                 //调用模板建立类
  146.                 //   是否允许建模版       
  147.                 isSURE = false;
  148.                 Console.WriteLine("-开始建立模板-> "+a_a);
  149.                 //建立模板
  150.                 TMMS = htms;
  151.                 Thread T1 = new Thread(new ThreadStart(TMM));
  152.                 T1.Start();
  153.                 //假设建立一个模板的时间是5分钟
  154.                
  155.                 while (isSURE ==false)
  156.                 { 
  157.                  Thread.Sleep(1000);   
  158.           
  159.                 }
  160.                 //选出小于 8 的 作为类聚标示   所有的 作为整题标示
  161.                 //得到建立的模板数据 判断
  162.                 //1 如果得到的模板 长度 小于原来数据的 1/40
  163.                 //  或者 其中 * 的数量小于等于  3个  那么此模板为坏模板   不进行标注  但是记录到已经建立过模板的队列中  坏模板队列
  164.                 
  165.                 // 标注模板  
  166.                 // 根据标注得到的数据 进入分类器分类
  167.             NEXTIT: ; //进入下一轮
  168.             
  169.             }
  170.         
  171.         
  172.         
  173.         }
  174.         /// <summary>
  175.         /// 建立模板线程
  176.         /// </summary>
  177.         private void TMM()
  178.         {
  179.           //   是否允许建模版       
  180.                isSURE = false;
  181.             try
  182.             {
  183.                 Hashtable TMMSOne = TMMS;
  184.                 string dataE = "";
  185.                 foreach (System.Collections.DictionaryEntry de2 in TMMSOne)
  186.                 {
  187.                     dataE = dataE + de2.Key.ToString() + "rn";
  188.                 }
  189.                 //声明模板构建类
  190.                 XunLong.ModelBuilder.ClassModelBuilder myBU = new XunLong.ModelBuilder.ClassModelBuilder();
  191.                 string ModelData = myBU.BuilderModel(TMMSOne);
  192.                 int nn = myBU.inStrNum(ModelData, "*");
  193.                 ArrayList txtDat = EditOneModelTag(ModelData);
  194.                 ArrayList neWW = txtDat;
  195.                 string dataA = "";
  196.                 string dataB = "";
  197.                 for (int i = 0; i < neWW.Count; i++)
  198.                 {
  199.                     dataA = dataA + neWW[i].ToString() + ":" + "<TAGDATA INDEX=" + i.ToString() + "/>" + "rn";
  200.                     dataB = dataB + neWW[i].ToString() + ":" + "<TAGDATA INDEX=" + i.ToString() + "/>" + "rn";
  201.                 }
  202.                 string dataT = "<TAGDATA INDEX=1/>";
  203.                 string x = cPath + "\" + getMD5name(ModelData);
  204.                 if (OLDMD5Name.Contains(x) == true)
  205.                 {
  206.                     return;
  207.                 }
  208.                 XunLong.PublicClassLibrary.kcSearch v = new XunLong.PublicClassLibrary.kcSearch();
  209.                 v.a = "";
  210.                 putFileData(x + ".a", dataA);
  211.                 putFileData(x + ".b", dataB);
  212.                 putFileData(x + ".c", "");
  213.                 putFileData(x + ".d", ModelData);
  214.                 putFileData(x + ".e", dataE);
  215.                 putFileData(x + ".t", dataT);
  216.                 putFileData(x + ".h", dataA);
  217.                 Console.WriteLine("-模版建立成功->" + x);
  218.                 xnum = xnum+1;
  219.                 Console.WriteLine("-全部模版数量-> " + xnum.ToString());
  220.             }
  221.             catch
  222.             {
  223.                 Console.WriteLine("-模版建立F->" );
  224.             }
  225.             //允许建立模版
  226.             isSURE = true;
  227.         }
  228.         /// <summary>
  229.         /// 标注模板  
  230.         /// </summary>
  231.         /// <param name="c">一个模版数据</param>
  232.         /// <returns>标注的模板各个值</returns>
  233.         private ArrayList EditOneModelTag(string c)
  234.         {
  235.             ArrayList x = new ArrayList();  //对每个*进行标注
  236.             x.Clear();
  237.             string[] xxs = c.Split('*');
  238.             int Len = 0;
  239.             foreach (string a in xxs)
  240.             {
  241.                 Len = Len + a.Length;            
  242.             }
  243.             //得到平均长度
  244.             int OneLen = (int)Len / xxs.Length;
  245.             for (int i = 0; i < xxs.Length; i++)
  246.             {
  247.                 if (xxs[i].Length > 0 & OneLen < xxs[i].Length)
  248.                 {
  249.                     string aaa = GetClearTag(xxs[i]);
  250.                     if (aaa.Length < 40)
  251.                     {
  252.                         x.Add(aaa);
  253.                     }
  254.                     else
  255.                     {
  256.                         x.Add("");
  257.                     }
  258.                 }
  259.                 else
  260.                 {
  261.                     x.Add("");
  262.                 }
  263.             
  264.             }
  265.             return x;
  266.             // 1 把模板数据按照*顺序 分割  每个* 对应其前部的一个部分 n(i)
  267.             // 2 去掉n(i) 标签数据 作为属性   去掉 : 等  如果太长〉8 则放弃
  268.         }
  269.         /// <summary>
  270.         /// 清除数据中的HTML标签
  271.         /// </summary>
  272.         /// <param name="dat"></param>
  273.         /// <returns></returns>
  274.         private string GetClearTag(string dat)
  275.         {
  276.             //</td></tr><tr><td class="main_text_left">身份验证:</td><td class="main_text">
  277.             dat = dat.Replace(":","");
  278.             dat = dat.Replace(":", "");
  279.             int Loop = dat.Length / 4;
  280.             for (int i = 0; i < Loop; i++)
  281.             {
  282.                 int a1 = dat.IndexOf('<');
  283.                 if (a1 == -1 | a1 == (dat.Length-1) )
  284.                 { }
  285.                 else
  286.                 {     
  287.                     int a2 = dat.IndexOf('>',a1 + 1);
  288.                     if (a2 == -1)
  289.                     { }
  290.                     else
  291.                     {
  292.                         int aa = dat.Length;
  293.                         // *<>*<>*
  294.                         string dat1 = "";
  295.                         if (a1 == 0)
  296.                         {
  297.                             
  298.                         }
  299.                         else
  300.                         { 
  301.                             dat1 = dat.Substring(0, a1 );
  302.                         }
  303.                         string dat2 = dat.Substring(a2 + 1, aa - a2-1);
  304.                         dat = dat1 + dat2;
  305.                     }
  306.                 }
  307.             }
  308.             // 1 去掉标签 
  309.             // 2 去掉: :
  310.             return dat;
  311.         }
  312.         /// <summary>
  313.         /// 得到一个60个url的采样队列
  314.         /// </summary>
  315.         /// <param name="a"></param>
  316.         /// <returns></returns>
  317.         private CaiYangShuJu GetADCUrlList(string aurl)
  318.         {
  319.             ArrayList x = new ArrayList();
  320.             x.Clear();
  321.             //记录得到不同的 相似度的数量
  322.             int[] ValNum = new int[51];
  323.      
  324.             foreach (string b in LIST)
  325.             {
  326.                 // 和已经建立过模板的url数据比较其相似度
  327.                 int n1 = XunLong.UrlStringLib.ClassUrlString.Url2Url(aurl, b);
  328.                 ValNum[n1] = ValNum[n1] + 1;
  329.             }
  330.             //被选取得相似度
  331.             int XXX = 0;
  332.             //得到 最相似的  总体大于 120 的 
  333.             for (int i = 50; i > 10; i--)
  334.             {
  335.                 if (ValNum[i] > 60)
  336.                 {
  337.                     XXX = i;
  338.                     break;
  339.                 }
  340.             }
  341.             if (XXX < 12)
  342.             {
  343.                 CaiYangShuJu oneBad = new CaiYangShuJu();
  344.                 oneBad.ListOne = null;
  345.                 oneBad.TNUM = 0;
  346.                 return oneBad;
  347.             }
  348.             //记录  取得60个即可
  349.             foreach (string b in LIST)
  350.             {
  351.                 // 和已经建立过模板的url数据比较其相似度
  352.                 int n1 = XunLong.UrlStringLib.ClassUrlString.Url2Url(aurl, b);
  353.                 if (n1 == XXX)
  354.                 {
  355.                     x.Add(b);
  356.                     if (x.Count >= 60)
  357.                     {
  358.                         break;
  359.                     }
  360.                 }            
  361.             }
  362.             CaiYangShuJu one = new CaiYangShuJu();
  363.             one.ListOne = x;
  364.             one.TNUM = XXX;
  365.             return one;
  366.         }
  367.         /// <summary>
  368.         /// 读取各个模版  记录和存储 第一个采样的url 和 模板名称(由原始模板数据MD5生成)
  369.         /// </summary>
  370.         public void Init(string filePath,string b0,string c0)
  371.         {
  372.             XunLong.CongifData.Config.InitConfigData("d:\xunlong.kc");
  373.             aPath = filePath;
  374.             bPath = b0;
  375.             cPath = c0;
  376.         db.SetClassNHT(filePath, 3145727);
  377.          LIST = db.SearchOneList("http");
  378.              LIST2 = LIST;
  379.             // OLDMD5Name
  380.              OLDMD5Name.Clear();
  381.             
  382.             // OLDUrl 
  383.              OLDUrl.Clear();
  384.              olgurl.Clear();
  385.               // 1 得到目录下的文件
  386.             DirectoryInfo dir = new DirectoryInfo(b0);
  387.             // 2 遍历文件  读取数据压入
  388.             foreach (FileInfo f in dir.GetFiles("*.a"))   //遍历获得以xml为扩展名的文件   
  389.             {
  390.                 String name = f.FullName;         //name为该文件夹下的文件名称,如f.FullName为全名  
  391.                 name = name.Substring(0, name.Length - 2);
  392.                 String name2 = f.Name;         //name为该文件夹下的文件名称,如f.FullName为全名  
  393.                 name2 = name2.Substring(0, name2.Length - 2);
  394.                 string  new_it = getFileData(name + ".e");
  395.                 //记录已经生成的名称
  396.                 OLDMD5Name.Add(name2);
  397.                 char[] xx ={'n','r' };
  398.                 string[] tmp = new_it.Split(xx);
  399.                 ArrayList xxTmp = new ArrayList();
  400.                 xxTmp.Clear();
  401.                 foreach (string x1 in tmp)
  402.                 {
  403.                     if (x1.Length > 0)
  404.                     {
  405.                         if (xxTmp.Contains(x1) == false)
  406.                         {
  407.                             xxTmp.Add(x1);
  408.                         }
  409.                         if (olgurl.Contains(x1) == false)
  410.                         {
  411.                             olgurl.Add(x1);
  412.                         }
  413.                     }
  414.                 }
  415.                 // 和已经建立过模板的url数据比较其相似度
  416.                 int n1 = XunLong.UrlStringLib.ClassUrlString.Url2Url(xxTmp[0].ToString(), xxTmp[1].ToString());
  417.                 if (OLDUrl.Contains(xxTmp[0]) == false)
  418.                 {
  419.                     OLDUrl.Add(xxTmp[0], n1);
  420.                 }
  421.             }
  422.            xnum = OLDUrl.Count;
  423.         }
  424.         /// <summary>
  425.         /// 得到数据的MD5名
  426.         /// </summary>
  427.         /// <param name="data"></param>
  428.         /// <returns></returns>
  429.         private string getMD5name(string data)
  430.         {
  431.             string strMd5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(data, "md5");
  432.             return strMd5;
  433.         }
  434.         /// <summary>
  435.         /// 读文件
  436.         /// </summary>
  437.         /// <param name="filename"></param>
  438.         /// <returns></returns>
  439.         private static string getFileData(string filename)
  440.         {
  441.             StreamReader reader = null;
  442.             string data = string.Empty;
  443.             try
  444.             {
  445.                 reader = new StreamReader(filename, System.Text.Encoding.GetEncoding("gb2312"));
  446.                 data = reader.ReadToEnd();
  447.                 reader.Close();
  448.                 return data;
  449.             }
  450.             catch (IOException e)
  451.             {
  452.                 Console.WriteLine(e.Message);
  453.             }
  454.             finally
  455.             {
  456.                 if (reader != null)
  457.                     reader.Close();
  458.             }
  459.             return "";
  460.         }
  461.         /// <summary>
  462.         /// 写文件
  463.         /// </summary>
  464.         /// <param name="filename"></param>
  465.         /// <param name="data"></param>
  466.         private void putFileData(string filename, string data)
  467.         {
  468.             StreamWriter writer = null;
  469.             try
  470.             {
  471.                 writer = new StreamWriter(filename, false, System.Text.Encoding.GetEncoding("gb2312"));
  472.                 writer.Write(data);
  473.                 writer.Close();
  474.             }
  475.             catch (IOException e)
  476.             {
  477.                 Console.WriteLine(e.Message);
  478.             }
  479.             finally
  480.             {
  481.                 if (writer != null)
  482.                     writer.Close();
  483.             }
  484.         }
  485.     }
  486. }