论文导读:网络信息资源也爆炸般的增长。如果没有一个好的搜索引擎。试验结果表明军事教育主题爬虫抓取网页的准确度及准确率都比普通爬虫的高。本文通过设计一个军事教育主题爬虫从网络上收集有关理财网页(代替军队的教育网页),以解决本实验室面向军事教育主题的个性化搜索引擎的资源问题。
关键词:网络,主题爬虫,搜索引擎,军事教育主题爬虫
l1引言
当今,随着Intemet在国内的迅猛发展,军队正在向现代化建军目标发展,为了使军队更快的向信息化,数字化方向发展,军队都在着手建设自己的信息网,网络信息资源也爆炸般的增长,在军队内的信息服务器上,同样能够获取许多有用的资源。如果没有一个好的搜索引擎,查询起来困难就可想而知。现在www网上基本都是一些商业性的探索引擎,这些引擎深度和广度都很大,有些甚至是整个环球网进行检索。论文发表,搜索引擎。而军队只需要搜索其内部网络即可。因此在军队网中安置一个针对军队信息资源进行搜索的爬虫十分必要。
l2军事教育主题爬虫的爬行策略
搜索引擎中最关键的部分是网络爬虫,它的性能好坏直接影响着搜索引擎的整体性能和处理速度。传统的网络爬虫是按照预先设定的广度优先策略、深度优先策略或这两种策略相结合的方式爬行网页[ 1 ] 。网络爬虫的搜索策略与搜索引擎的性质和任务密切相关。决定网络爬虫搜索策略的关键是如何将不相关的网页快速地过滤并删除掉,因为网页过滤的速度和准确性将会直接影响网络爬虫的性能。以何种策略访问Web,成为近年来主题搜索引擎网络爬虫研究的焦点之一。军事教育主题爬虫是按照最佳优先的爬行策略爬行网页即军事教育主题爬行时按照主题相关度优先的爬行策略爬行网页。爬虫从网络上抓取到的新网页在爬行之前都要进行主题相关度分析,与初始种子网页相关度最高的网页被优先爬行,而与初始种子网页不相关或相关度不大的网页则被抛弃。因此与传统网络爬虫相比,军事教育主题爬虫的工作量大大减少、爬行的准确度大大提高。
l3军事教育主题爬虫的系统实现
3.1 设计思路与总体柜架
从设计思路上,构造Spider有两种比较常用的方法。第一种是把Spider设计成一个递归的程序,第二种是编写一个非递归的Spider程序,程序维护一个要访问的网页列表,考虑到Java对数组、队列的包支持较为丰富,实现相对容易,本程序使用了第二种设计思路。
程序中总共维护了四个不同的队列,它们的总结如下。每一个这样的队列保存着同一处理状态的URL。
等待队列 当Spider程序开始处理URL时,它们被传送到这一队列。重要的是同一个URL不能被多次处理,因为这样是浪费的。当一个URL被处理过后,它被移送到或者是错误队列或者是完成队列。论文发表,搜索引擎。论文发表,搜索引擎。
运行队列 当前正在处理的URL队列。
错误队列 如果在下载当前网页时发生错误,它的URL将被加入到错误队列。该URL到达这一队列后将不再移入其它队列。论文发表,搜索引擎。一旦网页移入错误队列,Spider程序将不会再对它作进一步处理。
完成队列 如果在下载网页时没有发生错误,该URL将被加入到完成队列。该URL到达这一队列后将不再移入其他队列。
明显,每个得到的URL都只能存在于一个队列中。其状态流程图如下(图1):
评定分数计算公式采用信息检索中常用的词条权值计算方法为
TF-IDF 函数
Wi,j=Avg(TFi)*(1/(log(nDoc/ni)+1/log(nDoc-1)))
Avg(TFi):对词i取其在各文档中的TF值进行平均;
nDoc:文档数目;
ni:出现词i的文档个数;
3.2程序结构及具体实现
网络爬虫种类很多,如有基于全文搜索的网络爬虫[2],聚类网络爬虫,主题网络爬虫,基于本体的网络爬虫等。在引入BOT包的基础上,实现了以并发进程方式对指定站点内部网页数据的访问和基于队列的处理,将抓取到的网页数据存储在本地数据库中。程序由四个文件组成:CheckLinks.java; HTMLParse.java; ISpiderReportable.java;Spider.java,程序工程报告如图2:
图2
用TF-IDF 函数算出各个词语的权值,最终得到全部词的权值wordWeightOfAllDocument
public class segmenter {
public TreeMap zhwords;//用Treemap形式定义,带标签,方便对应查找
//下面定义的是一些统计词项与词频的链表
public ArrayList wordSum;
public ArrayList wordCount;
public ArrayList wordAll;
public ArrayList wordCountAll;
//根据选取网页的编码类型,选择不同的词库文件。
String newword = null;
try {
InputStream worddata = null;
if(charform == SIMP) {
worddata= getClass().getResourceAsStream('simplexu8.txt');
} else if(charform == TRAD) {
worddata= getClass().getResourceAsStream('tradlexu8.txt');
} else if(charform == BOTH) {
worddata= getClass().getResourceAsStream('bothlexu8.txt');
}
//wordSum ; wordCount; wordAll; wordCountAll;wordCountMax;这些链表都是为了分词后统计出每个词的tf值和IDF值,最后根据公式算出每个词语的权值!
//这个是tf值的计算并记录文件
public ArrayList getTfValue(String args){
int tmpIndex;
BufferedWriter fileOut;
ArrayList tmpArrayList = newArrayList(3);
File tmpTfFilePath=newFile('tf');
tmpTfFilePath.mkdir();
try{
fileOut=newBufferedWriter ( new FileWriter (args+'.tf'));
for(int k =0;k<wordSum.size();k++){
tmpIndex=k;
double tmp =(double)(Integer)wordCount.get(tmpIndex)).intValue()/(double) wordCountMax;
Double dTmp = newDouble(tmp); tmpArrayList.add(dTmp/*(Object)tmp*/);
//这个是IDF值的计算
for(int idfi=0;idfi<wordOfAllDocument.size();idfi++)
{
int ni=0;//how many document contains a word
String tmpString=(String)wordOfAllDocument.get(idfi);
for(int idfj=0; idfj<nDoc; idfj++)
{
if(((ArrayList)wordOfOneDocument.get(idfj)).contains(tmpString))
ni++;
}
Double dTmpdouble = newDouble(1/(Math.log(nDoc/ni)+1/Math.log(nDoc-1)));
wordIdfValueOfAllDocument.add(/*1/(Math.log(nDoc/ni)+1/Math.log(nDoc-1))*/dTmpdouble);
//IDF 采用倒数,表明在专题训练文档中在越多文档中出现,其越重要。
//最后利用公式算出该词在训练主题中的权重 W=Avg(tf)*IDF
for(int tfi=0;tfi<wordOfAllDocument.size();tfi++){
inttmpIndex=-1;
inttni=0;
doubletfall=0.0;
StringtmpString=(String)wordOfAllDocument.get(tfi);
for(inttfj=0; tfj<nDoc; tfj++){
if((tmpIndex=((ArrayList)wordOfOneDocument.get(tfj)).indexOf(tmpString))!=-1){
tni++; tfall=tfall+((Double)(((ArrayList)wordTfValueOfOneDocument.get(tfj)).get(tmpIndex))).doubleValue();
}
}
Double dTmpdouble = newDouble(tfall/tni);
Double dTmpdoubleElse = newDouble((tfall/tni)*(((Double)wordIdfValueOfAlDocument
-.get(tfi)).doubleValue()));
wordTfValueOfAllDocument.add(dTmpdouble); wordWeightOfAllDocument.add(dTmpdoubleElse);
}
实现的流程如下,首先,CheckLinks得到一个起始的URL,在CheckLinks.run()中,新建Spider实例,把起始URL加入到等待队列中,并通过setKeyWord()方法设置关键词,setCheckRobots()、setCheckMetaTag()配置选项,程序进入正常工作。
Spider通过getWorkloadWaiting()方法得到等待队列中的URL,调用processURL()方法对取出的URL进行处理,对此,processURL()方法内以URL为地址建立链接,取回对象通过parse.parse()方法对HTML进行解释,主要是从得到的HTML中获取新的URL并添加到等待队列中,及对主题字的匹配。经过parse返回,则从等待队列中移走处理的URL,如果没有错误,把它添加到完成队列中,否则添加到错误队列中,程序又去等待队列中取出URL,进行同样的处理流程,循环一直到等待队列为空。
3.3开发环境
实验条件:搜索深度= 2 (设的较小,为了防止搜索规模过大) ,线程数= 100 (要求在网络环境较好的情况下) ,起始种子= 10 (都是经过人工选择的较好的种子) ,阈值r = 0. 6 ,中文分词主要以中科院计算所免费版的分词工具(C 语言开发) 为基础。机器配置: Intel(R)Core™2 CPU T5500 @1.66Ghz,内存2048 MB。试验结果表明军事教育主题爬虫抓取网页的准确度及准确率都比普通爬虫的高。论文发表,搜索引擎。
3.4 实验总结及系统存在的问题
爬行速度太慢,特别是对超链接较多的页面;页面内容的多少对评分有一定影响,虽然不大,但仍需考虑;若能在网页架构分析上添加一定的过滤,抓取核心内容,相信对抓取质量会有更大的提高,这方面也待改善。
l4结束语
本文通过设计一个军事教育主题爬虫从网络上收集有关理财网页(代替军队的教育网页),以解决本实验室面向军事教育主题的个性化搜索引擎的资源问题。论文发表,搜索引擎。从实验结果来看爬虫达到了我们初步的预定目标,下一步我们将不断对其进行完善以进一步提高其搜索精度及搜索速度。
参考文献
[1]周立柱,林玲1聚焦爬虫技术研究综述1计算机应用1第25卷第9期2005年9月:1966
[2]徐远超,刘江华,刘丽珍等.基于Web 的网络爬虫的设计与实现.微计算机信息.2007,23(7):119-121
[2[Programming a Spider in Java,Jeff Heaton
Biography:JinPeng(1982-),male, qingdao,China University Of Petroleum, research interests are in areas of computernetwork and. Search Engine
|