2008年1月31日星期四

firefox浏览器对javascript的大小写是敏感的!

firefox浏览器对javascript的大小写是敏感的!
 
靠,今晚在做模板的时候就是找不到原因!原来是将参数的大小写写混了,将参数 "tabs0"写成了 "Tab0"是完全不同的!!!!
 
网上一搜还真多人掉进这个陷阱,附文一篇:
   
使用ajax有一段时间了,一些小方面的运用可以说是比较熟练了,但是浏览器兼容的问题在前一段时间一直都困扰着自己,找了很多其它的代码进行比较,也始终不知所以然,还好所做的程序对浏览器兼容要求并不是太严格,所以就没有再深入的查找原因.
       最近要做一个文件管理的小系统,就想着用php+ajax来做,刚开始还是有浏览器兼容的问题,由于这个程序并不大,自己觉得还是有必要做好兼容的,如果以后功能进行扩展也会减少很多麻烦,所以就从电脑里翻出一本古董级(N久前下载)的ajax教程,找了一些最基础的代码,进行测试调试,令我吃惊的是这些程序竟不存在兼容的问题,待我仔细对比一番后,还真是发现了几处不同(看来以前是是不用心),具体就是字母大小写不同.
       字母大小写不同体现在两个地方,定义头部输出信息:setrequestheader,全部小写的话在firefox就不能正常执行,改为setRequestHeader后,就可正常执行下一步了(在IE中也是正常的,如果使用"GET"的话头部输出信息并不是必须的),接下来要看执行状态:readystate,问题同头部输出信息相同,改为readyState,程序正常执行.
        就是这小小的字母问题,困扰了我很长时间,如今终于解决了,总算是舒了一口气,所以把问题总结一下写在这里,如果有遇到同样问题的朋友可以拿来参考下,不过我想应该就只是自己遇到了这个问题吧,呵呵.

firefox浏览器对javascript的大小写是敏感的!

靠,今晚在做模板的时候就是找不到原因!原来是将参数的大小写写混了,将参数 "tabs0"写成了 "Tab0"是完全不同的!!!!

滑动门的另一个代码

 
<HTML><HEAD><TITLE>无标题文档</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>BODY {
 MARGIN: 6px 0px; FONT: 12px 宋体; TEXT-ALIGN: center
}
.divArea3 {
 WIDTH: 750px
}
.divArea3 .divAreaCol1 {
 FLOAT: left; WIDTH: 371px
}
.divArea3 .divAreaCol2 {
 FLOAT: right; WIDTH: 280px
}
.divArea3Box {
 BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: #cccccc 1px solid; MARGIN-TOP: 2px; PADDING-LEFT: 2px; MARGIN-BOTTOM: 2px; PADDING-BOTTOM: 2px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 100%; LINE-HEIGHT: 120px; PADDING-TOP: 2px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 120px; TEXT-ALIGN: center
}
A {
 COLOR: #999999; TEXT-DECORATION: none
}
.tabWin {
 WIDTH: 371px; HEIGHT: 230px
}
.tabWin {
 BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; DISPLAY: inline; FLOAT: left; MARGIN: 0px 3px; OVERFLOW: hidden; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid
}
.crbl {
 BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; DISPLAY: inline; FLOAT: left; MARGIN: 0px 3px; OVERFLOW: hidden; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid
}
.tabWinInnerBox {
 MARGIN: 5px; OVERFLOW: hidden; WIDTH: 361px; HEIGHT: 220px
}
.tabWinLine1 {
 WIDTH: 360px; HEIGHT: 29px
}
.tabWinLine2 {
 DISPLAY: block
}
.tabWinLine4 {
 DISPLAY: none
}
.tabWinLine2 {
 WIDTH: 360px; HEIGHT: 1px
}
.tabWinLine4 {
 WIDTH: 360px; HEIGHT: 1px
}
.tabWinLine2 DIV {
 FLOAT: left; WIDTH: 118px; HEIGHT: 1px; BACKGROUND-COLOR: #cccccc
}
tabWinLine4 DIV {
 FLOAT: left; WIDTH: 118px; HEIGHT: 1px; BACKGROUND-COLOR: #cccccc
}
.tabWinLine1 .sepa {
 BACKGROUND-IMAGE: url(images/0.gif); WIDTH: 3px
}
.tabWinLine2 .sepa {
 BACKGROUND-IMAGE: url(images/0.gif); WIDTH: 3px
}
.tabWinLine4 .sepa {
 BACKGROUND-IMAGE: url(images/0.gif); WIDTH: 3px
}
.tabWinLine2 .tabWinLine3 {
 BACKGROUND-REPEAT: no-repeat; BACKGROUND-COLOR: #ffffff
}
tabWinLine4 tabWinLine3 {
 BACKGROUND-REPEAT: no-repeat; BACKGROUND-COLOR: #ffffff
}
.tabWinLine1 DIV {
 FONT-WEIGHT: bold; FLOAT: left; BACKGROUND-IMAGE: url(images/c21_1.gif); WIDTH: 118px; CURSOR: pointer; COLOR: #1f3a87; LINE-HEIGHT: 26px; HEIGHT: 26px
}
.tabWinLine1 .tabWinTitle {
 BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BACKGROUND-IMAGE: url(images/0.gif); BORDER-LEFT: #cccccc 1px solid; WIDTH: 116px; COLOR: #b10000; HEIGHT: 28px; BACKGROUND-COLOR: white
}
.tabWinInnerBox .showblock {
 BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 3px; PADDING-LEFT: 7px; PADDING-BOTTOM: 8px; MARGIN: 0px 0px 3px; OVERFLOW: hidden; BORDER-LEFT: #cccccc 1px solid; WIDTH: 348px; PADDING-TOP: 9px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 143px; BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: left
}
.tabWinInnerBox .hiddenblock {
 BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 3px; PADDING-LEFT: 7px; PADDING-BOTTOM: 8px; MARGIN: 0px 0px 3px; OVERFLOW: hidden; BORDER-LEFT: #cccccc 1px solid; WIDTH: 348px; PADDING-TOP: 9px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 143px; BACKGROUND-COLOR: #ffffff; TEXT-ALIGN: left
}
.hiddenblock {
 DISPLAY: none
}
.showblock {
 DISPLAY: block
}
.divTab2 {
 DISPLAY: inline; FLOAT: left; MARGIN: 0px 3px; OVERFLOW: hidden; WIDTH: auto; HEIGHT: 232px
}
.divTab2 .TabTitle {
 FONT-SIZE: 12px; WIDTH: 280px; HEIGHT: 24px
}
.divTab2 .normal {
 BACKGROUND-IMAGE: url(images/mtitle2.gif); COLOR: #1f3a87
}
.divTab2 .active {
 FONT-WEIGHT: bold; BACKGROUND-IMAGE: url(images/mtitle1.gif); COLOR: #1f3a87
}
.divTab2 .TabTitle .sepa {
 BACKGROUND-IMAGE: url(images/speabg.gif); WIDTH: 1px
}
.divTab2 .TabTitle .border {
 BACKGROUND-IMAGE: url(images/speabg.gif); WIDTH: 1px
}
.divTab2 .TabTitle DIV {
 FLOAT: left; WIDTH: 92px; CURSOR: pointer; LINE-HEIGHT: 21px; PADDING-TOP: 3px; HEIGHT: 21px
}
.divTab2 .showblock {
 BORDER-RIGHT: #064ca1 1px solid; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; OVERFLOW: hidden; BORDER-LEFT: #064ca1 1px solid; WIDTH: 278px; PADDING-TOP: 9px; BORDER-BOTTOM: #064ca1 1px solid; HEIGHT: 198px; TEXT-ALIGN: left
}
.divTab2 .hiddenblock {
 BORDER-RIGHT: #064ca1 1px solid; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; OVERFLOW: hidden; BORDER-LEFT: #064ca1 1px solid; WIDTH: 278px; PADDING-TOP: 9px; BORDER-BOTTOM: #064ca1 1px solid; HEIGHT: 198px; TEXT-ALIGN: left
}
</STYLE>
<SCRIPT language=javascript>
var waitInterval;
var mouseDelayTime = 200;
/*选项窗*/
function tabWinMouseOver(tabWinObj,tabWinTotal,obj)
{
  window.clearTimeout(waitInterval);
 waitInterval=window.setTimeout("ChangeDiv3('"+tabWinObj+"',"+tabWinTotal+","+obj.id+")",mouseDelayTime)
}
function ChangeDiv3(tabWinObj,tabWinTotal,obj)
{
 var itemNum;
 for(var i=0;i<tabWinTotal;i++)
 {
  if (tabWinObj+"_Title"+i == obj.id)
  {
   itemNum = i;
   document.getElementById(tabWinObj+"_Title"+i).className = "tabWinTitle";
   document.getElementById(tabWinObj+"_Line"+i).className = "tabWinLine3";
   document.getElementById(tabWinObj+"_Content"+i).className = "showblock";
  }else{
   var divID = document.getElementById(tabWinObj+"_Title"+i);
   if (divID != null){divID.className = "";}
   var ContentDiv = document.getElementById(tabWinObj+"_Content"+i);
   if(ContentDiv!=null){ContentDiv.className = "hiddenblock";}
   var BDiv = document.getElementById(tabWinObj+"_Line"+i);
   if(BDiv!=null){BDiv.className="";}
  }
 }
 var tabWinImg1 = document.getElementById(tabWinObj+"_Img1");
 var tabWinImg2 = document.getElementById(tabWinObj+"_Img2");
 if(tabWinImg1!=null && tabWinImg2!=null)
 {
  if(itemNum < 4)
  {
   tabWinImg1.className = "tabWinLine2";
   tabWinImg2.className = "tabWinLine4";
  }else{
   tabWinImg1.className = "tabWinLine4";
   tabWinImg2.className = "tabWinLine2";
  }
 }
}
/*选项卡*/
function tabMouseOver(tabObj,tabTotal,obj)
{
 window.clearTimeout(waitInterval);
 waitInterval=window.setTimeout("changeTabDiv('"+tabObj+"',"+tabTotal+","+obj.id+")",mouseDelayTime)
}
function changeTabDiv(tabObj,tabTotal,obj){
 for(i=0; i <tabTotal; i++)
 {
  if (tabObj+"_Title"+i == obj.id)
  {
   document.getElementById(tabObj+"_Title"+i).className = "active";
      document.getElementById(tabObj+"_Content"+i).className = "showblock";
  }else{
   document.getElementById(tabObj+"_Title"+i).className = "normal";
   document.getElementById(tabObj+"_Content"+i).className = "hiddenblock";
  }
 }
}
function tabMouseOut(){window.clearTimeout(waitInterval);}
</SCRIPT>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
<BODY>
<DIV class=divArea3>
<DIV class=divAreaCol1><!-- 选项窗开始 -->
<DIV class=tabWin id=tabWin>
<DIV class=tabWinInnerBox>
<DIV class=tabWinLine1>
<DIV class=tabWinTitle id=tabWin_Title1
onmouseover="tabWinMouseOver('tabWin',7,this);" onmouseout=tabMouseOut();><A
class=a4 href="javascript:void(0);">热点概念股</A></DIV>
<DIV class=sepa></DIV>
<DIV id=tabWin_Title2 onMouseOver="tabWinMouseOver('tabWin',7,this);"
onmouseout=tabMouseOut();><A class=a4 href="javascript:void(0);">数据分析</A></DIV>
<DIV class=sepa></DIV>
<DIV id=tabWin_Title3 onMouseOver="tabWinMouseOver('tabWin',7,this);"
onmouseout=tabMouseOut();><A class=a4 href="javascript:void(0);">权证市场</A>
</DIV></DIV>
<DIV class=tabWinLine2 id=tabWin_Img1>
<DIV class=tabWinLine3 id=tabWin_Line1><IMG height=1 alt="" src=""
width=1></DIV>
<DIV class=sepa><IMG height=1 alt="" src="" width=1></DIV>
<DIV id=tabWin_Line2><IMG height=1 alt="" src="" width=1></DIV>
<DIV class=sepa><IMG height=1 alt="" src="" width=1></DIV>
<DIV id=tabWin_Line3><IMG height=1 alt="" src="" width=1></DIV></DIV>
<DIV class=showblock id=tabWin_Content1>ff </DIV>
<DIV class=hiddenblock id=tabWin_Content2>ff </DIV>
<DIV class=hiddenblock id=tabWin_Content3>ff </DIV>
<DIV class=tabWinLine1>
<DIV id=tabWin_Title4 onMouseOver="tabWinMouseOver('tabWin',7,this);"
onmouseout=tabMouseOut();><A class=a4 href="javascript:void(0);">研究报告</A></DIV>
<DIV class=sepa></DIV>
<DIV id=tabWin_Title5 onMouseOver="tabWinMouseOver('tabWin',7,this);"
onmouseout=tabMouseOut();><A class=a4 href="javascript:void(0);">名家专栏</A></DIV>
<DIV class=sepa></DIV>
<DIV id=tabWin_Title6 onMouseOver="tabWinMouseOver('tabWin',7,this);"
onmouseout=tabMouseOut();><A class=a4
href="javascript:void(0);">机构观点</A></DIV></DIV>
<DIV class=tabWinLine4 id=tabWin_Img2>
<DIV id=tabWin_Line4><IMG height=1 alt="" src="" width=1></DIV>
<DIV class=sepa><IMG height=1 alt="" src="" width=1></DIV>
<DIV id=tabWin_Line5><IMG height=1 alt="" src="" width=1></DIV>
<DIV class=sepa><IMG height=1 alt="" src="" width=1></DIV>
<DIV id=tabWin_Line6><IMG height=1 alt="" src="" width=1></DIV></DIV>
<DIV class=hiddenblock id=tabWin_Content4>fffsdafdsa </DIV>
<DIV class=hiddenblock id=tabWin_Content5>ff safasf</DIV>
<DIV class=hiddenblock id=tabWin_Content6>ggfdsafasdfsdafads
</DIV></DIV></DIV><!-- 选项窗结束 --></DIV>
</DIV>
</BODY></HTML>

2008年1月30日星期三

女程序员 羊城的奋斗经历(转载)

『程序员』 [程序人生]女程序员 羊城的奋斗经历(转载)



作者: IT探花 提交日期:2008-1-26 13:51:29

  一.并不成功的开始
  
     我所读的学校是中国西部的一所普通高校。我进大学后也和大多数同学一样,过着60分万岁的日子,除了对编程比较感兴趣外。(呵呵,好多室友都说我外表女人,内心却男人:喜欢写程序,喜欢和男生打星际,喜欢打CS选土匪,拿AK47)四年的大学生活淘进了我刚进校时的傲气与自尊,在栀子花开的季节,我面对的却是无法把握的未来。毕业了,是的,四年象梦一样。男友执意去了中国最繁荣的大都市,我却希望留守相对平静的近在咫尺的西部城市,结局是可想而知的。痛苦十分短暂,因为迫在眉睫的生存问题变得急为严峻。幸运的是,2004年7月我很顺利的找到了一份程序员的工作。
  
     我的第一份工作比较轻松,就是做MIS系统,写写C#代码。工作很轻松,带我的经理也很照顾我。于是我每天过着上班下班的生活,每天穿梭在熙熙攘攘的人潮当中,全然没了生活的压力。这样的生活也让人讨厌,日子太无聊了,无非就是写着重复的代码,再就是在天涯上闲逛。这样的日子结束于我看到的一篇文章,题目我记不太清楚了,好像是:成为IT精英,我奋斗了7年。
  
     当时很受鼓舞,也很自责。大学的四年已经荒废,难道还要重蹈覆辙? 于是我有了想离开这个安逸的城市,去节奏相对较快的城市锻炼一下自己。
  
     于是在今年年初,我毅然背起行囊,踏上了南下的火车。。。。
  
  二。初来乍到
  
     一下火车,我来到人山人海的车站广场,看着人山人海,心里没有底气,毕竟是第一次出远门。但是只觉告诉我,先要找个落脚的地方。虽然我带了5000块,但是我却不敢乱花一分钱,因为在我印象中这座城市消费比原来的城市高多了。我得想办法尽快找到工作。
  
     经过2个多小时的寻找,终于让我找到了一个网吧。于是不顾旅途劳累,趴在电脑前就上51JOB ,简单回顾了自己的工作经历,然后填写了简历,在网上投。时间过得很快,一下子到了中午。我出了网吧,胡乱吃了碗酸辣粉。然后去找旅馆,这里的旅馆真的很多,各种档次都有,我找了一个看上去觉得比较安全的旅馆。130一晚上,好心疼!!!尽管很累但是,大半个晚上我都没有睡着,双手紧紧的抓住手提袋。到了下半夜,我才慢慢的睡着。
  
     早上起来的时候已经是9点多了,我洗漱完毕。双眼盯着手机屏幕,生怕会错过面试电话。也许我运气真的不错,大约10点,手机响了。我赶紧接了,一时高兴得语无伦次。电话里一个女声:您好,请问您是XX么?我们是yy科技有限公司,想约您下午面试......
  
     挂了电话,我高兴得不知东南西北了,没想到这么快就有回应了。下午出门的时候我化了点淡妆,出门了。我按着yy公司的提示,费了将近2个小时才找到地方,真后悔没有买张地图。到yy公司的时候已经是下午4点了。
  
     面试我的是位女经理。30分钟过后,我们谈得比较好。我自信满满的,呵呵。
  
     最后经理问我期望的薪水时,我咬咬了牙,很小声的说了句3500 .经理说,其实你比较符合我们的要求,但是薪水可能不会那么高。我小声问她能给我多少,她说句2000。但是我心都冷了,我来这个城市之前的工资也有1500啊。。我说了句考虑考虑后,出了yy公司的大门。在传说中,这个城市不是每个人都拿高工资的么?怎么会这样?失望和痛苦同时袭来。
  
     回到旅馆我仔细总结了一整天,得出结论:1.不是没有高工资,而是所掌握的技能门槛比较低,导致没有什么竞争力。2.一个规律:IT技能(不精通的情况下),技术门槛低的入门较容易的,在市场上竞争力不大(精通后,每项IT技能的竞争力相差不大。)。
  
    3.所以我决定,去学习新的东西,门槛稍稍高那么一点的东西。
  
  注意拿定,我回顾了自己所学的东西,觉得C/C++基础还可以,而且上学的时候写过一段时间的VC,于是决定啃C/C++。我开始在网上投C/C++相关的职位,把薪水要求降到2500~3000。上天又一次眷顾了我,四天后我找到了一份工作,工资2500,包住宿。唉,总算是定下来了,接着我便写了个学习C++的详细计划,花了1500元买了个二手电脑。工作后,我觉得极其的不适应,这个时候才知道,我对C++的理解是何其肤浅!基础太差了。。。自尊心一向很强的我,受了很大的刺激。我觉得,是时候努力了!
  
     在工作的时候我积极的请教同事,下班后我在宿舍里疯狂的肯C++,在网上下载了教材。一行一行认真的读,上机练习,从基础开始。一步一步的来。在刚开始的一个月里,几乎每天都是凌晨才休息。但是我觉得很欣慰,因为我逐渐适应工作了,而且觉得越来越理解C++的内涵。连续这样3个月后,我终于对工作得心应手了,VC的底子也逐渐厚实。回想原来的夜郎自大,真的很好笑。现在我对C++无疑是敬畏的。
  
     原来以为自己有多厉害,其实自己差得要命。不懂虚函数有什么用,不知道除了构造函数,析构函数外还有拷贝函数,还有深浅拷贝之分。不懂什么是多态,不懂什么是抽象类,不知道C++里居然还有个STL库。随便拿本VC的书就写程序,甚至不知道APP WIZARD生成程序的入口。
  
     经过了三个月的苦心孤诣终于有点眉目了。我没有直接用VC,而是从SDK入手,用SDK写了将近一个月的程序。终于知道了windows里面居然还有消息机制,每个应用程序还有消息队列。编译器分配存储空间的时候居然还有内存对齐。这些新奇的东西让我兴奋,我每天如饥似渴的读着各类电子书。
  
     《深入浅出MFC》,《高质量C/C++编程》,都是我的宝贝。 是的,正象很多人说的一样,没有几年是无法精通VC的。但是,我们无需精通每个方面,我们只需足够熟悉我们工作所用到的部分。DLL,数据库,组件技术,图形技术,进程调度,多线程等等,网络...太多太多了,MFC是如此的庞大。
  
     也许是我心高气傲,当经理跟我说转正给我3000的时候,我拒绝了,我觉得自己可以拿更高的薪水。于是我辞职了。。
  
  这次的离职,没有给我带来什么忧虑,可能通过前断时间的学习有了些许的底气。可能大家很奇怪,为什么上文多次提到工资,请原谅我的俗气!当爱情不能依靠时,金钱是能唯一给我安全感的东西。
  
  

作者: IT探花 回复日期:2008-1-26 13:54:00

  这一次我打算找名气稍微强一点的企业。正好,TX公司正开招聘会。我一大早赶到招聘会现场,很热闹,已经有很多人在那里面试了。等了大约半个小时,终于轮到我了。面试官没有象我想象的那样提一些基础知识,而是直接问我对UML怎么理解,对UI设计有什么心得这些抽象的问题。我回答得吞吞吐吐,语无伦次,结果是可想而知的。55555555,真的好惨,这个全国著名的SP把我就这样简单的拒绝了,好打击人啊。但是这次来并非没有收获,因为在我走出招聘会场的时候,我留意到unix/linux展台门可罗雀,于是一个计划又在我内心酝酿。我回家后在网上搜集linux入门资料,然后把电脑硬盘格式化,为了表示学习linux的决心,我给windows 15G,给了linux 25G,就这样开始了我的学习linux之旅!
  
     第二天,我从朋友那里打听到GDNT有个招聘会,于是又风风火火的赶去。GDNT的面试也给了我重重一棒子,让我好痛苦。在痛苦中过了3天后,一个高中同学说她们单位要招VC方面的人。我当时真的很高兴,也很紧张,因为这次面对的公司是中国著名电信运营商的研发中心。由于朋友的引见,面试很快确定在2天后。在这两天里,我把所有关于C/C++的知识点复习了一遍,然后阅读了一些网络方面的资料。果然功夫不负有心人,2个小时的比试面试过去了,我成了她们的一员。最后PM许诺试用期给我4K。
  
  这里的工作环境很好,工作也比较轻松,也许所有国企都是这样的把。下午2:00上班,中午可以休息两个小时。单位食堂的伙食丰富而且价格便宜,一般不超过5元,最令人觉得温馨的是饭后偶尔还会发水果。:) 真的是好幸福,呵呵。在这里主要做的是一些交换网管系统,在这期间我跟PM学了不少东西。熟悉了HW,ZTE的很多产品,以及COBAR接口规范。私下还对7号信令做了比较详细的阅读,而且对很多网络协议有所了解了,比如SNMP,RIPv2、OSPF、IGRP,还学会了怎样使用CLEARCASE等工具。但是,最大的收获莫过于对UNIX的学习了。在这里有很多UNIX机器,HP-UNIX ,IBM-AIX,SUNOS 等等。。。
  
    每天下班后我没有直接回家,而是留在了单位telnet到SUNOS上,开始了我学习unix的计划。几乎天天都是10:00以后才离开单位,搞不懂的就问人或者在网上找资料。回家以后,我继续在linux上学习一直到转钟。这期间我真的学了很多,跟windows上写程序完全不同了,似乎更关心细节,更关心操作系统了。经过大约3个月的摸索,终于对unix有所了解了,觉得好多东西豁然开朗。进程通讯,进程管理,页面置换,信号灯,线程池这些东西是我在indows下写程序从未接触过的。
  
    觉得学习unix真的很幸福,每天进步一点,会让我睡得踏实。把《unix高级环境编程》学完后,我开始慢慢的请教前辈,有关嵌入式的开发的问题。
  
    慢慢学着分析内核情景,裁减内核,底层的东西让我觉得好奇。还有一件让人特兴奋的事儿,咱们科室好多开发人员都是女同志,PM也是女人。
  
  时间飞快,转眼四个月已经过去了。我觉得是时候该离开这个安逸的国企了,说真的,真有些舍不得,我向PM提出辞职时,经理非常真诚的挽留我,说我工作做得不错,叫我考虑考虑再走。这里的人真的很好,学习的气氛也很浓,也许我希望日子过得紧张一些。经理说我这样跳来跳去不利于自身的发展。也许她是对的,也许是我太倔犟,终于还是走了。我知道,当我交出那张卡,就再也不能回来了,走出大门站在华景的天桥上我默默的站了10分钟,仰望着那熟悉的大厦。
  
     晚上回去改了改简历,然后在网上投。躺在床上,看着天花板,突然之间觉得好孤单,这里一个亲人也没有,鼻子很酸,好想哭。客厅电视机里传来世界杯预选赛的呐喊(我和一个男生一个女生合租三室一厅)。我走出客厅和那个男生谈了很多,也知道了他很多事情。现在才知道,虽然是合租,但是彼此沟通真的很少。他原来是在XTKJ工作,后来跳到外企,也是搞IT的,也是程序员。一个人到南方。
  
    当时聊了很多,不觉到了凌晨。不过我们都没有睡意,于是他问我会星际否,我一拍即合。他很惊讶的看着我:你真的会。我说试试就知道。于是我们各自回房打开电脑,比赛开始了,呵呵。也许是他太轻敌,第一场,我选虫族,他选人族,结果被我出快狗偷袭成功,不过后来几场我都输得很惨,呵呵。。
  
     第二天睡到中午才起来,1点多的时候突然来了个电话,通知我去面试,职位是linux程序员。我赶快打扮起来:)。照镜子才发现,自己瘦了好多,也憔悴了不少。我穿上了自己最漂亮的衣服,然后简单了画了一下眉,打了粉底和眼影,并且还画龙点睛的摸了腮红。呵呵,自己对着镜子傻笑。
  
     到了面试的公司(一个刚成立不久的外企,VOIP设备商),和PM谈得很顺利。他问的问题也很简单:函数传值传址的区别,常用的进程通讯方式,和我做过的一些项目等等。。最后PM问我期望的薪水是多少。我怯怯的说了句:5K 。 经理摸了摸前额想了想对我说:这样把,你好好干,试用期我给你5.5K.
  
     出了公司门,感觉天空一片蔚蓝。~~~~~~

交大家一招泡妞方法!

交大家一招! 我一哥们上了工科学校后,女生少得可怜,只能通过qq解决寂寞心理^_^。为了聊天方便,这建了个qq群,把有好感的女生全部拉进去,取群名为老婆群~结果~~对他没感觉的都自动退出了,剩下一个,现在已经2年了 ^_^

2008年1月29日星期二

css 布局感悟

由于是要让站工自已定制,所以开放了HTML以及CSS、JS等代码。但默认的CSS是CSS是不能改的。 在写这个CSS时,我尽量用最少的标签,这样很站对CSS不是很熟的站长也可以定制。另外布局时和写CSS时,总的思想的就是从大的到小,从小到细。 这个布局和CSS是一次写成的,没有更改过,所以有一些地主还是可以优化的,这样的代码也不是最优的。但是,这样的布局的CSS是可以让站长定义成各式各样的。一会我给大家看一些例子。 以下是这个CSS的解析,很合适于初学者看。
程序代码
@charset "utf-8";
/*定义全局,在这定义了全局中的标签*/
* {margin:0px;padding:0px;}
/* 在这里定义了全局的文字大小为12PX,行高180%;这样的行高看起来眼睛不会太累。 在这里,我把宋体放在了Verdana字体的后边,是为了中页面中的数字和英文能以英文字体显示,这样会漂亮一些;有些人不加宋体,但这样会有问题的,最起码我的测试结果是这样的。 另外,我加了背景色,是因为在某些操作系统下的某些浏览器中,如果要不加背景,那么他的背景就会是其它的色。 我在这里还定义了整体文字色。没有用黑色是为了让眼睛舒服一些; 最重要的一些为是加了textalign;这个是让BODY中的内容全是居中,与里边一个大的DIV块合用,就可以实在如果页面内容是定宽的,那么在IE和FIREFOX等浏览器中内容总在网页的中间,主要是为了解决IE和FIREFOX中的差别,这里把文字弄成居中,然后我们再在BODY中加一个大的DIV块,把这个DIV的块写成文字左对齐, */
body{ font-size:12px; line-height:1.8; font-family:Verdana, "宋体", Arial,Sans; text-align:center; background:#FFF; color:#666;}
/* 这里定义了全局的文字链接样式,我用了简写的形式,样式是和客齐集主站是一样的 */
a:link,a:visited{color:#000099; text-decoration: underline;}
a:hover,a:active{color:#000;text-decoration: none;background-color: #FED762;}
/* 由于布局中将会用到很多的UL和LI,而UL和LI本身的样式并不好看,所以在这里我们去除列表小点以及边距等 */
ul,li{ list-style:none; margin:o;}
/* 这里定义图片的边模框为0,这里全局定义一下。后边有加边框的,另外再加,主要的思想还是从大到小。 */
img{ border:0;}
/* 这个是就包在BODY里的最大也是最外边的一个DIV块,有了就可以控制整个网页内容的宽度了。与BODY合用,就可以实现自动居中了。定义整个网站的宽度和水平居中 1、这里定义了文字全部为左对齐。 2、用MARGIN来实现在FIREFOX中居中。 3、用OVERFLOW是担心有些人定义的内容会太宽而影响了布局。所以缢出就自动隐藏了; */
#wrapper{ text-align:left;margin:0 auto; width:1000px; overflow:hidden;}
/* INFO这里又加了一个宽为百分百的DIV块,加他是为了让有些站长可以把布局定制成全屏的,右边定宽,左边自动适用而加的。并是解决一行两列的的前题基础。 这里我加了FLOAT,是为了"以毒攻毒"就是用浮动来解决浮动。因为右边也要加浮动; */
#info{ width:100%; float:left; }
/* 这里是导航条 用BODER来加上边的绿色 */
#nav{width:100%; text-align:center; border-top:5px solid #5DB30A; background:#FAFAFA; line-height:2.2}
/* 这里用了绝对定位,因为一共有三个以上的页面要用这个,很有可能他会受其它内容的影响,所以就定义为绝对定位,这样基本上不会受到影响。 bykijiji的图片位置 */
#bykijiji{position: absolute; margin-left:550px; margin-top:-20px;}
/* 主体大块*/
#main{text-align:left;margin:0 auto;}
/*底部大块*/
#footer{border-top:1px solid #CDCDCD; padding:10px 0; clear:both; text-align:center;margin:0 auto;}
/*头部大块*/
#header{ clear:both}
/* 这里定义了HEADER区标题文字的大小。色彩等。主要是为了让站长直接加文字LOGO就可以了。 标题*/
#header h2{ font-size:35px; margin-top:0px; font-weight:bold; color:#404040}
/* 以下LEFT和RIGHT是完成一行两列布局为。我在LEFT外边加了一个INFO。是为什么让定制更灵活一些,可以实现页面适度自动适应。 左边大块 这里的LEFT距右边305PX,由于他外边有一个百分之百的DIV。所以,这样就给右边一列留下了305的宽度。就样LEFT就可以自适应了。 */
#left{ margin-right:305px;color:#000; font-size:14px;}
/*这个是LEFT里边的一个最大的DIV。这个是为是解决不同版本浏览器对PADDING的解释和计算的方法的不同*/
leftbox{ padding:10px; font-size:14px;}
/*右边大块 由于他前边的INFO的宽已经是百分百了,而里边的LEFT又给他留了一个305PX的空子。所以让他距左边负的305PX就正好和LEFT挨上了。在这里写了300PX,是和左边大块离开5PX;这样看上去更舒服。 这里我定义了宽是289PX;再加上PADDING左右的各5PX;是299PX; 为了安全,我少写一个像素。 */
#right{ margin-left:-300px; float:left; width:289px; padding:5px;background:#F7F7F7; margin-top:24px;}
/* 这是搜索那一条,没有什么好说的。 搜索那一条*/
#search{ padding:0 0 10px 0; text-align:left}
/*定义标题文字大小*/
h1{ font-size:16px;}
/* 在这里,定议了 公用的三个CSS,他们都是布局中常用的。分别为水平换行,左浮动和右浮动 这样命名很简单,而且字符最短,这样论在CSS文件中,还是页面中,最能作到代码尽量少。 */
.c{clear:both; height:0px; overflow:hidden;} .l{ float:left;} .r{ float:right;}
/*这里定义了一个文字大小,由于上边定义的很多都是12PX;可能或一定会有部分地方要用小字的,所以提前写在这里。*/
.f12{ font-size:12px;}
/*这义SMALL的文字大小。*/
small{font-size:12px;color:#999;font-weight: normal; padding-left:5px;} .h_hr{ height:1px; overflow:hidden; margin:10px 5px; background:#CDCDCD;}
/*++++++++++++++++++++++++++++++++++++++++++++++++++ 以上就是定义的全局。然后在下边又分别对首页,LIST页面,以及单个信息的页面作了单独的CSS; 可以看出,用了上边的基础,下边单个页面CSS写起就方便多了。而且只要很少的代码就可以了。可能首页的代码会多一些; 下边的这些就不一一说明了。很简单的东西。 */
/*单个页面部分*/
.imgbox{ text-align:center; width:200px;} .imgbox img{ border:4px solid #CCC; display:block; margin:0 auto; } .navbox{border-left:4px solid #f5f5f5; margin:5px 0 10px 0; padding-left:8px; }
/*LIST页面部分*/
#listnav{ background:#f7f7f7; line-height:2.0; padding-left:10px; border-bottom:1px solid #D4D4D4;}
.listbox{ color:#666;width:590px;font-size:12px;border-bottom: 1px dashed #CCC;}
/*绿色的时间*/
.listbox p{color: #008000;}
/*大标题*/
#leftbox h2{font-size:14px; margin-top:10px;}
#leftbox span{ margin-left:10px;}
/*首页页面部分*/
#h_center_l{ width:66%; border-left:1px solid #CDCDCD;border-right:1px solid #CDCDCD; float:left; margin-top:10px;}
#h_center_lbox{width:49%; border-right:1px solid #CDCDCD; float:left;}
#h_center_lboxb{width:50%; float:right;}
#h_center_r{width:33%; float:right;margin-top:10px;}
#h_center_l h1,#h_center_r h1{ padding-left:5px; font-size:14px;}
#h_center_l ul,#h_center_r ul{ padding-left:19px; font-size:12px;}
#qcity{clear:both; margin-bottom:20px; margin-top:10px;}
#qcity li{ display:inline; padding-left:10px;}
#qcity h3{ font-size:14px; color:#000}
#links { border-top: 1px solid #CCC; margin-top: 15px; }
/*广告块部分*/
#leftbottomad{ background:#FFFFCC; margin-left:10px; display:none}
#pfm{padding:20px; font-size:12px;}
/*CSS完*/
说一说我个人在写布局和CSS的一点感受吧!说明,只是个人的感受! 1、了解用户群,如果你的用户是白领都是学生。那么你没有必要去考虑IE5以下的版本。那样你会累死的。 2、一行三列或一行二列自动适应,这个例子就可以了,他在IE6,IE7,FIREFOX等的效果都是一样的。没有必要有一堆代码去写一个自动适应。 3、布局最难的就是布表单了。表单中的元素太多了,很难控制,特别是要适应很多浏览器。这个是更难了。如果将来我遇到表单,如果不是非常简单的,那么我一定用表格,我想信,复杂的表单用表格去布局,代码一定会小于那个人家常说的DIV+CSS。而且有表格布这东西,维护特别的容易。 4、在CSS设计的时间,总的来说,是标签从大到小来定义,布局从大块到小块。标签不一定用到很多。 5、有些人认为不要给那些DIV或块加上什么ID; 我认为,加ID是正确的,如果ID中有不同的标签,那么通过CSS来控制就在容易了。有时我们会认为一些同样的色彩应该写在一个CLASS里。然后哪里用到那么我们就在哪里调,如果变色,一改这个CLASS就全变了。但是,我想问,如果不全变呢,只变一块,你怎么办。还去改布局吗? 如果是这样,那么结构和表现分开又有什么意义呢。 6、我们布大局可能会很简单,就像盖房子,大的样子几天就起来。但细细装修就麻烦了,又苦又累。我们常常分为了一个像素,节省一行代码而浪费大量的时间在上边,我感觉时间还是要花的,但是要有一个度。 7、布局时,我们也许把布局和CSS都弄的很NB。但同事一时半会看不懂你为什么要这样写,这样多人开发就很难了。你写的东西可能只有你能改。这样就麻烦了。所以,我们不一定非要布局写的很NB。

IE与Firefox的CSS兼容大全

CSS对浏览器器的兼容性具有很高的价值,通常情况下IE和Firefox存在很大的解析差异,这里介绍一下兼容要点。

  常见兼容问题:

  1.DOCTYPE 影响 CSS 处理

  2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行

  3.FF: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中

  4.FF: 设置 padding 后, div 会增加 height 和 width, 但 IE 不会, 故需要用 !important 多设一个 height 和 width

  5.FF: 支持 !important, IE 则忽略, 可用 !important 为 FF 特别设置样式

  6.div 的垂直居中问题: vertical-align:middle; 将行距增加到和整个DIV一样高 line-height:200px; 然后插入文字,就垂直居中了。缺点是要控制内容不要换行

  7.cursor: pointer 可以同时在 IE FF 中显示游标手指状, hand 仅 IE 可以

  8.FF: 链接加边框和背景色,需设置 display: block, 同时设置 float: left 保证不换行。参照 menubar, 给 a 和 menubar 设置高度是为了避免底边显示错位, 若不设 height, 可以在 menubar 中插入一个空格。

  9.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法:
div{margin:30px!important;margin:28px;}
  注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器可以识别。所以在IE下其实解释成这样:
div{maring:30px;margin:28px}
  重复定义的话按照最后一个来执行,所以不可以只写margin:XXpx!important;

  10.IE5 和IE6的BOX解释不一致
  IE5下
div{width:300px;margin:0 10px 0 10px;}
  div的宽度会被解释为300px-10px(右填充)-10px(左填充)最终div的宽度为280px,而在IE6和其他浏览器上宽度则是以300px+10px(右填充)+10px(左填充)=320px来计算的。这时我们可以做如下修改
div{width:300px!important;width /**/:340px;margin:0 10px 0 10px}
  关于这个/**/是什么我也不太明白,只知道IE5和firefox都支持但IE6不支持,如果有人理解的话,请告诉我一声,谢了!:)

  11.ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值所以先定义
ul{margin:0;padding:0;}
  就能解决大部分问题

  注意事项:

  1、float的div一定要闭合。

  例如:(其中floatA、floatB的属性已经设置为float:left;)
<#div id="floatA" ></#div>
<#div id="floatB" ></#div>
<#div id="NOTfloatC" ></#div>
  这里的NOTfloatC并不希望继续平移,而是希望往下排。
  这段代码在IE中毫无问题,问题出在FF。原因是NOTfloatC并非float标签,必须将float标签闭合。
  在
<#div class="floatB"></#div>
<#div class="NOTfloatC"></#div>
  之间加上
<#div class="clear"></#div>
  这个div一定要注意声明位置,一定要放在最恰当的地方,而且必须与两个具有float属性的div同级,之间不能存在嵌套关系,否则会产生异常。
  并且将clear这种样式定义为为如下即可:
.clear{
clear:both;}
  此外,为了让高度能自动适应,要在wrapper里面加上overflow:hidden;
  当包含float的box的时候,高度自动适应在IE下无效,这时候应该触发IE的layout私有属性(万恶的IE啊!)用zoom:1;可以做到,这样就达到了兼容。
  例如某一个wrapper如下定义:
.colwrapper{
overflow:hidden;
zoom:1;
margin:5px auto;}

  2、margin加倍的问题。

  设置为float的div在ie下设置的margin会加倍。这是一个ie6都存在的bug。
  解决方案是在这个div里面加上display:inline;
例如:

<#div id="imfloat"></#div>


  相应的css为

#IamFloat{
float:left;
margin:5px;/*IE下理解为10px*/
display:inline;/*IE下再理解为5px*/}

  3、关于容器的包涵关系

  很多时候,尤其是容器内有平行布局,例如两、三个float的div时,宽度很容易出现问题。在IE中,外层的宽度会被内层更宽的div挤破。一定要用Photoshop或者Firework量取像素级的精度。

  4、关于高度的问题

  如果是动态地添加内容,高度最好不要定义。浏览器可以自动伸缩,然而如果是静态的内容,高度最好定好。(似乎有时候不会自动往下撑开,不知道具体怎么回事)

  5、最狠的手段 - !important;

  如果实在没有办法解决一些细节问题,可以用这个方法.FF对于"!important"会自动优先解析,然而IE则会忽略.如下
.tabd1{
background:url(/res/images/up/tab1.gif) no-repeat 0px 0px !important; /*Style for FF*/
background:url(/res/images/up/tab1.gif) no-repeat 1px 0px; /* Style for IE */}
  值得注意的是,一定要将xxxx !important 这句放置在另一句之上,上面已经提过

网页设计命名标准(美工) 网页图片命名 网页css命名

文件夹命名

文件夹主要建立以下文件夹:
1、Images 存放一些网站常用的图片;
2、Css 存放一些CSS文件;
3、Flash 存放一些Flash文件;
4、PSD 存放一些PSD源文件;

5、Temp 存放所有临时图片和其它文件;

6、copyright 版权信息(可选)

8、readme 说明文件

Css统一命名

注:本CSS命名规则只适合物table制作模式下

1、 css文件统一放在css文件夹下;命名css.css

2、 主样式定义:body、table、td、tr、a

3、 链接样式定义:link_white(白色);link_black (黑色);link_blue (蓝色) 等等;

说明:如有重复的后面加阿拉伯数字;如 link_red01 有下划线的如:link_red_

4、 文字样式定义:font_red (红色);font_red_14 (红色14号字);font_red_14b (红色14号加粗)

5、 边框样式定义:border_red_tblr (红色四个边);border_red_blr(红色底左右三边);border_red_lr(红色左右两个边);border_red_b (红色底一个边)等等;

6、 表单样式定义:text_100 (文本字段宽为100); textarea_200_red (文本区域宽为200有红色边框);select_100 (列表宽为100);button_150 (按钮宽150);

说明:表单用宽度定义,在命名中最长写到:"text_100_red"

7、 线的样式定义:line_X (横线);line_Y (竖线);line_X_red (红色横线);line_X_red2 (两个像素的红色横线);说明:在line中只定义虚线,实线在border中定义

8、 其它样式定义:在这里主要定义一些个性化的样式;

文件命名

head.asp 头文件

foot.asp 底文件

index.asp 首页文件

sort.html 分类嵌套文件

article_channel.asp 文章_频道页

article_list.asp 文章_列表页

article_detail.asp 文章_显示页
注明:如果有多个文章频道,则用article01,article02,article03等等
exhibit_channel.asp 展会信息_频道页
exhibit_list.asp 展会信息_列表页
exhibit_detail.asp 展会信息_显示页
product_channel.asp 产品中心_频道页
product_list.asp 产品中心_列表页
prodect_detail.asp 产品中心_显示页
corporation_channel.asp 会员_频道页
corporation_list.asp 会员_列表页
corporation_detail.asp 会员_显示页

information_channel.asp 商机信息_频道页
information_list.asp 商机信息_列表页
information_detail.asp 商机信息_显示页
job_channel.asp 招聘_频道页
job_list.asp 招聘_列表页
job_detail.asp 招聘_显示页
hr_channel.asp 求职_频道页
hr_list.asp 求职_列表页
hr_detail.asp 求职_显示页
job_hr_channel.asp 人才中心_频道页
job_hr_lisr.asp 人才中心_列表页
job_hr_detail.asp 人才中心_显示页
copyright.asp 版权页
图片命名
1、导航命名:menu_****.gif 如:menu_bg .gif(导航的背景图)

2、会员登录:login_****.gif 如:login_bg.gif (会员登陆的背景图)

3、搜索命名:search_****.gif 如:search_bg.gif (搜索的背景图)

4、小 图 标:ico_数字.gif 如:ico_001.gif

5、线的命名:line_X_颜色.gif 如:line_X_red.gif(红色横向虚线)说明:line只命名虚线

line_Y_red.gif(红色纵向虚线)

6、广告命名:ad_数字.gif 如:ad_001.gif

7、其它栏目的图片:以栏目名的第一个字母_****.gif

如:xwzx_bg.gif (新闻中心背景) cpzx_l.gif (产品中心的左边图)

8、产品与栏目热点图片: pic_数字.gif 如:pic_001.gif

说明:上、下、左、右 可以缩写为T、B、L、R

div+css命名参考

div+css命名参考



用了一段CSS 布局设计网页,发现自己的命名有点混乱,完全按照自己的想法命名,虽然没什么影响,有不给别人看源文件,但是工作室有时候和团队合作完成项目的时候,就遇到麻烦了,要修改一个地方相当的费事.所以还是有个标准比较好啊!
在网上看到的一个相关的参考,再加上平时也研究别人的代码,发现这样的命名使用很广泛!我再加上自己的经验,希望对看到这篇文章的人能有用!

命名参考

常用的CSS命名规则:

头:header
内容:content/container
尾:footer
导航:nav
侧栏:sidebar
栏目:column
页面外围控制整体布局宽度:wrapper
左右中:left right center

命名全部使用小写字母,如果需要多个单词,单词间使用"-"分隔,比如user-list

常用代码结构:

div:主要用于布局,分割页面的结构
ul/ol:用于无序/有序列表
span:没有特殊的意义,可以用作排版的辅助,例如<li><span>(4.23)</span>天幻网六周年天幻网六周年天幻网六周年天幻网六</li>然后在css中定义span为右浮动,实现了日期和标题分两侧显示的效果

h1-h6:标题
h1-h6 根据重要性依次递减
h1位最重要的标题

label:为了使你的表单更有亲和力而且还能辅助表单排版的好东西,例如:<label for="user-password">密 码</label>
<input type="password" name="password" id="user-password" />fieldset & legend:fildset套在表单外,legend用于描述表单内容。例如:<form>
<fieldset>
<legend>title</legend>
<label for="user-password">密 码</label>
<input type="password" name="password" id="user-password" />
</fieldset>
</form>
dl,dt,dd:当页面中出现第一行为类似标题/简述,然后下面为详细描述的内容时应该使用该标签,例如<dl>
<dt>什么是CSS?</dt>
<dd>CSS就是一种叫做样式表(stylesheet)的技术。也有的人称之为层叠样式表(Cascading Stylesheet)。<dd>
<dt>什么是XHTML?</dt>
<dd>XHTML是一个基于XML的置标语言,看起来与HTML有些想像,只有一些小的但重要的区别。可以这样看,XHTML就是一个扮演着类似HTML的角色的XML。 本质上说,XHTML是一个桥接(过渡)技术,结合了XML(有几分)的强大功能及HTML(大多数)的简单特性。</dd>
</dl> C #content

S #subcol

M #maincol

X #xcol这是纵向布局的XHTML结构,c-smx表示网页有三个纵栏, c-sm表示有两个纵栏, c-mx表示有两个纵栏其中一个是附属的, c-m表示一个纵栏。

其中在三纵栏的布局需要分为两层 第一层是#subcol与#main第二层是#main中的#maincol与#xcol。

自定义命名:
根据w3c网站上给出的,最好是用意义命名
比如:是重要的新闻高亮显示(像红色)
有两种.red{color:red}
.important-news{color:red}很显然第二种传达的意义更加明确,所以尽量不要用意义不明确的作为自己自定义的名字

2008年1月26日星期六

[李锐]元搜索引擎的研究和设计

点评:写得很不错,对元搜索引擎的体系架构、关键要点都有很详细的论述,我做的元搜索引擎思路上和文章上讲的很相似,值得想做元搜索引擎的朋友借鉴学习。

摘要:论文简要介绍了元搜索引擎的相关知识,提出了一个元搜索引擎系统的设计构想。该系统采用了反馈机制,在用户察看结果时进行在线学习和调整。在系统设计中提出了搜索语法的设计、基于用户喜好的成员搜索引擎的自动调度机制、个性化服务的支持等,并给出了建立一个元搜索引擎系统的关键技术。最后分析了该系统的意义以及尚需解决的问题。

关键字:Internet 搜索引擎 元搜索引擎 信息检索 搜索语法

一. 引言

在互联网发展初期,网站相对较少,网页数量亦较少,因而信息查找比较容易。随着Internet的飞速发展,人们越来越依靠网络来查找他们所需要的信息,然而伴随互联网爆炸性的发展,普通网络用户想找到所需的资料简直如同大海捞针,以至于迷失在信息的海洋中不知所措,出现了我们所说的"信息丰富,知识贫乏"的奇怪现象。搜索引擎正是为了解决这个"迷航"问题而出现的技术。搜索引擎(Search Engine简称SE)以一定的策略在互联网中搜集、发现信息,对信息进行理解、提取、组织和处理,并为用户提供检索服务,从而起到信息导航的目的。

现在,网上的搜索引擎有很多,比较著名的有Google,Yahoo,AltaVista,Dogpile,百度等。按照信息搜集方法和服务提供方式的不同,搜索引擎系统可以分为三大类:目录式搜索引擎,以Yahoo为代表(最近改为使用全文搜索技术);全文搜索引擎,以Google为代表;元搜索引擎,以Dogpile为代表。

二. 元搜索引擎概述

据信,一个单一搜索引擎的网络覆盖率最多只能覆盖到整个Internet资源的30-50%[3],因而查全率便无法保障;再加上任何搜索引擎的设计,均有其特定的数据库索引范围、独特的功能和使用方法,以及预期的用户群指向,导致同一个搜索请求,在不同搜索引擎中查询结果的重复率不足34%[5],因而查准率亦无法保证;因此,要想获得一个比较全面、准确的结果,就必须反复调用多个搜索引擎,并对返回结果进行比较、筛选和相互印证。元搜索引擎便应运而生。

2.1 定义

元搜索引擎(Meta Search Engine 简称MSE),是一种建立在独立搜索引擎基础上,调用其它独立搜索引擎的引擎,亦称"搜索引擎之母(The mother of search engines)"。在这里,"元"(Meta)为"总的"、"超越"之意,元搜索引擎就是对多个独立搜索引擎的整合、调用、控制和优化利用。相对于元搜索引擎,可被利用的独立搜索引擎称为"源搜索引擎"(Source Search Engine),或"成员搜索引擎"(Component Search Engine)。从功能上来讲,元搜索引擎像是一个过滤通道:以多个独立搜索引擎的输出结果作为输入,经过一番提取、剔除、萃取等操作,形成最终结果,然后将最终结果输出给用户。

2.2 元搜索引擎的典型工作过程可以归纳如下

① 用户通过统一的查询界面输入查询请求,元搜索引擎对查询进行一定的预处理。

② 元搜索引擎根据成员搜索引擎调度机制,选择若干成员搜索引擎。

③ 元搜索引擎根据选择的成员搜索引擎的查询格式,对原始查询请就进行本地化处理,转换为成员搜索引擎要求的查询格式串。

④ 向各个成员搜索引擎发送经过格式化的查询请求,等待返回结果。

⑤ 收集各个独立搜索引擎的返回结果。

⑥ 对返回结果进行综合处理,例如,消除重复链接,死链接等,形成最终结果。

⑦ 以一定的格式将最终结果返回给用户。

2.3 元搜索引擎的特点

元搜索引擎区别于独立搜索引擎,主要有这样一些特征:

① 不用设立庞大网页数据库,节省存储设备

② 提供了统一的外界模式,将一次查询提交到多个独立搜索引擎

③ 基于独立搜索引擎结果的二次加工

④ 标明结果记录的来源搜索引擎及其局部相关度,提供了全局相关度。

三. 元搜索引擎发展趋势

目前,元搜索引擎的研究、开发十分活跃。它要用到了信息检索、人工智能、数据库、数据挖掘、自然语言理解等领域的理论和技术,具有综合性和挑战性。又由于搜索引擎有大量的用户,由此衍射出许多商机,具有很好的经济价值,据估计现在已有几十亿美元的全球市场,所以引起了世界各国计算机科学界、信息产业界和商界的高度关注,已投入了不少的人力、物力,也取得了不俗的成绩。

一个理想的元搜索引擎应该具备以下功能要求:

① 涵盖较多的搜索资源,可随意选择和调用独立搜索引擎,还可根据一定调度策略进行自动调度。

② 具备尽可能多的可选择功能,如资源类型(网站、网页、新闻、软件、FTP、MP3、Flash、图像、影视等)选择、等待时间控制、返回结果数量控制、结果时段选择、过滤功能选择、结果显示方式选择等。

③ 强大的检索请求处理功能(如支持逻辑匹配检索、短语检索、自然语言检索等)和不同搜索引擎间检索语法规则、字符的转换功能(如对不支持"NEAR"算符的搜索引擎,可自动实现由"NEAR"向"AND"算符的转换等)。

④ 详尽全面的检索结果信息描述(如网页名称、URL、文摘、源搜索引擎、结果与用户检索需求的相关度等)。

⑤ 支持多种语言检索,比如提供中英文搜索等。

⑥ 可对结果进行自动分类,如按照域名、国别、资源类型、区域等进行分类整理。

⑦ 可以针对不同用户提供个性化服务。

目前Internet上面有很多元搜索引擎,良莠不齐。在功能实现上,各有侧重点,能做到"理想"的尚不多见。一些元搜索引擎在某些方面做得很好,但是在其他功能上却存在着缺陷或尚需改进:如大多数的元搜索引擎不支持自然语言检索,不支持中文检索等。元搜索引擎的功能受着源搜索引擎和元搜索技术的双重制约:一方面,源搜索引擎的各具特色的强大功能在元搜索引擎中受到限制而不能充分体现,而另一方面,任何一种元搜索技术都不能发掘和利用独立搜索引擎的全部功能。随着新技术的不断涌现,会使元搜索引擎做得更好,取得更好的用户满意度,这些技术有:

1.提高搜索引擎对用户检索提问的智能理解,体现为对自然语言查询请求的支持。

2.确定搜索引擎信息搜集范围,提高搜索引擎的针对性,体现为主题搜索,多媒体搜索。

3.基于智能代理的信息过滤和个性化服务。

4.重视交叉语言检索的研究和开发[9],提供多语言检索的支持,提供本土化的搜索服务。5.提高信息查询结果的精度,提高检索的有效性。

四. 一个元搜索引擎的设计构想

基于以上的研究,我们提出了一个元搜索引擎的设计构想。在这个构想中,我们采用了反馈机制,但我们并没有具体细化每一步,仅提供了一个整体框架,对于体系结构中的功能模块,我们对它们的功能和实现技术作了较为详细地分析,提供了若干可供选择的技术。在实现的时候可以选用其中的若干模块,以减少系统复杂性;也可以增加若干功能模块,以增加系统的功能,即这个设计构想具有良好的可伸缩性。

4.1 系统结构框架

4.2 功能模块介绍 4.2.1 图形化用户接口(GUI)

这部分是程序和用户的交接面,主要用来接受用户的原始查询请求和将最终结果显示给用户。实现的时候可以采用若干界面,比如可以使用命令行方式,图形界面等。这部分不牵涉到数据的处理,可以很好地实现对一份数据的多个视图。实现是可以考虑多种人机交互技术,将用户的查询请求提交给系统即可。

在界面上可以让用户设定成员搜索引擎列表,每个成员搜索引擎的最长等待时间、返回结果数量等;以及结果显示方式、排序策略、分类方式等。这部分信息可以保存在客户端的用户cookie中,这样以来用户不必每次都输入自己的定制信息,也就提供了个性化的服务。Cookie当中也可以保存用户的搜索纪录,可以对搜索历史和搜索习惯等进行知识挖掘,用于模式发现等。

4.2.2 查询预处理器

这部分接受GUI传来的原始查询请求,并对原始查询请求进行预处理,提供交叉语言检索和自然语言支持等功能。这部分需要用到查询语法和操作,在这里简要介绍一下我们设计的查询语法和操作规则。我们设计的查询语法和操作规则如下:

布尔逻辑运算

包括AND、OR、NOT和()等,这是最基本、最常用的语法规则:AND 表示搜索结果中会包含所有的关键词,可以使用'+'(加号)和空格来代替。OR 表示搜索结果中会包含至少一个关键词,可以使用','(逗号)来代替。NOT表示搜索结果中会排除NOT之后的关键词,可以使用'-'(减号)或'!'(感叹号)来代替。例如:搜索JFC NOT MFC,则结果中就只包含JFC,而不包含MFC。() 用来限制优先级,作用和数学运算中的()运算符相似。

其他简单而又较为常用的语法规则""

用来支持短语搜索,搜索引擎会将""中的关键词或其组合作为一个整体性的短语进行搜索。例如:搜索有关search engine方面的信息,可输入"search engine",搜索引擎就把"search engine"当作一个短语来搜索。如果不用"",就会搜索到既包含search又包含engine的信息,显然其中有很多是你不需要的。通配符 通配符用来代替若干字符组合,类似于正则表达式。通配符可为'*',代表任意多个字符,'?'代表当前位置上的字符可以是任意字符。

常用高级检索语法规则

near 可限定在一定区域范围内同时出现的关键词,这些关键词可能并不相邻,间隔越小的排列位置越靠前,其间隔用near/n控制,n为一具体数值,表示间隔最大不超过n个单词。

intitle 限定仅在标题中搜索关键字

inurl 限定仅在url中搜索关键字

insite 限定仅在给定的站点中搜索资源用户的查询请求可以用以下几部分描述:要包含的关键字(include),不包含的关键字(exclude),可以有任何一个的关键字(any),要包含的短语或句子(all),查询的区域,领域,主题,位置等。对于从GUI送过来的原始查询串,作以下处理:

1.进行自然语言解析,查询数据库,若能找到相应解答,将解答返回给用户。

2.根据搜索语法规则,扫描查询串,形成格式化的查询串,即分开哪部分是全包含,哪部分是不包含的等等。

3.从数据库中读出"stop words",与格式化查询串中的信息进行比较,剔除那些明显不必要搜索的关键字词。

4.对格式化串中的关键字进行"stemming"处理。这一步可以交给各个成员搜索引擎去实现,以减少处理的复杂性。

5.根据关键字词的信息,形成此次查询的领域,主题、区域、位置等信息。

4.2.3 成员搜索引擎调度器

在程序启动的时候,根据以往的用户的搜索历史和习惯,默认设定了若干成员搜索引擎。用户不满意还可以自己设定成员搜索引擎列表。此外程序还有自己的搜索引擎自动调度机制,根据用户的查询主题、领域、区域等信息,以及在以往的搜索中成员搜索引擎的性能表现(响应时间、返回结果数量、用户满意度、领域针对性、支持哪些高级检索功能等),产生一个合适的成员搜索引擎列表。

由于成员搜索引擎的信息(特别是查询串的格式化信息)经常发生变化,如果将它们的代码固定在元搜索引擎得主程序中显然是不合理的,因此我们采用了成员搜索引擎描述文件,以xml进行描述,采用形式化描述,对于每个新加入的成员搜索引擎,只要按照这个形式为其建立一个描述文件,就很容易将其加入到系统中。

4.2.4 查询分发器

接收由成员搜索引擎调度器产生的成员搜索引擎调度列表,连接数据库,读取这些成员搜索引擎的信息,包括主机信息、连接信息、查询参数串格式化信息等等。根据这些信息,同步启动若干线程,分别进行连接相应的成员搜索引擎。向它们发送经查询预处理器处理过的查询信息。这部分的功能的很大一部分是进行数据库的连接,其实有些信息可以让查询代理进行连接数据库,但是为了减少数据库的连接次数,把这部分功能集中起来进行一次连接,多次处理、多次使用。

4.2.5 查询代理

提供元搜索引擎和特定成员搜索引擎的交互接口。它首先接收从查询分发器送来的查询格式串。然后向查询分发器索取自己的查询参数化信息,再根据查询参数化信息,将查询格式串进行本地化,也就是转换成自己的要求格式。在这里有一个细节需要处理,就是有些成员搜索引擎肯定不支持这个元搜索引擎的部分高级检索功能,比如:不支持短语检索,通配符功能等。在处理的时候,删除原来的查询串中的这部分请求信息。

接下来就把本地化的查询请求发送到成员搜索引擎,等待返回结果。由于有时候有些服务不可用,所以可以先使用一个类似于ping命令的程序,先测试服务器是否可用,确定可用后再发送查询请求,开始连接后设置一个等待时间阀值,超时之后放弃。接收到返回结果后,使用html解析器从结果页面中提取检索结果,需要包含以下若干信息:链接信息、得到此链接的成员搜索引擎、在成员搜索引擎中的排序信息、目标页面的站点信息、目标页面的描述信息、锚记文字等。

4.2.6 综合处理模块

这是元搜索引擎实现的核心模块,一个元搜索引擎的执行效率的好坏与这个模块的实现紧密联系在一起,它需要使用若干功能模块,具体实现技术请参考4.3节:

结果收集模块负责同步接收成员搜索引擎的返回结果,并将最先得到的成员搜索引擎的返回结果呈现给用户,以减少用户的等待时间。

网页过滤模块根据重复结果的评判标准去除返回结果中的重复链接,根据用户的资源要求、时间限制、领域限制等信息,去除冗余的链接信息。

网页排序模块是根据一定的结果融合技术对检索结果进行融合处理。

综合处理模块负责将最终结果提交给GUI,由GUI把结果呈现给用户。此模块还负责使用搜索评价机制对此次搜索进行评价,并在客户端的cookie中记录此次搜索。

4.2.7 数据库

这里的数据库是一个比较笼统的概念,既包括实际的数据库,也包括一些配置文件和设置信息等,用来保存系统运行中需要使用的数据。这些信息包括:有关于自然语言问题的解答,成员搜索引擎的信息(主机信息、功能信息、参数化信息、检索性能信息),用户信息(搜索历史信息、个性化设置信息、个人信息等),禁止词表,词汇表(同义词,反义词,翻译信息,领域信息、主题信息等)。在具体实现时,有些信息可以放在客户端,以减少服务器的存储压力。

4.3 实现中的关键技术

重复结果的评判标准[12]

搜索结果中的链接(hyperlink)、锚记(anchor)、描述(description)等可以用来判断两个结果是否重复。我们基于下面的策略进行判断:

1.首先判断两个结果的hyperlink是否相同,若相同则认为是同一结果。

2.比较URL的相似性,如果主机IP地址、路径、文件名完全相同,也认为是同一结果。

3.比较文档的元信息,比如标题、作者、摘要、大小等信息,超过相似程度阀值的结果认为是相同的。对于这一条,为了提高系统的响应速度,可以不予实现。

结果融合技术[6,13,14]

从元搜索引擎的工作原理可以看出,结果融合技术是至关重要的,因此人们也提出了很多种方法来实现。较为简单的方法有:将响应速度最快的搜索引擎的结果呈现给用户;分别显示各个搜索引擎的返回结果,不做任何处理。较为复杂一些的就是根据一定的策略来实现结果融合了。

在文献[13]中,张卫丰等人给出了4种合成算法。在文献[14]中,J.P.Callan 等人针对不同的情况也给出了4种典型的合成算法。具体请参考相关文献。结果融合的实质是对检索结果的重新排序的过程。我们提出技术基于这样的认知:一个检索结果的重要程度取决于3个方面:检索到它的成员搜索引擎的个数,它在检索到各个成员搜索引擎中的排序位置,检索到它的成员搜索引擎的性能评价。假设有m个成员搜索引擎检索到它,它在第i个成员搜索引擎的排列位置是ri,第i个成员搜索引擎的性能评价是wi,那么这条结果的最终权值p是:

p = ∑(ri * wi) i=1...m

根据用户的设定,还可以对检索结果作进一步的处理:检测目标页面是否存在,以消除死链接;取回结果的目标页面,做文本分析,以提供更高的相关度判断和提供网页快照;对处理后的结果进行分类,可以按照领域、主题、站点等进行分类。

有效信息提取技术

在接收到成员搜索引擎的返回结果后,很重要的一个技术就是如何从结果页面中提取所需要的检索结果。由于成员搜索引擎间使用的技术不同,结构也相差很大,能否正确提取结果便是一个十分棘手的问题。基于这样的一个认知:搜索的结果都是动态生成的,因此所需要的结果必定是被包装起来的,也就是可以找到一个头和一个尾,在头和尾之间的内容便是我们所需要的内容。现在的办法是使用人工的方式,寻找这个头和尾,然后在配置信息里面告诉系统,由查询代理负责根据这些信息提取所需要的结果。

现在也有这样的实现方法,就是基于统计的方法,使用人工智能技术,让系统具有自学习的功能,这样以来就不用人工的干预,可以自主形成成员搜索引擎的在结果提取方面的信息。现在像Google提供了web services,可以直接提取相应信息(检索结果、响应时间、结果数量、文档相关度等),但是只有作为注册用户才可以无限制使用。这可能是一个更好的解决办法,因为独立搜索服务提供商更清楚自己的系统和使用的技术,也可以更直接的提供我们所需要的结果信息。

成员搜索引擎调度机制和性能评价机制[3,12]

成员搜索引擎调度技术是元搜索引擎的技术核心,即决定将用户查询发送到哪些成员搜索引擎上,可以收到好的检索效果。元搜索引擎下的每个成员搜索引擎都有自己的由一系列文档所组成的文本数据库,成员搜索引擎调度技术就是为每个查询提供最可能包含有用文档的成员搜索引擎列表,这对元搜索引擎的执行效率是至关重要的。在文献[12]中提到了四种方法:朴素算法、定性方法、定量方法和基于学习的方法。

为了实现成员搜索引擎的自动调度,我们使用用户的反馈信息,实现基于学习的调度机制,这样就需要一个成员搜索引擎的性能评价机制。

评价的依据是多次检索活动的记录数据,包括响应时间、返回数量等,其中主要部分是文档相关度,这部分知识可以通过用户提交(这是最好的方法,但是一般来讲,用户只是使用,而不进行反馈),也可以通过跟踪用户的点击链接活动来获得。评价是分层次来进行的:基于单条检索结果的评价、基于一次检索活动的评价、基于检索词的评价、基于检索领域的评价、整体检索性能的评价。

对于用户给出的搜索请求,如果系统中有各搜索引擎关于请求关键词的评价数据,则选择对这个关键词评价数据最优的一些搜索引擎进行检索;否则进行判断搜索请求是属于哪个领域,并且系统中有各成员搜索引擎在该领域的评价数据,则选择该领域最优的一些搜索引擎进行检索;否则选择整体检索性能最优的一些搜索引擎进行检索;若用户设定了使用相应速度最快或者返回结果最多等方式,则选用相应指标靠前的一些搜索引擎进行检索。

五. 浅析搜索引擎在电子商务中的应用

搜索引擎在电子商务中也可以大展伸手,现在就有很多的网站依靠Google的竞价排名服务来开展业务,这也是一些搜索服务提供商的盈利渠道之一。另外,根据用户的注册信息、搜索历史信息、搜索关键字所属领域、搜索习惯、访问记录等,可以发掘出用户的潜在购买欲望和感兴趣的商品等,这些信息可以被电子商务站点用来发现它们的潜在客户,可以给它们的客户定期发送它们感兴趣的商品更新列表等等。

六. 总结

Internet是一个庞大的信息源,它正处在急剧膨胀的时期,人们现在逐渐倾向于在网络上查找自己需要的信息。为了方便地利用Internet上的丰富资源,人们借助于相关学科的研究成果开发各种工具,搜索引擎便是其中最为常用的工具。

在已有的独立搜索引擎的基础上建立一个高效的元搜索引擎能够扩展独立搜索引擎的处理能力,提高检索的查全率,并且有可能进一步提高查准率。但是各个成员搜索引擎的自治性引起了集成的困难,困难主要来自:检索界面的差异、文档索引方法的不同、相关函数的差异、查询参数的不同、检索功能的强弱等。我们设计的系统吸收了一些成功系统的优点,同时也具有自己的特点:给出了自己的搜索语法;对搜索引擎检索效果的评价机制;成员搜索引擎的自动调度机制;设计了搜索引擎描述文件方法,使系统具有良好的可扩展性;给出了自己的结果融合算法;可以更踪用户的使用,接受用户反馈进行自主学习和调整,使系统具有自适应性。

七. 后续工作

我们选用了JAVA作为实现系统的程序设计语言工具,我们已经利用面向对象的软件工程理论分析此系统结构,并用java实现了其中的部分类的功能,定义了若干接口。接下来的工作是实现整个系统,对其中的部分算法作进一步的优化和改进。还可以根据需要,增加若干功能模块,使系统功能更加强大,系统更健壮。

[参考文献]

[1] Lawrence S.,Giles C.L. Accessibility of infomation on the Web[J]. Nature,1999,400(7):7-109

[2] Barker J. M eta-search Engines. Teaching Library Internet Workshops University of California[EB/OL]. http://www.lib.berkeley.edu/TeachngLib/Guides/Internet/M etaSearch.html,Berkeley,April 2000

[3] 基于Agent的元搜索引擎的研究与设计 陈俊杰,薛云,宋翰涛,陆玉昌,余雪丽。 计算机工程与应用,2003,Vol.10

[4] 集成搜索引擎与元搜索引擎 邢志宇 http://www.sowang.com/zhuanjia/xzhy.htm

[5] 元搜索引擎研究 张卫丰,徐宝文,周晓宇,李东,许蕾 计算机科学 2001 Vol.28

[6] 元搜索引擎系统合成算法的约束条件 阳小华,刘振宇, 谭敏生, 刘 杰, 张敏捷。 软件学报 2002 Vol.14 No.7

[7] 搜索引擎技术及趋势 李晓明,刘建国。

[8] Yang M.H.,Yang C.C.,Chung Y.M. A Natural Language Proccessing Based Internet Agent[J]. System man and Cybernetics IEEE,1997(1):100-105

[9] 交叉语言信息检索研究进展 张永奎,王树锋 计算机工程与应用 2002 Vol.19

[10] Building Efficient and Effective M etasearch Engines ACM Computing Surveys, Vol.34,No.1, March 2002

[11] 搜索引擎与Internet信息获取 薛洪明 盐城师范学院

[12] ISeeker——一个高效的元搜索引擎 彭洪汇,林作铨 计算机工程 2003 Vol.29 NO.10

[13] 元搜索引擎结果生成技术的研究 张卫丰,徐宝文,周晓宇,许蕾,李东 小型微型计算机系统 Vol.24 NO.1

[14] Callan, J.P., Lu, Z., Croft, W.B. Searching distributed collections with inference networks. In: Fox, E.A., Ingwersen, P., Fidel, R.,eds. Proceedings of the 18th International Conference on Research and Development in Information Retrieval. ACM Press, 1995.21~28.

计算技术研究所 李锐colin719@126.com

作者: colin719 2004年12月7日, 星期二 23:13

作者Blog: http://blog.csdn.net/colin719/

http://colin719.blogchina.com/

a:hover的位置居然有讲究

如下:a:hover是没有效果的。必须把它放在最后!
.menu{width:auto; height:25px; background:url(menuBG.gif); text-align:center; margin:1px; font-size:14px; padding-top:8px;}
.menu a{color:#FFFFFF; text-decoration:none;}
.
menu a:hover{color:#FFFF00}
.menu a:visited{color:#FFFFFF}
下面的才是正确的方式
.menu{width:auto; height:25px; background:url(menuBG.gif); text-align:center; margin:1px; font-size:14px; padding-top:8px;}
.menu a{color:#FFFFFF; text-decoration:none;}
.menu a:visited{color:#FFFFFF}
.menu a:hover{color:#FFFF00}

web标准居中 firefox
1.申明  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" >
2. body {text-align:center;}
3.DIV层必须指定width大小,同时加入Margin-Right: auto; Margin-Left: auto;

2008年1月25日星期五

读对象数据流 Java 出错代码

import java.io.*;
import java.util.*;
public class Test{
 public static void main(String[] args) throws IOException{
/* Date d=new Date();
 
 FileOutputStream f=new FileOutputStream("date.txt");
 ObjectOutputStream s=new ObjectOutputStream(f);
 try{
  s.writeObject(d);
  s.close();
 }catch(IOException e){
  e.printStackTrace();
 }
 */
 
 Date d=null;
 FileInputStream f=new FileInputStream("date.ser");
 ObjectInputStream s=new ObjectInputStream(f);
 try{
  d = (Date)s.readObject(d);//此处错误提示The method readObject() in the type   s.close();
 }catch(IOException e){      //ObjectInputStream is not applicable for the arguments (Date)

  e.printStackTrace();
 }
  System.out.println("date  at"+d);
 }
}
 

Java 链接access的mdb代码如下

access的mdb代码如下:
try{
string strurl =
"jdbc:odbc:driver={microsoftaccessdriver(*.mdb)};dbq=mytest.mdb";
class.forname("sun.jdbc.odbc.jdbcodbcdriver");
connection connacce = drivermanager.getconnection(strurl);
statement stmt = connacce.createstatement();
string sql = "select * from test";
resultset rs = stmt.executequery(sql);
while (rs.next()) {
system.out.println(rs.getstring(2));
}
rs.close();
stmt.close();
connacce.close();
}catch(exception e){
e.printstacktrace();
}

2008年1月22日星期二

管道数据流

//代码:
import java.io.*;
public class Test{
 public static void main(String[] args) throws IOException{
  PipedOutputStream pos=new PipedOutputStream();
  PipedInputStream pis=new PipedInputStream(pos);
  byte datamover=0;
  System.out.println("Now I start to work....");
  try{
   System.out.println("Transfer "+datamover+" to pos");
    pos.write(datamover);
    System.out.println("pis get "+(byte)pis.read());   
    }finally{
     pis.close();
     pos.close();
    }
       
  } 
    
  }
 
 
/*输出为
Now I start to work....
Transfer 0 to pos
pis get 0
*/

 
 

2008年1月21日星期一

亚交做弊方法揭露

 

为什么要公布一个违规的方法:
1. 让大家别用这个方法去作弊亚交了,封了别怪我。
2. 可以用这个方法去延伸,去更有效的做其他的产品。
3. 我觉得这个方法不是每个人每个站都适用,除非网友特别想得到你的服务。否则不要因此得不偿失。


有人说,一个技术类的网站,做亚交不过娱乐类的网站,我就不信。
在各大技术论坛,菜鸟论坛跟帖了一些文章
_______________________________

一个程序员是如何学好英语的

我觉得学好英语重要的还是环境问题,如果周围都是外国人,你肯定学的快
我就是这样自己给自己创造环境的
   我是一个程序员,平时要面对大量的英文代码,所以查阅一些英文资料是必不可少的了,可是我的英文阅读水平真的很差,因为这个,我的水平提高的很慢。曾经在网上查了好多种方法,比如:把本机的操作系统换成英文的,里面所安装的软件也都换成英文的,我也都试过,虽然也起到了一定的作用,可是却没有达到我所要的效果,所以我一直很苦恼。那天从网上下载了一份动画式的开天辟地学英语,看了看,挺简单,于是就联想到去网上找几个外国的网友,平时交谈用英文交谈,这样英语水平肯定就会提高的很快了,于是我找过icq,msn,这两种工具,因为这两种是跨国的,外国网友比较多了,所以就用了,也找到了不少外国网友,有美国的,新加坡的,韩国的,日本的,英文水平也提高了一些,然后和他们交谈的过程中,他们说亚洲交友中心里有好多外国的朋友可以一起交流,就好像我们上大学的时候的英语角一样,我以前老早就听说过亚洲交友中心,可是一直对交友不感兴趣,可是现在是为了学习英语,所以就去注册了个id,开始在亚洲交友中心交些外国网友,学习英语,过了有半年吧,英语水平提高的非常快,而且不光是阅读能力,口语能力也很不错,因为我们后面一段日子里,我们经常试着语音聊天,开始的时候,很生疏,经常有语法不对,语意不对,单词错了的情况,但是网友们很宽容,一点一点的纠正,到最后,我就放开了心态,慢慢就放开额,呵呵,真是个好地方,我现在依然还在亚洲交友中心里混呢,id:网络技术专家,呵呵,欢迎大家和我交流啊
在这里附上一些工具的网址:有些软件自己去这些网站上去下载吧,具体过程不说了,相信你都会,如果不会,可以加我qq:470xxxxx,我会帮助你的。
亚洲交友中心:
注册地址是:http://asiafind.com/go/gxxxx-pmem+reg
icq注册地址:https://www.icq.com/register/
msn注册地址这个注册起来比较费劲,所以找了一个向导式的安装说明又页面,你仔细看看吧):http://messenger.live.cn/xxx.htm
基本上我知道的就这几个了,如果还有请你加我qq告诉我别的,啊,多谢你了

――――――――――――

用以上的方法。一个月赚了400美金。后来被封了。
但是用以上的技巧,我做其他的联盟,又赚了400美金,嘿嘿:)
欢迎大家来站长网投稿,碰撞更多的赚钱理念,不交流,不分享,思想不活跃。

Java 采集网页源码

项目需要,非要采集别人网站的MP3,没办法只能做。。好在成功了,分享一下心得。。
同样的方法,采集FALSH,文本都可以的。。
首先要采集别人的东西就要登陆别人的网页查看源代码找到下载地址,其实就这么简单。。
那就只要先定义一个方法让程序可以自动侦测到网页的源代码了。。
程序代码: 

程序代码:
public  static  String  getWebContent(String  domain){
         System.out.println("开始读取内容...("+domain+")");
         StringBuffer  sb  =  new  StringBuffer();
          try{   
              java.net.URL  url  =  new  java.net.URL(domain);
              BufferedReader  in  =
              new  BufferedReader(new  InputStreamReader(url.openStream()));
              String  line;
              while((line  =  in.readLine())  !=  null){
                  sb.append(line);
              }
             in.close();
          }catch(Exception  e)  {  //  Report  any  errors  that  arise 
            sb.append(e.toString());
                System.err.println(e); 
               System.err.println("Usage:  java  HttpClient  <URL>  [<filename>]"); 
             }   
   return  sb.toString();                 
       }
 

 

 

 

 

 

 

 

 

 

 

 

 

这个方法以网址为参数会返回那个网页的源代码,接着分析对方网页的超链接。。
凡是提供下载的必须提供链接,哈哈,废话。。我们只要根据网页源代码提取到超链接地址
然后村成TXT,直接用FLASHGET下载就行了
那么怎么分析出网页的超链接?   
当然是用正则表达式了于是有了下面这个方法
程序代码: 

程序代码:
    public static String matcherStr(String str, String cp, String s){
        if(str==null || str.equals("")){
            return "";
        }
        String txt = new String();
        txt = str;
        if(str!=null && !str.equals("")){
            txt = str;
            Pattern p = Pattern.compile(cp,2); //参数2表示大小写不区分
            Matcher m = p.matcher(txt);
            StringBuffer sb = new StringBuffer();
            int i=0;
            boolean result = m.find();
            //使用循环将句子里所有匹配的内容找出并替换再将内容加到sb里
            while(result) {
                i++;
                sb.append(m.group());
                sb.append(s);
                //继续查找下一个匹配对象
                result = m.find();
            }
            txt = String.valueOf(sb);
        }else{
            txt = "";
        }
        return txt;      
    }
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

一次匹配一点,不行就再匹配,直到取出网址,存在StringBuffer里面,等都弄出来了
或者打印另存成txt或者直接用程序存成TXT
只要打开FLASHGET,然后开着TXT    全选,复制,就会自动将地址添加到FLASHGET里面了
批量下吧,兄弟。。。。

2008年1月20日星期日

java 实现web 登陆

Web登陆无非就是网页获取,cookie 的管理,post和get方式的模拟。

1.网页内容获取
Java.io.InputStream in;
java.net.URL url = new java.net.URL(www.xyz.com/content.html);
java.net.HttpURLConnection connection = (java.net.HttpURLConnection)
url.openConnection();
connection = (java.net.HttpURLConnection) url.openConnection();
//模拟成IE
connection.setRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");
connection.connect();
in = connection.getInputStream();
java.io.BufferedReader breader =
new BufferedReader(new InputStreamReader(in , "GBK"));
String str=breader.readLine());
while(st != null){
System.out.println(str);
str=breader.readLine());
}
2.cookie管理
1.直接的方式
取得cookie:
HttpURLConnection huc= (HttpURLConnection) url.openConnection();
InputStream is = huc.getInputStream();
// 取得sessionID.
String cookieVal = hc.getHeaderField("Set-Cookie");
String sessionId;
if(cookieVal != null)
{
sessionId = cookieVal.substring(0, cookieVal.indexOf(";"));
}

发送设置cookie:
HttpURLConnection huc= (HttpURLConnection) url.openConnection();
if(sessionId != null)
{
huc.setRequestProperty("Cookie", sessionId);
}
InputStream is = huc.getInputStream();


2.利用的jcookie包(http://jcookie.sourceforge.net/ )
获取cookie:
URL url = new URL("http://www.site.com/");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
huc.connect();
InputStream is = huc.getInputStream();
Client client = new Client();
CookieJar cj = client.getCookies(huc);

新的请求,利用上面获取的cookie:

url = new URL("http://www.site.com/");
huc = (HttpURLConnection) url.openConnection();
client.setCookies(huc, cj);

3.post方式的模拟
URL url = new URL("www.xyz.com");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
//设置允许output
huc.setDoOutput(true);
//设置为post方式
huc.setRequestMethod("POST");
huc.setRequestProperty("User-Agent","Mozilla/4.7 [en] (Win98; I)");
StringBuffer sb = new StringBuffer();
sb.append("userName="+userNme);
sb.append("&password="+password);

//post信息
OutputStream os = huc.getOutputStream();
os.write(sb.toString().getBytes("GBK"));
os.close();

BufferedReader br = new BufferedReader(new InputStreamReader(huc.getInputStream()))

huc.connect();

String line = br.readLine();
while(line != null){
l

System.out.printli(line);

line = br.readLine();
}


结束语:
上面的代码基本就可以实现网站的登陆、信息获取的功能。看到登陆奇兵等软件卖的那么火,我们也做一个去吧.

参考:
1.A recipe for cookie management

http://www.javaworld.com/javaworld/jw-04-2002/jw-0426-cookie.html

防采集而不防搜索引擎策略

网站生成静态页面攻略4:防采集而不防搜索引擎策略
引用地址:http://www.xici.net/b231526/d41099806.htm [复制│超文本复制] 返回〈asp学习专区〉 关闭窗口

ID: 04973328 perfect-boy 发表于:2006-8-11 11:02:45
从前面的我讲的采集原理大家可以看出,绝大多数采集程序都是靠分析规则来进行采集的,如分析分页文件名规则、分析页面代码规则。
一、分页文件名规则防采集对策
大部分采集器都是靠分析分页文件名规则,进行批量、多页采集的。如果别人找不出你的分页文件的文件名规则,那么别人就无法对你的网站进行批量多页采集。
实现方法:
我认为用MD5加密分页文件名是一个比较好的方法,说到这里,有人会说,你用MD5加密分页文件名,别人根据此规则也可以模拟你的加密规则得到你的分页文件名。
我要指出的是我们加密分页文件名时,不要只加密文件名变化的部分
如果I代表分页的页码,那么我们不要这样加密:page_name=Md5(I,16)&".htm"
最好给要加密的页码上再跟进一个或多个字符,如:page_name=Md5(I&"任意一个或几个字母",16)&".htm"
因为MD5是无法反解密的,别人看到的会页字母是MD5加密后的结果,所以加人也无法知道你在 I 后面跟进的字母是什么,除非他用暴力****MD5,不过不太现实。
二、页面代码规则防采集对策
如果说我们的内容页面无代码规则,那么别人就无法从你的代码中提取他们所需要的一条条内容。所以我们要的这一步做到防采集,就要使代码无规则。
实现方法:
使对方需要提取的标记随机化
1、定制多个网页模板,每个网页模板里的重要HTML标记不同,呈现页面内容时,随机选取网页模板,有的页面用CSS+DIV布局,有的页面用table布局,此方法是麻烦了点,一个内容页面,要多做几个模板页面,不过防采集本身就是一件很烦琐的事情,多做一个模板,能起到防采集的作用,对很多人来说,都是值得的。
2、如果嫌上面的方法太麻烦,把网页里的重要HTML标记随机化,也可以。
做的网页模板越多,html代码越是随机化,对方分析起内容代码时,就越麻烦,对方针对你的网站专门写采集策略时,难度就更大,在这个时候,绝大部分人,都会知难而退,因为这此人就是因为懒,才会采集别人网站数据嘛~~~再说一下,目前大部分人都是拿别人开发的采集程序去采集数据,自己开发采集程序去采集数据的人毕竟是少数。
还有些简单的思路提供给大家:
1、把对数据采集者重要,而对搜索引擎不重要的内容用客户端脚本显示
2、把一页数据,分为N个页面显示,也是加大采集难度的方法
3、用更深层的连接,因为目前大部分采集程序只能采集到网站内容的前3层,如果内容所在的连接层更深,也可以避免被采集。不过这样可能会给客户造成浏览上的不便。如:
大多网站都是 首页----内容索引分页----内容页
如果改成:
首页----内容索引分页----内容页入口----内容页
注:内容页入口最好能加上自动转入内容页的代码

<meta http-equiv="refresh" content="6;url=内容页(http://www.xiaoqi.net)">
其实,只要做好防采集的第一步(加密分页文件名规则),防采集的效果就已经不错了,还是建议两条反采集方法同时使用,给采集者增加采集难度,使得他们知难页退。

垂直搜索引擎的三种模式

 。

 1.垂直搜索的意义
2.垂直搜索的赢利模式是否强壮
3.垂直搜索的万能模版是否存在,如何实现
4.信息的分类

垂直搜索的核心技术实际上就是智能spider的技术,也就是说如何将定向或者非定向的网页抓取下来进行分析后得到格式化数据的技术。

垂直搜索一般情况下爬虫分3种模式:
1.broad search的基础上对信息进行分类挑选组织。
2.定向爬虫获取信息,配上手工或者自动的模版,将信息进行格式化分析入库。
3.目标网站提供特殊的数据源的接口,利用这些数据进行再加工。

现在绝大多数的垂直搜索都是基于2来实施的,从技术上讲有难度但是能够比第一种方案提供更加精确的信息,例如包括价格,时间,描述,规格等。

利用Google算法漏洞狂扫30万流量

 Google排名算法算是考虑比较全面的,但一样会有这样那样的漏洞,比如Google对新网页的处理。

  按正常算法,通常新的网页比较难取得好的排名,因为没有历史,没有反向链接。很多人观察到Google会给新的网页一些特殊权重,使得这些新创建的页面有机会排到前面。

  另外,Google检测到某个关键词突然被大量搜索时,能够意识到这个关键词大概是当前的热门新闻。当检测到这种突发性的新闻关键词时,相关的新网页就给予更多权重,以使用户能够看到最新的相关内容。

  在正常情况下,这两个特点当然给用户带来更好的体验,可有的时候也会成为被利用的漏洞。这一点在2008年1月1号显露无遗。

  1月1号Google为了纪念TCP/IP协议诞生25周年,做了一个特殊的doodle。当用户点击Google首页logo时,会被直接带到搜索"January 1 tcp/ip"的搜索结果页。幻灭有抓图和报道。

  一位叫Ryan Durk的能人立刻抓住这个机会,在24小时内从Google狂扫30万IP。

  Ryan Durk就是利用Google给予新网页的特殊权重。他观察到在搜索January 1 tcp/ip时,当时排在前面的有维基百科的一个网页,和一些其他显然权重不高的网页。Ryan Durk选择Google自己的博客服务blogspot.com,专门为January 1 tcp/ip做了一个博客,博客URL是http://january-1-tcp-ip.blogspot.com

  选择blogspot的原因是blogspot本身域名权重极高,博客可以通过ping得到一些链接,blogspot能扛得住巨大流量,而且允许放Adsense。

  Ryan Durk注册了这个博客后,去一些社会性网摘书签网站提交,然后最聪明的是通过digg网站做了特殊推广。Ryan Durk的目标不是把自己的blogspot网页排到第一,而是把他提交的digg页排到最前面。Digg页排到前5名,就能够吸引大量digg用户继续投票,而且能在digg社区引起关注,带来内部链接。

  结果正如Ryan Durk所预料的,在3小时之内这个digg页进入digg首页,Google排名进第三。后续效应就由digg用户们自己继续扩展了,不必Ryan Durk进行推动。很快他的这个digg页被挖了2000多次,Google排名升到第一。

  通过Google logo来到这个digg页的人也都会想看看,为什么Google会以某种形式背书了Ryan Durk的blogspot博客,所以也就很自然的点击到他的博客。他新建的博客页很快也排在了第二。


  这件事被Google Operating System报道后,很快就产生了大量的抄袭者,引起很多SEO的关注。

  SEOBook的Aaron Wall不愧是SEO行业的思考者,触觉非常敏感,很快联系到Ryan Durk,写了一下整个过程,作为客座文章发在SEOBook博客上。

  据Ryan Durk自己的文章介绍,在24小时内他的博客来了30万独立IP,Adsense的点击率是0.5%。这个点击率应该算是很低的,但是鉴于流量很高,相信他也赚了一小笔,而且没有成本。

网页搜索引擎的发展方向

网页搜索引擎的发展方向[原创]
 
 

 


互联网存在的价值就是低成本、高容量、多方的信息传递。
互联网每一个杀手级应用都离不开信息和传递这两个关键词。邮箱是、即时通讯是、搜索引擎还是、将来的杀手级应用还依然离不开信息和传递这两个关键词。


搜索引擎的发展历史是一个挖掘用户需求然后满足用户需求的过程。在可以预见的不久的将来,从产品角度看待网页搜索引擎的发展大致有如下几个方面:
1. 确解用户之意 信息抽取,优化排序
用户在搜索用到"最新"、"免费"、"官方网站"、"北京"、"电话"等关键词的时候并不是一定需要网页中有这个关键词,而是找这类信息。
用户在找"最新"的时候实际上是希望获取其它词汇的最新相关内容,而不一定是需要含有"最新"这两个词汇的。所以在排序的时候考虑见新的网页排列在靠前位置更满足了用户的需求。
用户搜索"十八街麻花 北京"是想找在北京的十八街麻花的地址或者电话。
用户搜索"北京泽通华程科技发展有限公司 电话"的时候是想找电话号码。
在处理这类请求需要对地理位置信息和"电话"这类词汇进行前端分析,在索引的时候识别电话号码、地址信息,在排序的时候将有相关信息的页面放置在前面、并且在做摘要提取的时候直接体现用户需要。


2. 基于视觉网页块分析
这项技术激动人心,对于优化网页的排序、自动摘要的质量很有帮助。网页搜索引擎可以全文检索一样在几乎纯净的数据中处理,再加上网页中富有的其它信息,你说网页搜索的相关性能不大幅度提升吗?


3. 网页库内容分类
用户在搜索"申花",那他有可能是两个需求,1.足球相关 2.申花电器 3.其它
如果用户搜索"申花"出来的全部是足球相关信息,这显然不能代表不同网民的需求。作为一个入口而言,如果将不同类型(行业不同、知识类型不同)的信息排列在首页,那用户会感觉很happy,满足了多样性的需求。
这也可为将来做个性化搜索提供准备。


4. 潜在相关性
搜索"恐怖",出现一篇拉登的新闻,虽然这篇文章里面没有"恐怖"这个关键词。
搜索"西红柿"出现"番茄",但是网页中没有"西红柿"这个关键词。
这个技术好像还不是很成熟。


5. 网页结构化信息抽取类技术,网页上文本内容的相关性分析
结构化信息抽取实在是未来应用前景最好的一种技术,自动的抽取任意网页上的结构化数据。主要可用垂直搜索引擎:对网页数据进行采集、抽取、深度加工后为用户提供更好的、更专业的服务。
结构化信息抽取可以识别网页中文本之间的相关度,可用于改善多词汇检索的关联度(计算偏移量不仅仅在文本距离上而且在表格单元格的相关性上);改善链接的相关性;改善文件和文本的相关性……
地图搜索、黄页搜索、mp3搜索、图片搜索、bbs搜索等等各种搜索都离不开网页结构化信息抽取。


6. 自然语言处理、简单的语意语法分析
NLP还有很远的路要走,在走路的过程中也可以获得很多可应用的价值。说不定NLP不很成功,但是有可能催生了某种新技术的非常成功。而NLP不需要完全成功前就可以使用他了。
搜索引擎可以根据内容来进行简易的语法分析,将某些呈现在用户面前。比如google的"DEFINE:"就用到了这种方法、同义词的识别等都可以用到这种简单的语法分析来搞定!还可以对具有某类语法的形式的正文进行关键词调权,改善检索效果。


7. 重复识别
互联网的数据冗余实在太厉害了,一篇文章可能会被转载数千数万次。
识别重复的网站、网页、重复的正文、重复的段落识别…………
让用户感觉到"哇噻!这里的内容不重复!"
同时对重复的信息进行调权,装载量大的信息一般比较受欢迎,应该具有更高的权值。但是要对新闻类的内容进行识别,一定时间内加权、一定时间后降权。


8. 行业优化
搜索引擎的行业化是不可避免的。唯一影响搜索引擎行业化的门槛就是技术还是存在难度(这里说的技术不是那种小儿科的基于模板的元数据采集分词索引)。
但是网页搜索引擎可以最大程度的行业化,在这点百度显得卓有远见。建立百度知道不仅仅可以丰富内容、语料库、拴住用户、甚至盈利。更大的用处可以用百度知道的各个行业的专业搜索用户群来改善百度搜索对各个行业的效果的用户分析,确解各行业用户之意百度可以很低成本的通达,调动专业人员来优化效果百度可以做到。


9. 相关搜索
前几天一个朋友对我说"相关搜索"的主要作用是两个,1.提示给网友其它网友搜索的词汇(帮助不太会选择关键词的用户选择关键词、提供用户之间的一种交互)2.推荐提供效果更好的更相关的相关搜索词汇
第一个功能基本上满足了。第二个搜索引擎基本上还很不到位。如何完成第二个功能,很难。但是要做到一定程度,很容易。


10. 采集更多的数据
互联网上的数据只是整个世界的数据的很少的一部分,搜索引擎已经不满足于各个蚂蚁搬砖头的网站的速度了。通过某种低成本高效的数据采集方式采集线下的数据、人脑中的数据是搜索引擎公司追逐的。
spider制造+用户制造+自己制造+合作制造


11. 跟踪互联网变化,细节上的优化,博弈
搜索引擎是和互联网各网站、网民密切相关的一个应用,其数据的全面性和数据源、采集系统密切相关。
针对网页的结构变化、内容变化,网民的需求变化,需要不断的改善。对各种各类细节的改善都是搜索引擎的难点,也是必须走的道路,搜索引擎的发展就是关注细节,一个一个问题解决。
还有,和搜索引擎优化全民化的的博弈。

网上信息抽取技术纵览

网上信息抽取技术纵览

Line Eikvil 原著 1999.7 陈鸿标 (2003.3)

 

第一章         导论

 

信息抽取(Information Extraction: IE是把文本里包含的信息进行结构化处理,变成表格一样的组织形式。输入信息抽取系统的是原始文本,输出的是固定格式的信息点。信息点从各种各样的文档中被抽取出来,然后以统一的形式集成在一起。这就是信息抽取的主要任务。

信息以统一的形式集成在一起的好处是方便检查和比较。例如比较不同的招聘和商品信息。还有一个好处是能对数据作自动化处理。例如用数据挖掘方法发现和解释数据模型。

信息抽取技术并不试图全面理解整篇文档,只是对文档中包含相关信息的部分进行分析。至于哪些信息是相关的,那将由系统设计时定下的领域范围而定。

信息抽取技术对于从大量的文档中抽取需要的特定事实来说是非常有用的。互联网上就存在着这么一个文档库。在网上,同一主题的信息通常分散存放在不同网站上,表现的形式也各不相同。若能将这些信息收集在一起,用结构化形式储存,那将是有益的。

由于网上的信息载体主要是文本,所以,信息抽取技术对于那些把因特网当成是知识来源的人来说是至关重要的。信息抽取系统可以看作是把信息从不同文档中转换成数据库记录的系统。因此,成功的信息抽取系统将把互联网变成巨大的数据库!

信息抽取技术是近十年来发展起来的新领域,遇到许多新的挑战。

本文首先在第二章简要介绍信息抽取技术,第三章介绍网页分装器(wrapper)的开发,第四章介绍已经开发出来的网站信息抽取系统,第五章介绍信息抽取技术的应用范围以及首批已经进入商业运作的商用系统。

 

 

第二章          信息抽取技术概述

信息抽取原来的目标是从自然语言文档中找到特定的信息,是自然语言处理领域特别有用的一个子领域。所开发的信息抽取系统既能处理含有表格信息的结构化文本,又能处理自由式文本(如新闻报道)。IE系统中的关键组成部分是一系列的抽取规则或模式,其作用是确定需要抽取的信息[52]。网上文本信息的大量增加导致这方面的研究得到高度重视。

本章首先介绍信息抽取领域的发展。第2.1.节比较了信息抽取和信息检索的区别;第2.2.节介绍IE的历史。接下来两节解释评价IE系统的指标和常用的两派技术方法。信息抽取技术所处理的文本类型将在第2.5.节中说明。第2.6.节描述信息抽取技术可利用的网页特征。

2.1.          IRIE

IR的目的是根用户的查询请求从文档库中找出相关的文档。用户必须从找到的文档中翻阅自己所要的信息。

就其目的而言,IRIE的不同可表达如下:IR从文档库中检索相关的文档,而IE是从文档中取出相关信息点。这两种技术因此是互补的。若结合起来可以为文本处理提供强大的工具[24]

IRIE不单在目的上不同,而且使用的技术路线也不同。部分原因是因为其目的差异,另外还因为它们的发展历史不同。多数IE的研究是从以规则为基础的计算语言学和自然语言处理技术发源的。而IR则更多地受到信息理论、概率理论和统计学的影响[24]

2.2.          IE的历史

自动信息检索已是一个成熟的学科,其历史与文档数据库的历史一样长。但自动信息抽取技术则是近十年来发展起来的。有两个因素对其发展有重要的影响:一是在线和离线文本数量的几何级增加,另一是"消息理解研讨会"(MUC)近十几年来对该领域的关注和推动。

IE的前身是文本理解。人工智能研究者一直致力于建造能把握整篇文档的精确内容的系统。这些系统通常只在很窄的知识领域范围内运行良好,向其他新领域移植的性能却很差[53]

八十年代以来,美国政府一直支持MUC对信息抽取技术进行评测。各届MUC吸引了许多来自不同学术机构和业界实验室的研究者参加信息抽取系统竞赛。每个参加单位根据预定的知识领域,开发一个信息抽取系统,然后用该系统处理相同的文档库。最后用一个官方的评分系统对结果进行打分。

研讨会的目的是探求IE系统的量化评价体系。在此之前,评价这些系统的方法没有章法可循,测试也通常在训练集上进行。MUC首次进行了大规模的自然语言处理系统的评测。如何评价信息抽取系统由此变成重要的问题,评分标准也随之制定出来。各届研讨会的测试主题各式各样,包括拉丁美洲恐怖主义活动、合资企业、微电子技术和公司管理层的人事更迭。

过去五、六年,IE研究成果丰硕。英语和日语姓名识别的成功率达到了人类专家的水平。通过MUC用现有的技术水平,我们已有能力建造全自动的 IE系统。在有些任务方面的性能达到人类专家的水平[53]。不过自1993年以来,每届最高组别的有些任务,其成绩一直没有提高(但要记住MUC的任务一届比一届复杂)。一个显著的进步是,越来越多的机构可以完成最高组别的任务。这要归公于技术的普及和整合。目前,建造能达到如此高水平的系统需要大量的时间和专业人员。另外,目前大部分的研究都是围绕书面文本,而且只有英语和其他几种主要的语言。

2.3.          评价指标在

信息抽取技术的评测起先采用经典的信息检索(IR)评价指标,即回召率(Recall)和查准率(Precision),但稍稍改变了其定义。经修订后的评价指标可以反映IE可能产生的过度概括现象(Over-generation),即数据在输入中不存在,但却可能被系统错误地产生出来(Produced[24]

IE而言,回召率可粗略地被看成是测量被正确抽取的信息的比例(fraction),而抽准率用来测量抽出的信息中有多少是正确的。计算公式如下:

P=抽出的正确信息点数/所有抽出的信息点数

R=抽出的正确信息点数/所有正确的信息点数

两者取值在01之间,通常存在反比的关系,即P增大会导致R减小,反之亦然。

评价一个系统时,应同时考虑PR,但同时要比较两个数值,毕竟不能做到一目了然。许多人提出合并两个值的办法。其中包括F值评价方法:

其中 是一个预设值,决定对P侧重还是对R侧重。通常设定为1

这样用F一个数值就可很看出系统的好坏。

2.4.          IE系统设计的两大方法

IE系统设计主要有两大方法:一是知识工程方法(Knowledge Engineering Approach),二是自动训练方法(Automatic Training Approach)

知识工程方法主要靠手工编制规则使系统能处理特定知识领域的信息抽取问题。这种方法要求编制规则的知识工程师对该知识领域有深入的了解。这样的人才有时找不到,且开发的过程可能非常耗时耗力。

自动训练方法不一定需要如此专业的知识工程师。系统主要通过学习已经标记好的语料库获取规则。任何对该知识领域比较熟悉的人都可以根据事先约定的规范标记语料库。经训练后的系统能处理没有见过的新文本。这种方法要比知识工程方法快,但需要足够数量的训练数据,才能保证其处理质量。

2.5.          自由式、结构化和半结构化文本

自由式文本:信息抽取最初的目的是开发实用系统,从自由文本中析取有限的主要信息。例如,从报道恐怖袭击活动的新闻中析取袭击者、所属组织、地点、受害者等信息;又如,从医药研究报告的摘要中提取新产品、制造商、专利等主要信息点。

处理自由文本的IE系统通常使用自然语言处理技巧,其抽取规则主要建立在词或词类间句法关系的基础上。需要经过的处理步骤包括:句法分析、语义标注、专有对象的识别(如人物、公司)和抽取规则。规则可由人工编制,也可从人工标注的语料库中自动学习获得。

自由文本信息点抽取技术的现有水平不可与人的能力同日而语,但还是有用的,不管其抽取规则是人工编制的还是通过机器学习的[52]。虽然自然语言理解是漫长的期待,但是,信息抽取技术确实可行,因为这项技术对其需要搜索的模式类型有很强的限定,而这种限定是有根有据的。

结构化文本:此种文本是一种数据库里的文本信息,或者是根据事先规定的严格格式生成的文本。从这样的文本中抽取信息是非常容易的,准确度也高,通过描述其格式即可达到目的。所用的技巧因而相对简单。

半结构化文本:这是一种界于自由文本和结构化文本之间的数据,通常缺少语法,象电报报文,也没有严格的格式。用自然语言处理技巧对这样的文本并不一定有效,因为这种文本通常连完整的句子都没有。因此,对于半结构化文本不能使用传统的IE技巧,同时,用来处理结构化文本的简单的规则处理方法也不能奏效。

在半结构化文本中确实存在一些结构化的信息,但是,抽取模式通常依赖字符和象html标记那样的分隔标志。句法和语义信息的作用则非常有限。

2.6.          网页

因特网提供了一个巨大的信息源。这种信息源往往是半结构化的,虽然中间夹杂着结构化和自由文本。网上的信息还是动态的,包含超链接,以不同的形式出现,而且跨网站和平台,全网共享。因此,因特网是一个特殊的挑战,一直推动着从结构化和半结构化文本中抽取信息的研究向前迈进。

有些研究者把所有网页都归入半结构化文本,但Hsu[31]对网页类型做了颇有用的定义:若能通过识别分隔符或信息点顺序等固定的格式信息即可把"属性-值"正确抽取出来,那么,该网页是结构化的。半结构化的网页则可能包含缺失的属性,或一个属性有多个值,或一个属性有多个变体等例外的情况。若需要用语言学知识才能正确抽取属性,则该网页是非结构化的。

网页的结构化程度总是取决于用户想要抽取的属性是什么。通常,机器产生的网页是非常结构化的,手工编写的则结构化程度差些,当然有很多例外。

传统的NLP技巧对抽取半结构化文本的信息并不是很有用,因其缺少规范的语法结构,而且,NLP方法的处理速度通常比较慢,这对于网上海量信息来说是一个大问题。

网上大部分内容都以属性列表的形式呈现,例如很多可搜索的网页索引。这种外观上的规律性可被利用来抽取信息,避免使用复杂的语言学知识。

网页上的组织结构和超链接特性是需要认真考虑的重要因素。例如,可能需要打开链接的内容才能找到你想要的信息。网页的组织结构不同,抽取规则也不同。

网上数据库查询的结果通常是一系列的包含超级链接的网页。文献[14]把这类网页分成三类:一层一页,即一个页面即包含了所有的查询结果;一层多页,即需要调出多个链接才能获得所有的结果;两层页面,即第一层是列表式条目链接,点击链接后才能看到详细资料。

2.7.          小结

IE领域是近十年来新发展起来的研究领域,一是由于"消息理解研讨会"(MUC)的推动,二是由于网上内容的大量增加。

IE对自由文本和结构化文本都能处理。NLP技巧通常用于自由文本,对结构化和半结构化文本并不是太适合。相反,基于分隔符和字符的方法更能奏效。

因特网是包含大量半结构化文本的信息源。网页与传统的文本相比,有许多特点:量大,常更新,变化多,页面的一大半包含结构化的文字块,还可能有超链接。因此,网页为信息抽取研究带来新的挑战。

 

第三章  分装器生成

第3.1.                分装器

第3.2.                IE发展成WG

第3.3.                分装器生成

第3.4.                分装器的归纳学习

第3.5.                小结

 

各网站的信息内容互相独立,要收集起来有困难。信息抽取技术就是冲着解决此困难而来的。

因特网上还存在一个被称为"暗藏网"(the hidden web),即那些网上数据库系统。文献[37]估计因特网上80%的内容存在于这种看不见的因特网中。搜索引擎的"网络爬虫"抓不到这些网页。这就意味着需要一种独立的工具从这些网页中收集数据。

从网站中抽取信息的工作通常由一种叫做"分装器"(Wrapper,也译"包装器")的程序完成。以下3.1.3.2.节将介绍分装器的概念及分其生成(Wrapper Generation, WG)研究的历史。第3.3.节总结了构造分装器的不同方法。手工制造分装器的工作繁重,因此,自动生成的研究变得非常重要。机器学习的方法非常诱人,第3.4.节介绍了归纳式学习的相关技巧。

3.1.                分装器

分装器是一个程序,用于从特定的信息源中抽取相关内容,并以特定形式加以表示。在数据库环境下,分装器是软件的组成部分,负责把数据和查询请求从一种模式转换成另外一种模式。在因特网环境下,分装器的目的是把网页中储存的信息用结构化的形式储存起来,以方便进一步的处理。

因特网分装器可接受针对特定信息源的查询请求,并从该信息源中找出相关的网页,然后把需要的信息提取出来返回给用户。它由一系列的抽取规则以及应用这些规则的计算机程序代码组成。通常,一个分装器只能处理一种特定的信息源。从几个不同信息源中抽取信息,需要一系列的分装器程序库。分装器的运行速度应该很快,因为它们要在线处理用户的提问。它还要能应付网络经常变化、运行欠稳定的特点。比如,网络连接失败、文档格式混乱、格式变化等。

建造针对网页的分装器主要有两个好处:一是提高了从某一特定信息源获取相关信息的能力,二是能把不同信息源的信息整合到数据库中,用通用查询语言即可查找信息。

3.2.                IE发展成WG

人们需要能从不同网页资源抽取并整合数据的工具。这种需求造就了分装器生成研究领域的发展。分装器生成(WG)领域独立于传统的IE领域。典型的WG应用系统能从网上数据库返回的查询结果网页中抽取数据。这些网页构成一个被WG业内人称之为"半结构化"的信息源。为了能把这些网页的数据整合在一起,必须把相关的信息从这些网页中抽取出来。因此,分装器实质上是针对某一特定信息源的IE应用系统。

传统的IE系统采用基于句法和语义条件相结合的抽取模式。如前所述,对于半结构化信息源,基于语言知识的模式并不是很管用。典型的WG系统生成的是基于分隔符的抽取模式。由于这类网页均是在一个统一的模板上即时生成的,因此,只要学习了几个样本网页后,系统即能识别分隔符特征串,构成不同的模板区域。

从网页中抽取信息并不容易,要考虑许多问题,例如信息量膨胀的问题、系统灵活性的问题等。

3.3.                分装器生成

可用人工或半自动的办法生成分装器。手工生成分装器通常需要编写专用的代码,要花很多时间理解文档的结构并将其转换成程序代码。虽然处理半结构化的网页要容易一些,但并仍然还是比较烦琐而且容易出错。

有一些工具可帮助手工生成分装器。使用的方法之一是利用描述性语法对网页结构进行描述,并且提供工具生成代码。不过,编写语法本身就是一项很艰巨和耗时的工作,而且需要高水平的专家。

手工构造的IE系统不能适应处理对象所属领域的变化。每个领域都要有相应的分装器,维护成本很高。对于网上信息源来说,这些缺点尤为明显,因为网页数量庞大,内容和结构繁杂,而且新的信息源不断增加,旧的信息还会改变,因此,帮助生成自动抽取网页信息的分装器的技术变得非常重要。

半自动化生成分装器的技术得益于上述分装器生成的支持工具。一种方法是使用向导让用户告诉系统那些信息是需要抽取的。通过图形界面,用户即可以通过演示编写程序,标示出需要抽取的区域。这意味着在分装器编码过程中不需要专业知识,而且比手工编码少产生错误。但是,用这种方法也需要对新的站点进行重新的学习,因为这种系统不能自己学习新的网站结构,也不能处理旧网站的结构变化。

全自动分装器的生成利用机器学习的技巧,开发学习算法,设计出从非常简单到相对复杂的分装器。即使是全自动的方法也需要人工专家的少量参与。系统必须通过学习阶段,从例子中归纳出规则。通常,这个过程是由人工指导的。

分装器归纳法是一种自动构造分装器的技术。主要思想是用归纳式学习方法生成抽取规则。用户在一系列的网页中标记出需要抽取的数据,系统在这些例子的基础上归纳出规则。这些规则的精确度如何取决于例子的质量如何。如果能代表那些需要处理的网页,那么,这些例子就是高质量的。

3.4.                分装器的归纳学习

用于IE的机器学习方法有很多,如符号化学习法,ILP(归纳逻辑设计法),分装器归纳法,统计法和语法归纳法。在分装器归纳法中,分装器的生成被描述成一种归纳学习问题。

在最高层次,归纳学习法是从一些实例中完成未知目标概念的计算任务,是对现象的一种概括。主要思路是,如果归纳出来的规则能解释观察到的实例,或者在新事例出现时能做出准确的预测,那么,这种归纳是成功的。在分类、知识获取、知识发现等任务中被证明是有用的。

归纳学习法是通过推论来完成的。推论是一种从部分到整体、从个别到一般、从个体到普遍的推理过程。老师提供几个实例给学生,学生则从中归纳出普遍适用的规则。人类的学习是基于实验性的观察过程中的,对于我们来说,提供好的观察事例要比提供明确的完整的规则要容易。总的说来,归纳式学习法是一种建立在假设的基础上的研究方法。

有指导的归纳式学习法可以分为两类:零阶(zero-order)和一阶(first-order)学习法。两者的区别在于其训练数据和所形成的理论的表达方式的不同。

零阶学习法所采用的事例是事先分好类的。每个事例都由对应于固定属性集合的特定值描述。这类系统发展的理论以决策树(Decision Tree)或生成规则(Production Rules)的形式出现,把事例的类和它的属性值联系起来。不幸的是,决策树的学习系统缺少表达能力,因为它们建立在命题逻辑的基础上,不能学习到对象之间的关系(如家族成员的关系)之类的概念。从数据库角度看,他们只能处理"属性-值"这种关系。

关系型一阶学习法可在带有结构信息的例子中进行归纳,例如一阶逻辑谓词和函数,无界限结构体(Unbounded Structures,如列表,树)等。尤其是ILP方法,专门研究从例子中归纳一阶逻辑形式的规则,逻辑编程的学习以及其他关系型知识。

ILP的研究介于机器学习和逻辑编程两种传统研究领域之间。许多其他的机器学习算法均限定于处理有限的基于特征表达的例子和概念,而不能处理复杂的关系型和递归型知识。但ILP借助一阶逻辑的表达能力,可以学习关系和递归概念。ILP还可以学习更丰富的表达式和比决策树更复杂的概念,因此,已应用于解决从包含复杂结构和关系的文档中抽取信息的学习中。

ILP算法采用两种不同的归纳方法:一是自下而上(概括),另一是自上而下(具体化)。自下而上的方法是数据驱动的。先选择几个例子,在此基础上提出一个假设,使之能处理这些例子。然后把这个假设推而广之,使之能处理其余例子。自上而下的方法则先从最普遍的假设开始,通过引入反例,把假设规则不断具体化。总的说来,自上而下算法可以归纳出一大类的逻辑程序,但需要相对多的样例。而自下而上算法有为数不多的例子就行了,但只能归纳出一小类的程序。

目前已经有了几个实验ILP系统,包括有名的FOIL[47]GOLEM[39]FOILQuinlan于1989年开发,采用自上而下的算法。在一个既有正又有反的事实的训练集中,先找出一个只覆盖正例而不涉及反例的逻辑子句(clause),然后把这个子句覆盖的事实从训练集中删除。如此直到训练集中没有正例为止。GOLEMMuggleton and Feng 1990)采用贪婪覆盖算法(Greedy Covering Algorithm)。子句的生成是自下而上的,建立在更多具体子句的"最少概括"(least-general)的概括生成上。概括一直进行直到所有的正例都被覆盖而无一个反例被涉及。

3.5.                小结

可以预计,网上结构化信息将不断增加。通过查询网上数据库所获得的网页也将不断增加。这些网页是无法让搜索引擎获取的。因此,越来越需要可以把相关信息从这些网页中抽取出来的工具。

分装器是专门从特定信息源中抽取需要的信息并返回结果的程序。对于从不同信息源中整合信息资料是非常有用的。由于这种需求不断增加,分装器生成的研究领域从传统的IE领域中脱颖而出。相比之下,生成分装器所采用的技术比较少依赖句子的全面语法分析和NLP技术。

分装器可由程序员直接编写,或手工指定网站结构再由程序自动生成规则和代码。无论是哪种情况,这个过程都是费时费力的,而且网页的结构经常变化,新网页层出不穷。这样,必须建造新的分装器。为此,网上信息抽取的研究转向了半自动和自动生成分装器的工作上。

分装器归纳法是用机器学习方法自动生成分装器的方法。在归纳法中,分装器的生成被看成是归纳学习的问题,其任务是从一组例子中计算出一般规则,以解释观察到的事实。教师提供例子,学生在例子的基础上作出归纳,推导出规则。

归纳逻辑编程方法处于传统的机器学习领域和逻辑编程之间,使用一阶逻辑规则。得益于一阶逻辑丰富的表达能力,ILP方法可以学习关系型和嵌套概念。这是大多数基于"属性-值"表达方式的机器学习算法所无法达到的。ILP方法为此被应用到学习如何从复杂结构和关系的文档中抽取信息。

 

 

第四章         分装器生成系统简介

4.1.        处理结构化和半结构化网页的系统...

4.1.1.     ShopBot

4.1.2.     WIEN..

4.1.3.     SoftMealy.

4.1.4.     STALKER.

4.2.        处理半结构化和非结构化网页的系统...

4.2.1.     RAPIER.

4.2.2.     SRV.

4.2.3.     WHISK.

4.3.        小结...

早期从网站上抽取信息的方法基本上是基于手工操作的。程序员认真研究网站的结构后手工编写代码,开发一个分装器程序,把网页的逻辑特征抽取出来并把他们存入到数据库。TSIMMIS[13252829]系统和"斯坦福-IBM多信息源管理系统(1995)"是比较早的帮助建造分装器程序的框架系统。TSIMMIS的目标是以一体化的方式获取不同信息源的信息并且保证所获取信息一致性。其重点是开发支持这种包装过程的语言和工具。

对于数据量大,结构动态变化的网站而言,需要一种更为有效的分装器建造方法。一般说来,数据库领域的人把注意力放在错综复杂的信息如何进行整合,分装器则用手工建造。另一方面,AI领域的人则把重点放在机器学习的方法如何能用在网站结构的自动学习上。本章将重点介绍分装器的自动或半自动的生成系统。

分装器及其自动生成的复杂度和难易度将取决于网站结构的层次。第4 .1.节介绍的系统主要是针对结构化程度相对好的网站。这类系统多数是源自分装器生成领域的研究者。第4.2.节介绍了能处理结构缺少规范化的网页。这类系统较多地受到传统的IE领域的影响。

4.1.                处理结构化和半结构化网页的系统

本节介绍ShopBot, WIEN, SoftMealy STALKER系统。这类系统可以说是属于分装器生成系统,专门用来从网站数据库系统生成的网页。采用分隔符为主的抽取规则,无需用到句法和语义知识,局限于处理比较结构化的数据。

4.1.1.         ShopBot

开发者:R. B. Doorenbos, O. Etzioni, D. S. Weld (1996/1997)[17,18]

ShopBot是比价代理系统,专门从网上卖家的网站上抽取信息,因此,比其他系统的局限性要大。其算法主要针对以表单形式提供查询的页面,而且返回的搜索结果是以表格形式显示的产品信息页面。从结果页面中抽取信息的技巧结合了启发式搜索、模式匹配和归纳式学习。

ShopBot的运行分两个阶段:离线学习阶段和在线比价阶段。在学习阶段,系统分析每个购物网站,获得其符号化描述,然后在比价阶段,利用获得的符号化描述,从网站上抽取信息,找到用户指定的产品的最低价格。

在学习阶段,系统利用简单的启发式方法找到正确的检索表单,学习如何向该表单发送查询请求。学习程序还必须判定查询结果页面的格式。一般包括头部、主体和尾部等三部分。头尾两部分在所有的结果页面中都是一致的,而主体则包含了想要的产品信息。结果页面的格式是通过三个步骤判定的:

1步:获取"找不到产品"的失败页面。用不存在的词(如"xldccxx-no-product")作为关键字查询数据库,然后分析返回的页面。

2步:找到头尾部分。用可能存在的产品名称去查询数据库,通过分析返回的页面找到头尾部分。

3步:判定包含产品信息的主体格式。首先用HTML标记和字串对可能的产品信息摘要进行定义和表示。网页主体被切分成"逻辑行",代表"垂直空格分隔"(vertical-space-delimited)的文本。学习程序用逻辑行比较不同的摘要形式,找到最佳匹配。这样可以找到产品的描述格式,但是不能归纳出信息栏的名称。最关键的价格信息是用手工编码的方法获取的。

4.1.2.         WIEN

开发者:N. Kushmerick (1997) [33,34]

"分装器归纳生成环境"(WIEN-Wrapper Induction Environment)是辅助分装器生成的工具,为网页的自动分析而设计,受到ShopBot的影响。不过,Kushmerick 是第一个提出分装器归纳生成这一术语的。其方法不只局限于某一领域,适用于所有包含表格信息的结构化文本,也不只是用于HTML文本。

这种方法可以处理被他们称之为具有HLRT结构的网页:头分隔符、左右分隔符(在每个待抽取的事实的左右)和尾分隔符。系统寻找标记信息点开始和结尾的统一的分隔符,以及那些把表格信息与其他周围信息分开的分隔符。符合这一规则的页面几乎都是搜索数据库所得的结果页面。

Kushmerick力图尽量自动化,避免用人工标记样例,因此开发了一系列自动标记样例的方法。标记算法需要输入特定领域(domain-specific)的启发学习规则,目标是找到待抽取属性的值。系统虽然需要输入学习规则,但却不管这些规则是如何获得的,可以手工编制。即使是这样,比起标记整个网站来,其工作量要小。

系统采用归纳学习法,从查询结果样例中生成分装器。归纳算法是:把标记好的网页作为输入,然后搜索由"HLRT分装器模型"定义的分装器空间(space of wrappers),反复尝试所有可能的分隔符,直到找到与标记网页相一致的HLRT分装器。系统还采用基于机器学习理论的模型来预测需要学习多少个例子,以保证所生成的分装器的出错几率控制在一特定的范围内。

由于WIEN只考虑与待抽取数据紧相邻的分隔符,因此不能包装那些数据不全或信息项次序不固定的网页。系统采用的是多栏(Multi-slot)规则,这就意味着能把相关的信息联在一起,而单栏规则只能抽取孤立数据(例如,若一篇文档包含多个姓名和地址,使用单栏规则不能辨认出哪个地址是属于某人的)。

4.1.3.        SoftMealy

开发者:C-H. Hsu (1998)[30,31]

Kushmerick之后,有好几个别的系统研发出来,力图改进WIEN的分装器归纳算法。SoftMealy是一个通过学习分装器学习从半结构化网页中抽取信息的系统。其分装器被称为"非确定有限自动机"(non-deterministic finite automata)。这种表达模式和学习算法据说可以处理缺失值、一栏多值和变量改变(permutations)的情况。

系统从训练样例中归纳上下文规则。训练样例提供一个有顺序的事实列表以及事实间的分隔符。归纳生成分装器时,把一系列带标记元组(labeled tuples)作为输入。这些元组提供了分隔符的位置和事实次序变化的信息。这些信息被归纳为上下文规则作为结果输出。

归纳生成的分装器是一个"非确定有限自动机"。其状态代表待抽取的事实,状态的转换代表定义分隔符的上下文规则。状态的转换由上下文规则的匹配结果来确定。分装器通过识别事实周围的分隔符来抽取事实。

SoftMealy的规则允许使用通配符,而且能处理信息缺失和次序变化。然而,为了能处理不同次序的事实,系统需要学习其各种可能的次序。总的说来,SoftMealy的抽取模式比WIEN规定的要更有表达能力。

4.1.4.        STALKER

开发者:I. Muslea, S. Minton, C. Knoblock. (1998) [42,43,44]

STALKER采用指导学习的算法归纳抽取规则。训练例子由用户提供。用户需选择若干样例页面并把有用的数据(即所谓"EC树"的叶子)标记出来。页面被标记好后,系统可生成一符号序列(the sequence of tokens),用来表示页面的内容,还生成代表信息点开始的符号索引。符号系列(字、HTML标记)和通配符被作为定位标志,用于找到页面上的数据。分装器归纳算法产生抽取规则并表示为简单的标志语法(landmark-grammars)。此法可处理文本,但不能处理链接信息。

网页文档用所谓的"内嵌目录"( Embedded Catalog)表示。那是一个树形结构,其内部节点或是同构的(homogeneous)信息点列表,或是异构信息点元组(tuples)。根节点是整篇文档,任一节点的内容代表其父节点内容的一个接续(subsequence)。末节点即是用户需要抽取的数据。 

STALKER采用线性覆盖算法(sequential covering algorithm)。首先生成线性标志自动机(landmark automata)。这些自动机能产生尽可能多的训练正例(positive training examples)。该自动机实际上是一个"非确定有限自动机"。其状态的变化只有在字符串输入为了目前状态与下一状态间的转换而被接受时才发生。然后系统试图生成新的自动机以覆盖剩余的例子,一直到所有的训练例子都被覆盖为止。这时,STALKER返回一个被称之为SLG(简单标记语法)的解决方法。其每个分支都对应一个学习获得的标记自动机。

STALKER可以包装有任意层结构的信息源。每个节点的抽取与其子节点独立,因此,文档中信息点的次序是没有关系的。对于信息点缺失或次序多变的文档一样能处理。这就比只能处理固定次序的WIEN等系统更灵活。与同样能处理信息点缺失或次序多变文档的SoftMealy不同,STALKER无需把各种可能的次序变化都学习到。

STALKER采用的规则与WIEN的不同,是单栏的。不过由于STALKER利用EC树把从多栏模板中取出的单个信息点集在一起,因此没有什么缺陷。

4.2.                处理半结构化和非结构化网页的系统

本节介绍RAPIERSRVWHISK系统。这些系统比上节介绍的要复杂一些,能处理的文本类型要多一些。虽然如此,它们并不依赖语义和句法信息,只是在可能的情况下利用这些知识,而且能发挥混合抽取模式的作用。

这些系统更接近传统的信息抽取方法,可以说处于IEWG中间,因为它们的重点是开发用机器学习方法来解决IE问题。所用的方法以归纳逻辑编程(inductive logic programming)或关系学习(relational learning)为基础,而且与归纳算法有关,比如FOIL算法(SRV WHISK采用)和GOLEM算法(RAPIER采用)。

4.2.1.              RAPIER

开发者:E. Califf (1997) [11,12]

RAPIERRobust Automated Production of Information Extraction Rules,健壮的信息抽取规则自动生成系统)以半结构化文本为处理对象,学习抽取规则,为整个IE过程服务。系统需要输入指明待抽取信息的"文档-充实模板"(filled template)组对作为训练内容,从中获得模式匹配规则,抽取"填充子"(filler)填充模板中的空槽。

学习算法结合了多个归纳逻辑编程系统所采用的技巧,能学习无界限模式。这些模式包含了对词的限制条件和填充子周围的词性。学习算法由一个从具体到一般(即自下而上)的搜索,从训练中与目标槽匹配的最具体的规则开始。随机从规则库中抽取一对对规则,然后横向搜索(beam search),以图找到这两条规则的最佳概括,采用最少概括的概括方法(a least general generalization),增加限制条件,不断重复后直到不再有进展为止。

RAPIER的抽取规则是建立在分隔符和内容描述的基础上的,即使用了能利用句法和语义信息的模式所表达的规则。系统使用了一个词性标注程序获取句法信息,使用了一个语义类别词典获取语义信息。标注程序以句子为输入单位,把词标注为名词、动词、形容词等,速度和健壮性都比完全句法分析器快和优,但给出的信息有限。

信息抽取规则用模板名和格栏(slot)名索引,由三部分组成:前填充子(pre-filler):一个应匹配目标文本之前的文本的模式(pattern);填充子:一个应匹配目标文本的模式;后填充子:一个应匹配紧接目标文本之后的文本的模式。

一个模式是一串模式信息点(pattern items),要求一个一个词匹配,或者是模式列表(pattern lists),可匹配N个词。文本必须满足模式规定的条件才算匹配成功。可能的条件包括文本必须是(I)一组词,其中一个必须与文档文本匹配;(II)一组句法标记,其中一个标记必须与文档文本的标记匹配;或者(iii)一组语义类别,文档文本必须属于其中一类。

这种以目标词组为中心设定抽取区域的方法意味着系统只能进行单格抽取。但是,若把文本分成超过三个区域,系统或许能进行多格抽取。

4.2.2.              SRV

开发者:D. Freitag (1998) [21,22,23]

SRV(Sequence Rules with Validation,带确认功能的次序规则)是一种自上而下、关系型的信息抽取算法。其输入是一系列的网页,上面标记了待抽取区域的实例(instance),以及一系列基于字串(token)的特征。输出是一系列的抽取规则。

SRV把信息抽取问题看成是一种分类问题。文本中所有可能的短语(取最长者)都是实例。文档中的候选实例被提交到分类器。系统会给每个短语赋一个测量值,用于反映该短语作为目标格填充子的信度。最初版本的SRV采用的分类器是一个关系型规则的学习器,使用的归纳方法类似于FOIL的自上而下的办法。在文献[23] 中,他们采用了另外两个分类器,机械背诵学习器(rote learner)和简单贝叶斯分类器(naïve Bayes classifier),并与原来的分类器作了比较。

SRV利用的特征分两种:简单特征和关系特征。字词的长度、类型、拼写、词性等属于简单特征。关系特征反映字词的相邻度。正是这一特征使SRV具有关系型的特点。

SRV的学习素材包括训练集文档中与最短实例区(field instance)一样长(以词的个数计算)的字串,但不能长过最长的实例。抽取过程即是检验长度适合的字串是否与规则匹配的过程。

SRVFOIL一样,从学习所有正反例子开始。所谓反例是没有被标记为实例区的字串。归纳过程也是用正排除法,即当一条规则覆盖的例子全部是正例,或该规则已无法继续具体化时,所有与之匹配的正例将被从训练集中删除。然后重复以上过程。

SRV的规则具有较强的表达能力,且无需先进行句法分析。SRVSTALKERRAPIER有类似之处,能把与其他相关信息点独立的特定信息点抽取出来。关系型学习器也与RAPIER的一样用于抽取单格信息点。这与WIEN等抽取多格信息的系统不一样。

4.2.3.              WHISK

开发者:S. Soderland (1998) [52]

WHISK系统能处理的文本对象很全面,从结构化程度很强的文本到网页等半结构化文本,还能处理新闻等纯文本。处理结构化或半结构化文本时,WHISK无须事先经过句法分析,但处理自由文本时,最好能先对文本作句法和语义标注。

系统采用指导学习算法,而且需要输入一系列手工标注的训练实例。标注和学习过程是交织在一起的。每次循环,系统将提交一批实例让用户标注,系统则从标注的实例中归纳出规则。

开始时,输入的文本是未标注的,训练集也是一个空集。系统会从文本中挑选一批实例(即小于整个文档的文字单位),让用户把需抽取的部分加上标记。怎样的字串会被选为实例呢?这取决于文档的类型。对于结构化和半结构化文档来说,系统根据HTML标记或其他字符串表达式把文本切成多个实例。对自由文本,实例的切分将由一个句子分析器完成。在这种情况下,一个实例可能是一个句子或者句子的一部分。

训练实例上的标记将指导抽取规则的生成,并且检验规则的效果。如果规则被成功应用到一个实例上,那么该实例则被认为被规则"覆盖"了。如果抽取出来的词组与实例上的标记相吻合,则认为该词组的抽取是正确的。

WHISK属于机器学习算法家族中的覆盖学习法,与自上而下的学习分类归纳法相关。首先,找到一个最宽泛(general)的能覆盖规则种子的规则,然后一次加一个条件,直到错误率为零,或者满足一个事先设定的标准为止。用来衡量新条件增加的标准是规则的Laplacian期望错误值。计算公式如下: N是训练集中抽取出来的字串数,e是这些字串中应用规则所产生的错误数。学习过程一直进行,直到能覆盖所有该被覆盖的抽取字串都被覆盖为止。最后把那些过适(overfitting)规则删除掉。

WHISKSRVRAPIER等一样可以处理结构化和非结构化文本,但没有"单格"抽取法的缺陷。象WIEN一样,WHISK通过多格"格框架"(Case Frame),把有关的信息联系在一起。WHISKSRVRAPIER也不同,操作的对象不是整个文档,而是象句子或类似长度的文本。

WHISKSoftMealy一样可以处理信息点顺序变化的情况,但需要输入各种例子,以便学习所有可能的排序。由于其特征集的表达能力不强,因此不能表达否定特征(negated features),比SRV的性能要差一些。

4.3.                小结

本章比较了几个分装器的自动学习系统。 4. 1 总结了这些系统的特点。

4. 1. 个系统的功能特征比较

系统

结构化

半结构化

自由式

多槽

缺失信息

次序变化

ShopBot

X

 

 

 

 

 

WIEN

X

 

 

X

 

 

SoftMealy

X

X

 

 

X

X*

STALKER

X

X

 

*

X

X

RAPIER

X

X

 

 

X

X

SRV

X

X

 

 

X

X

WHISK

X

X

X

X

X

X*

 

 

第五章         商用系统简介

5.1.        应用范围...

5.2.        商用系统...

5.2.1.     Junglee.

5.2.2.     Jango.

5.2.3.     MySimon.

5.3.        小结...

因特网上的海量信息是世界各地的用户都能获得的,因此,能帮助完成信息自动收集和分析的代理程序是非常有用的。具有如此技术的应用程序有很多。

本章第1节介绍了信息抽取应用系统已被试用的几个领域。第2节介绍了首批商用系统。

5.1.          应用范围

网上有很多有用的信息,例如电话黄页、产品目录、股票行情、天气预报等。这些信息可能不是由一个网上数据库提供,而是分散在多个数据库中。这些数据库可供用户输入关键字等查询条件进行搜索,然后自动生成网页,把结果显示出来。

一般说来,把来源分散的数据集中在一起是非常有用的。但是,以浏览器为界面的浏览方式不直接支持把不同网站的数据集成起来,因此,信息抽取工具便有了用武之地。

前一章节介绍的系统对几种不同的网页信息进行了处理。下面重温一下其中几类:

l       产品描述

ShopBot专为此设计[1718],用于比价购物。所抽取的产品信息按价格排序。

l       餐厅指引

STALKER被用来抽取不同网站上的餐厅信息,如餐厅名称、菜肴种类、价格、烹调方法、地址、电话和评价。[4243]

l       讲座通知

SRV试用在讲座信息的抽取任务上,把讲者、地点、时间等信息抽取出来。

l       招聘广告

RAPIERWHISK被用于招聘广告的信息抽取。需抽取的信息点包括职位名称、工资、地点等。

l       人事更迭公告

这项任务需要处理自由式文本,属于传统的信息抽取任务。WHISK曾被实验从一堆华尔街金融杂志的文章中分析出公司管理层的人事更迭事件[52]。目标是抽取出公司名称、职位、新任人员的姓名、卸任人的姓名。

以上只是这种技术可发挥作用的许多应用领域中的很小的一部分。其他还有很多例子,例如,租赁广告、地理信息、假日旅游信息、天气预报、参考书目信息等。

总的说来,具有信息抽取和收集功能的代理程序可以用于处理任何列表式的、分散在一堆网页上的数据。

5.2.          商用系统

在上节提到的应用中,比价购物是主要的商用领域之一。其原因之一是近来对电子商务的普遍关注以及因特网上与此相关的应用在不断增长。

另一原因是这类网上商店网站专门为用户快速找到商品而设计,具有统一的外观和风格。这就为比价系统自动处理商品信息带来了便利。

由于不同商家经常经营同一商品,因此,从不同商家网站中收集并比较同一产品的价格的服务受到网上购物用户的欢迎。通常,网上商店提供的商品信息是存在数据库系统中的。用户需要这些信息时,系统将根据用户的请求从数据库中提取数据,当即显示给用户。这部分的信息成为了"暗藏网"(hidden web),因为搜索引擎查不到这些数据。比价系统成为除手工收集以外的这类信息获取的唯一途径。

下面将介绍三种商用比价系统:JungleeJangoMySimon。它们是市面上最引人注目的系统,实现方法各有千秋。JangomySimon用的是在线模式,即当用户发出请求时马上到各网站查找信息。Junglee则先把数据收集下来,在必要的时候进行更新。

每个系统都是在用户的请求下返回产品清单,用户可对清单上的价格作出比较并决定从哪个商家中购买。下面对以上系统作一简要介绍。

5.2.1.        Junglee

1996年斯坦福大学的研究生们创建了Junglee1998Amazon以大约1亿8千万美圆的价格收购了该系统。Junglee使用的是一种被成为虚拟数据库(Virtual Database, VDB)的技术,并利用HTMLXML的混合形式表示从多个网站中获取的信息 [4648]

VDB把分散的数据收集下来,规范化并整合起来,为程序员提供一个单一数据库的界面。分装器负责与数据源对接,把数据转换成数据库。

VDB有两个主要组成部分:数据整合系统和数据发布系统。前者完成数据的抽取,后者定期完成数据库更新。

数据整合系统有三个组成部分:一组分装器、一个影射器和一个抽取器。分装器提供对不同网站的统一接口,用描述性编程语言建造,特别针对网站结构和链接网站间的特点而设计。

影射器用预定义的影射规则,把抽取出来的数据转换成统一的格式。抽取器用字典和语言学规则从非结构化的文本中归纳出其组织结构。两者都采用了特殊设计的语言来编写规则。针对每个网站都有一个单独的分装器,而抽取器则针对所有类似网站。

5.2.2.        Jango

Jango的前身是ShopBot,是NETbot的产品。发源于华盛顿大学的研究者Oren Etzioni Dan Weld的研究成果[1718]199710Excite3500万美圆收购了NetBot,把Jango整合进其购物频道。

Jango由四部分组成[8]:(I)一个自然语言前端,能将用户请求转换成产品描述的逻辑表示;(ii)一个查询路由器(query router),能判定产品类别,找出相关的一系列网站;(iii)一个集成引擎,能平行向选定的网站提交查询;(iv)一个过滤器,能用类似于ShopBot 的方法,把信息抽取出来。

在学习阶段,Jango根据网上商店首页的URL和产品领域知识,学习如何在网站购物,能学得每个商店的产品描述的格式,获取价格等产品属性。在购物阶段,这些学得的描述将被用于抽取用户指定的产品信息。信息抽取是在线平行进行。结果以价格排序显示给用户。

5.2.3.        MySimon

MySimonMichael YangYeogirl Yun在1998年4月一起创建的。一种被称为虚拟学习代理(Virtual Learning AgentVLA)的技术由Yeogirl Yun开发并用于网站的学习中。

VLA生成若干智能代理,能模仿人的采购行为,经过训练可从任何一个购物网站上抽取信息。

代理的训练过程是通过一个图形界面进行的。训练者无须是编程人员。在浏览网上商店的同时,系统会复制其获得的信息。根据训练者的操作行为和复制的信息,系统会生成能使代理运行的编码。

5.3.          小结

信息抽取技术可以发挥作用的地方有许多。不过,最成功的要数比价购物。最近两年来,比价购物系统已经投入商用。其中比较出色的是Jango, MySimonJunglee

Jango在线进行抽取,用机器学习方法学得网站结构。MySimon也以在线方式抽取信息,但使用的学习方法不同。非程序员通过实际上网购物,教会智能代理学习如何从网站上抽取相关的信息。

Junglee把数据抽取出来并储存在数据库中,然后用数据库作为比价系统的信息源。一种专用的语言被用来描述网站结构并生成抽取过程所需的代码。

 

 

第六章         总结和讨论

 

6.1.        总结...

6.2.        讨论...

6.1.               总结

信息抽取是近十年来新发展起来的领域。MUC等国际研讨会给予高度关注,并提出了评价这类系统的方法,定义了评价指标体系。

信息抽取技术的研究对象包括结构化、半结构化和自由式文档。对于自由式文档,多数采用了自然语言处理的方法,而其他两类文档的处理则多数是基于分隔符的。

网页是信息抽取技术研究的重点之一。通常用分装器从一特定网站上抽取信息。用一系列能处理不同网站的分装器就能将数据统一表示,并获得它们之间的关系。

分装器的建造通常是费事费力的,而且需要专门知识。加上网页动态变化,维护分装器的成本将很高。因此,如何自动构建分装器便成为主要的问题。通常采用的方法包括基于归纳学习的机器学习方法。

有若干研究系统被开发出来。这些系统使用机器学习算法针对网上信息源生成抽取规则。ShopBotWIEN SoftMealySTALKER生成的分装器以分隔符为基础,能处理结构化程度高的网站。RAPIERWHISKSRV能处理结构化程度稍差的信息源。所采用的抽取方法与传统的IE方法一脉相承,而学习算法多用关系学习法。

网站信息抽取和分装器生成技术可在一系列的应用领域内发挥作用。目前只有比价购物方面的商业应用比较成功,而最出色的系统包括JangoJungleeMySimon

6.2.                讨论

目前的搜索引擎并不能收集到网上数据库内的信息。根据用户的查询请求,搜索引擎能找到相关的网页,但不能把上面的信息抽取出来。"暗藏网"不断增加,因此有必要开发一些工具把相关信息从网页上抽取并收集起来。

由于网上信息整合越来越重要,虽然网站信息抽取的研究比较新,但将不断发展。机器学习方法的使用仍将成为主流方法,因为处理动态的海量信息需要自动化程度高的技术。在文献[52]中提出,结合不同类型的方法,以开发出适应性强的系统,这应是一个有前途的方向。在文献[36]中,一种混合语言知识和句法特征的方法也被提出来。

本文介绍的系统多数是针对HTML文档的。以后几年XML的使用将被普及。HTML描述的是文档的表现方式,是文档的格式语言。XML则可以告诉你文档的意义,即定义内容而不只是形式。这虽然使分装器的生成工作变得简单,但不能排除其存在的必要性。

将来的挑战是建造灵活和可升级的分装器自动归纳系统,以适应不断增长的动态网络的需要。

 

 

参考文献

 

[1]  S. Abiteboul.

Querying Semistructured Data.

Proceedings of the International Conference on Database Theory (ICDT), Greece,

January 1997.

[2] B. Adelberg.

NoDoSE - A tool for Semi-Automatically Extracting Semistructured Data from Text

Documents.

Proceedings ACM SIGMOD International Conference on Management of Data, Seat-

tle, June 1998.

[3] D. E. Appelt, D. J. Israel.

Introduction to Information Extraction Technology.

Tutorial for IJCAI-99, Stockholm, August 1999.

[4] N. Ashish, C. A. Knoblock.

Semi-automatic Wrapper Generation for Internet Information Sources.

Second IFCIS Conference on Cooperative Information Systems (CoopIS), South Car-

olina, June 1997.

[5] N. Ashish, C. A. Knoblock.

Wrapper Generation for semistructured Internet Sources.

SIGMOD Record, Vol. 26, No. 4, pp. 8--15, December 1997.

[6] P. Atzeni, G. Mecca.

Cut & Paste.

Proceedings of the 16'th ACM SIGACT-SIGMOD-SIGART Symposium on Principles

of Database Systems (PODS'97), Tucson, Arizona, May 1997.

[7] M. Bauer, D. Dengler.

TrIAs - An Architecture for Trainable Information Assistants.

Workshop on AI and Information Integration, in conjunction with the 15'th National

Conference on Artificial Intelligence (AAAI-98), Madison, Wisconsin, July 1998.

[8] P. Berka.

Intelligent Systems on the Internet.

http://lisp.vse.cz/ berka/ai-inet.htm, Laboratory of Intelligent Systems, University

of Economics, Prague.

[9] L. Bright, J. R. Gruser, L. Raschid, M. E. Vidal.

A Wrapper Generation Toolkit to Specify and Construct Wrappers for Web Accessible

Data Sources (WebSources).

Computer Systems Special Issue on Semantics on the WWW, Vol. 14 No. 2, March

1999.

[10] S. Brin.

Extracting Patterns and Relations from the World Wide Web.

International Workshop on the Web and Databases (WebDB'98), Spain, March 1998.

[11] M. E. Califf, R. J. Mooney.

Relational Learning of Pattern-Match Rules for Information Extraction.

Proceedings of the ACL Workshop on Natural Language Learning, Spain, July 1997.

[12] M. E. Califf.

Relational Learning Techniques for Natural Language Information Extraction.

Ph.D. thesis, Department of Computer Sciences, University of Texas, Austin, August

1998. Technical Report AI98-276.

[13] S. Chawathe, H. Garcia-Molina, J. Hammer, K. Ireland, Y. Papakonstantinou, J.

Ullman, J. Widom.

The TSIMMIS Project: Integration of Heterogeneous Information Sources.

In Proceedings of IPSJ Conference, pp. 7--18, Tokyo, Japan, October 1994.

[14] B. Chidlovskii, U. M. Borghoff, P-Y. Chevalier.

Towards Sophisticated Wrapping of Web-based Information Repositories.

Proceedings of the 5'th International RIAO Conference, Montreal, Quebec, June 1997.

[15] M. Craven, D. DiPasquo, D. Freitag, A. McCallum, T. Mitchell, K. Nigam, S. Slattery.

Learning to Extract Symbolic Knowledge from the World Wide Web.

Proceedings of the 15'th National Conference on Artificial Intelligence (AAAI-98),

Madison, Wisconsin, July 1998.

[16] M. Craven, S. Slattery, K. Nigam.

First-Order Learning for Web Mining.

Proceedings of the 10'th European Conference on Machine Learning, Germany, April

1998.

[17] R. B. Doorenbos, O. Etzioni, D. S. Weld.

A Scalable Comparison-Shopping Agent for the World Wide Web.

Technical report UW-CSE-96-01-03, University of Washington, 1996.

[18] R. B. Doorenbos, O. Etzioni, D. S. Weld.

A Scalable Comparison-Shopping Agent for the World-Wide-Web.

Proceedings of the first International Conference on Autonomous Agents, California,

February 1997.

[19] O. Etzioni

Moving up the Information Food Chain: Deploying Softbots on the World Wide Web.

AI Magazine, 18(2):11-18, 1997.

[20] D. Florescu, A. Levy, A. Mendelzon.

Database Techniques for the World Wide Web: A Survey.

ACM SIGMOD Record, Vol. 27, No. 3, September 1998.

[21] D. Freitag.

Information Extraction from HTML: Application of a General Machine Learning Ap-

proach.

Proceedings of the 15'th National Conference on Artificial Intelligence (AAAI-98),

Madison, Wisconsin, July 1998.

[22] D. Freitag.

Machine Learning for Information Extraction in Informal Domains.

Ph.D. dissertation, Carnegie Mellon University, November 1998.

[23] D. Freitag.

Multistrategy Learning for Information Extraction.

Proceedings of the 15'th International Conference on Machine Learning (ICML-98),

Madison, Wisconsin, July 1998.

[24] R. Gaizauskas, Y. Wilks.

Information Extraction: Beyond Document Retrieval.

Computational Linguistics and Chinese Language Processing, vol. 3, no. 2, pp. 17--60,

August 1998,

[25] H. Garcia-Molina, J. Hammer, K. Ireland, Y. Papakonstantinou, J. Ullman, J.

Widom.

Integrating and Accessing Heterogeneous Information Sources in TSIMMIS.

In Proceedings of the AAAI Symposium on Information Gathering, pp. 61--64, Stan-

ford, California, March 1995.

[26] S. Grumbach and G. Mecca.

In Search of the Lost Schema.

Proceedings of the International Conference on Database Theory (ICDT'99),

Jerusalem, January 1999.

[27] J-R. Gruser, L. Raschid, M. E. Vidal, L. Bright.

Wrapper Generation for Web Accessible Data Source.

Proceedings of the 3'rd IFCIS International Conference on Cooperative Information

Systems (CoopIS-98), New York, August 1998.

[28] J. Hammer, H. Garcia-Molina, J. Cho, R. Aranha, A. Crespo.

Extracting Semistructured Information from Web.

Proceedings of the Workshop on Management of Semistructured Data, Tucson, Ari-

zona, May 1997.

[29] J. Hammer, H. Garcia-Molina, S. Nestorov, R. Yerneni, M. Breunig, V. Vassalos.

Template-Based Wrappers in the TSIMMIS System.

Proceedings of the 26'th SIGMOD International Conference on Management of Data,

Tucson, Arizona, May 1997.

[30] C-H. Hsu.

Initial Results on Wrapping Semistructured Web Pages with Finite-State Transducers

and Contextual Rules.

Workshop on AI and Information Integration, in conjunction with the 15'th National

Conference on Artificial Intelligence (AAAI-98), Madison, Wisconsin, July 1998.

[31] C-H. Hsu and M-T Dung.

Generating Finite-Sate Transducers for semistructured Data Extraction From the

Web.

Information systems, Vol 23. No. 8, pp. 521--538, 1998.

[32] C. A. Knoblock, S. Minton, J. L. Ambite, N. Ashish, P. J. Modi, I. Muslea, A. G.

Philpot, S. Tejada.

Modeling Web Sources for Information Integration.

Proceedings of the 15'th National Conference on Artificial Intelligence (AAAI-98),

Madison, Wisconsin, July 1998.

[33] N. Kushmerick, D. S. Weld, R. Doorenbos.

Wrapper Induction for Information Extraction.

15'th International Joint Conference on Artificial Intelligence (IJCAI-97), Nagoya,

August 1997.

[34] N. Kushmerick.

Wrapper Induction for Information Extraction.

Ph.D. Dissertation, University of Washington. Technical Report UW-CSE-97-11-04,

1997.

[35] N. Kushmerick.

Wrapper induction: Efficiency and expressiveness.

Workshop on AI and Information Integration, in conjunction with the 15'th National

Conference on Artificial Intelligence (AAAI-98), Madison, Wisconsin, July 1998.

[36] Kushmerick, N.

Gleaning the Web.

IEEE Intelligent Systems, 14(2), March/April 1999.

[37] S. Lawrence, C.l. Giles.

Searching the World Wide Web.

Science magazine, v. 280, pp. 98--100, April 1998.

[38] A. Y. Levy, A. Rajaraman, J. J. Ordille.

Querying Hetereogeneous Information Sources Using Source Descriptions.

Proceedings 22'nd VLDB Conference, Bombay, September 1996.

[39] S. Muggleton, C. Feng.

Efficient Induction of Logic Programs.

Proceedings of the First Conference on Algorithmic Learning Theory, New York,

1990.

[40] I. Muslea.

Extraction Patterns: From Information Extraction to Wrapper Induction.

Information Sciences Institute, University of Southern California, 1998.

[41] I. Muslea.

Extraction Patterns for Information Extraction Tasks: A Survey.

Workshop on Machine Learning for Information Extraction, Orlando, July 1999.

[42] I. Muslea, S. Minton, C. Knoblock.

STALKER: Learning Extraction Rules for Semistructured, Web-based Information

Sources.

Workshop on AI and Information Integration, in conjunction with the 15'th National

Conference on Artificial Intelligence (AAAI-98), Madison, Wisconsin, July 1998.

[43] I. Muslea, S. Minton, C. Knoblock.

Wrapper Induction for Semistructured Web-based Information Sources.

Proceedings of the Conference on Automatic Learning and Discovery CONALD-98,

Pittsburgh, June 1998.

[44] I. Muslea, S. Minton, C. Knoblock.

A Hierarchical Approach to Wrapper Induction.

Third International Conference on Autonomous Agents, (Agents'99), Seattle, May

1999.

[45] S. Nestorov, S. Aboteboul, R. Motwani.

Inferring Structure in Semistructured Data.

Proceedings of the 13'th International Conference on Data Engineering (ICDE'97),

Birmingham, England, April 1997.

[46] STS Prasad, A. Rajaraman.

Virtual Database Technology, XML, and the Evolution of the Web.

Data Engineering, Vol. 21, No. 2, June 1998.

[47] J.R. Quinlan, R. M. Cameron-Jones.

FOIL: A Midterm Report.

European Conference on Machine Learning, Vienna, Austria, 1993.

[48] A. Rajaraman.

Transforming the Internet into a Database.

Workshop on Reuse of Web information, in conjunction with WWW7, Brisbane, April

1998.

[49] A. Sahuguet, F. Azavant.

WysiWyg Web Wrapper Factory (W4f).

http://cheops.cis.upenn.edu/ sahuguet/WAPI/wapi.ps.gz, University of Pennsylva-

nia, August 1998.

[50] D. Smith, M. Lopez.

Information Extraction for Semistructured Documents.

Proceedings of the Workshop on Management of Semistructured Data, in conjunction

with PODS/SIGMOD, Tucson, Arizona, May 1997.

[51] S. Soderland.

Learning to Extract Text-based Information from the World Wide Web.

Proceedings of the 3'rd International Conference on Knowledge Discovery and Data

Mining (KDD), California, August 1997.

[52] S. Soderland.

Learning Information Extraction Rules for Semistructured and Free Text.

Machine Learning, 1999.

[53] K. Zechner.

A Literature Survey on Information Extraction and Text Summarization.

Term paper, Carnegie Mellon University, 1997.

[54] About mySimon.

http://www.mysimon.com/about mysimon/company/backgrounder.anml

·

一堆信息提取的资料文档

·

全套垂直搜索引擎技术

·

基于视觉的正文抽取和网页块分析

·

自然语言的结构化信息抽取[科研阶段]

·

WEB网页结构化信息抽取技术介绍(网页库级)