java获取网页主信息之四:抽取信息块

从已经建立完成的html树中抽取主信息。

  1. package Source;   
  2.   
  3. public class ChooseBlock   
  4. {   
  5.     //构造方法,设置允许错误率   
  6.     public ChooseBlock(double th)   
  7.     {   
  8.         threshold = th;   
  9.     }   
  10.     //获取一棵html树中的内容   
  11.     public String getContent(HTree tree)   
  12.     {   
  13.         int maxIndex = 0;   
  14.         String str = "";   
  15.         String contBlock[] = tree.getBlock();   
  16.         sizeBlock = getSizeBlock(contBlock);   
  17.         int len = sizeBlock.length;   
  18.         int aid[] = new int[len];   
  19.         staBlock = new boolean[len];   
  20.         iniStaBlock();   
  21.         double val = calError();   
  22.         //方差必须大于阈值,才认为有主要内容   
  23.         if(val < threshold) return null;   
  24.         int i = 0;   
  25.         double max = 0.0;   
  26.         do  
  27.         {   
  28.             //获得当前最可能的块   
  29.             int index = getIndex();   
  30.             aid[i] = index;   
  31.             setBlock(index);   
  32.             double tmp = val;   
  33.             val = calError();   
  34.             double err = tmp - val;   
  35.             if(err > max)   
  36.             {   
  37.                 max = err;   
  38.                 maxIndex = i;   
  39.             }   
  40.             if(err > val) break;   
  41.             i++;   
  42.         } while(true);   
  43.         //选出来的块信息集合   
  44.         for(i = 0; i <= maxIndex; i++)   
  45.         {   
  46.             int index = aid[i];   
  47.             str = (new StringBuilder(String.valueOf(str))).append("\n").append(contBlock[index]).toString();   
  48.         }   
  49.         return str;   
  50.     }   
  51.   
  52.     //获取每一信息块长度   
  53.     private int[] getSizeBlock(String contBlock[])   
  54.     {   
  55.         int len = contBlock.length;   
  56.         int sizeBlock[] = new int[len];   
  57.         for(int i = 0; i < len; i++)   
  58.             sizeBlock[i] = contBlock[i].length();   
  59.         return sizeBlock;   
  60.     }   
  61.        
  62.     //设置已被处理块   
  63.     private void setBlock(int index)   
  64.     {   
  65.         staBlock[index] = true;   
  66.     }   
  67.        
  68.     //初始化块   
  69.     private void iniStaBlock()   
  70.     {   
  71.         int len = staBlock.length;   
  72.         for(int i = 0; i < len; i++)   
  73.             staBlock[i] = false;   
  74.     }   
  75.        
  76.     //计算错误率,以方差记   
  77.     private double calError()   
  78.     {   
  79.         int sum = 0;   
  80.         int num = 0;   
  81.         int len = sizeBlock.length;   
  82.         //获得还未被选取块个数及其总长度   
  83.         for(int i = 0; i < len; i++)   
  84.             if(!staBlock[i])   
  85.             {   
  86.                 num++;   
  87.                 sum += sizeBlock[i];   
  88.             }   
  89.         //定义还未被选取块平均长度   
  90.         double avg = (double)sum / (1.0 * (double)num);   
  91.         //计算方差   
  92.         double err = 0.0;   
  93.         for(int i = 0; i < len; i++)   
  94.             if(!staBlock[i])   
  95.             {   
  96.                 double val = (double)sizeBlock[i] - avg;   
  97.                 val *= val;   
  98.                 err += val;   
  99.             }   
  100.         //归一化   
  101.         return Math.sqrt(err) / (1.0 * (double)num);   
  102.     }   
  103.        
  104.     //获取最大未被选块的下标   
  105.     private int getIndex()   
  106.     {   
  107.         int index = 0;   
  108.         int max = 0;   
  109.         int len = sizeBlock.length;   
  110.         for(int i = 0; i < len; i++)   
  111.             if(!staBlock[i] && sizeBlock[i] > max)   
  112.             {   
  113.                 max = sizeBlock[i];   
  114.                 index = i;   
  115.             }   
  116.         return index;   
  117.     }   
  118.   
  119.     private double threshold;   
  120.     int sizeBlock[];   
  121.     boolean staBlock[];   
  122. }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值