资源描述
提取网页主题相关内容
一般在浏览Web上的网页时会发现两部分内容:一部分是网页的主题信息,另一部分则是与主题内容无关的导航条、广告信息、版权信息等内容,我们称之为“噪音”内容。通过提取主题信息可以减少一半浏览时间,提高用户获取信息的速度,从而增强Web的可用性。那么如何准确、有效的获取Web网页的主题信息呢?下面给出了一种解决方案。
一、 解析html
HTMLParser是一个对现有的HTML进行分析的快速实时的解析器,首先从( http://HTMLP zip解压缩得htmlparser.jar,将htmlparser.jar添加到classpath中,并在程序中引入相应的HTMLParser包。类Parser是HTMLParser的入口,将HTML文本信息传给它,或者直接传递一个URL地址,如:Parser parser = new Parser(“”);初始化一个Parser实例parser后,紧接着就是对所传入的HTML内容进行解析,方法parser.extractAllNodesThatAre (XXXTag.class)将HTML内容中存在的所有的标签XXXTag给解析出来放到一个列表list中去,几乎HTML的标签都有一个对应的类,比如LinkTag、ImageTag、FormTag、TableTag等等,这些标签类都在org.htmlparser.tags包中。根据要处理不同的标签传入不同的类,这种做法可以很方便地处理其他类型的标签。返回的列表中每个元素都是传入类的一个实例,通过这个实例可以访问到当前这个标签的起始位置、结束标签的位置以及包含在标签中的文本信息,同时也可以访问其父标签以及所有的子标签等等,同时可以通过toHtml方法来对标签中包含的HTML信息进行清洗,HTMLParser会自动把一些没有关闭的标签加上,这样所生成的字符串中就包含着完整的格式控制信息,在页面上显示这样的信息也不会破坏版面布局,达到了预期的效果。
例如:有如下不规范的html文件(有未关闭标签)
通过节点的toHtml()方法补全标签
补全了没有关闭的标签
本系统采用先读取html文件并将其转换为字符串htmlString:
String htmlString = readHtmlFile(file);
然后将其作为Parser对象的构造参数:
Parser parser = Parser.createParser(htmlString,”gb2312”);
然后结合过滤器过滤出需要的标签节点。
二、 过滤器
一般主题信息包含在下列标签中:<table>、<tr>、<td>、<p>、<div>等。所以如何过滤出这些节点标签呢?htmlparser提供了很好的支持:
NodeFilter[] filters = new NodeFilters[3];
filters[0] = new NodeClassFilter(TableTag.class);
filters[1] = new NodeClassFilter(ParagraphTag.class);
filters[2] = new NodeClassFilter(Div.class);
NodeFilter filter = new OrFilter(filters);
NodeList list = parser.extractAllNodesThatMatch(filter);
OrFilter是结合几种过滤条件的‘或’过滤器。通过以上代码就可以过滤得到所有的<table>、<p>和<div>节点。
例如:下面html文件经过以上过滤器过滤后就只得到所需的节点了
Html文件经过滤器过滤
经过滤器过滤后得到的结果
三、 信息抽取、
1、<p>、<div>节点的内容相关性判定:
我们称包含文本信息的区域为内容块,本系统的核心是内容块的主题相关性判断。本系统所涉及的内容块节点为<table>、<div>、<p>。主题相关性判定(当然本系统认为<div>标签中如果还含其他标签,或者<P>标签中含有<div>,<script>或内嵌<p>标签,则认为主题不相关。)包含两部分:局部相关性判定(由局部相关度表示)和上下文相关性判定。局部相关度(LocalRel)由内容块节点中的非链接中文字符总数和链接总数决定,其计算公式为:
LocalRel = wordsNum / linkNum
当LocalRel 大于等于L(其中L是局部相关度的阀值),称该块局部相关(如果linkNum为0且wordsNum大于14,认为局部相关)。上下文相关性即判定该内容块节点的前驱兄弟和后继兄弟的主题相关性。前驱兄弟和后继兄弟必须是包含有中文内容的结点。主题内容块的判定算法如图:
words_min是规定内容块节点的非链接中文字符总数的最小值。一般情况下,若wordsNum<words_min,则称该节点为空或没有内容,没有内容的块节点是主题不相关的。当然,若LocalRel >= L时,且wordsNum >= words_min时,此时并不能说明该块就是主题相关的。它只能说明该块是局部相关的。原因基于如下观察:
a、 一些局部相关度大的块,例如一些与主题无关的广告内容,它们可能没有链接或包含较少的链接,因此它们可能LocalRel >= L,且wordsNum >= words_min。
b、 即使wordsNum <= words_min,也不能判断它是主题无关的。因为一些小信息量的主题内容,如正文的标题或正文中的小信息
因此还要通过它前后的兄弟节点的主题相关性来判定是否主题相关。本系统对<table>节点是单独处理的,因此<p>节点和<div>节点用于以上信息抽取算法中。
2、<table>的有效性判定
HTML页面中表格是由<table>元素标识的。在很多Web站点尤其是商业站点,用<table>元素标识的除了称之为其表格的数据表格之外还包含导航栏,或其它站点的链接等其他用来进行页面布局的非数据表格,非数据表格又被称为假表格。另一种情况是并不是所有的Web页面中的数据表格都是感兴趣的,有时即便是一个领域相关的Web页面也可能包含几个内容跟研究无关的数据表格。已经知道要定位的表格信息存在于<table></table>结点之间的内容中,所以只关心table结点。通过对html文档中table结点的依次遍历滤除非数据表格。在该过程中使用的启发式规则如下:
规则1:表格大小至少是3行3列。
规则2:如果表格中包含大量的链接,则认为该表格是非数据表格。
规则3:如果表格中包含<script>、<select>、css样式标签等,则认为该表格是非数据表格。
附录资料:
Ehcache缓存配置
简介
Cache的配置很灵活,官方提供的Cache配置方式有好几种。你可以通过声明配置、在xml中配置、在程序里配置或者调用构造方法时传入不同的参数。
你可以将Cache的配置从代码中剥离出来,也可以在使用运行时配置,所谓的运行时配置无非也就是在代码中配置。以下是运行时配置的好处:
· 在同一个地方配置所有的Cache,这样很容易管理Cache的内存和磁盘消耗。
· 发布时可更改Cache配置。
· 可再安装阶段就检查出配置错误信息,而避免了运行时错误。
本文将会对ehcache.xml配置文件进行详细的阐述。在配置的时可以拷贝一个现有的ehcache.xml,如果没有请点击这里去下载。
ehcache-failsafe.xml
如果你调用了CacheManager默认构造方法去创建CacheManager的实例,此方法会到classpath中找ehcache.xml文件,否则它会到类路径下找ehcache-failsafe.xml文件。而ehcache-failsafe.xml被包含在jar包中,所有它肯定能找的到。
ehcache-failsafe.xml提供了一个非常简单的默认配置,这样可以使用户在没有创建ehcache.xml的情况下使用Ehcache。
不过这样做Ehcache会提醒用户创建一个正确的Ehcache配置。
ehcache.xml片段:
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
ehcache.xml和其他配置文件
在Ehcache-1.6之前的版本,只支持ASCII编码的ehcache.xml配置文件。在Ehcach-1.6之后版本中,支持UTF8编码的ehcache.xml配置文件。因为向后兼容,所有采用ASCII编码的配置文件完全没有必要转换为UTF8。
一个CacheManager必须要有一个XML配置。由于磁盘路径或是监听端口,多个CacheManager使用同一个配置文件时会出现错误。
下面是ehcache.xml具体实例以及配置指南
<ehcache xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
· CacheManager配置
DmulticastGroupPort=4446,这样可以配置监听端口。
· DiskStore配置
如果你使用的DiskStore(磁盘缓存),你必须要配置DiskStore配置项。如果不配置,Ehcache将会使用java.io.tmpdir。
diskStroe的“path”属性是用来配置磁盘缓存使用的物理路径的,Ehcache磁盘缓存使用的文件后缀名是.data和.index。
<disStore path=”java.io.tmpdir”/>
· CacheManagerEventListener配置
我们通过CacheManagerEventListenerFactory可以实例化一个CacheManagerPeerProvider,当我们从CacheManager中added和removed Cache时,将通知CacheManagerPeerProvider,这样一来,我们就可以很方面的对CacheManager中的Cache做一些统计。
注册到CacheManager的事件监听类名有: adding a Cache和removing a Cache
<cacheManagerEventListenerFacotory class=”” properties=””/>
· CacheManagerPeerProvider配置
在集群中CacheManager配置CacheManagerPeerProviderFactory创建CacheManagerPeerProvider。具体的实例如下:
<cacheManagerPeerProviderFactoryclass="net.sf.ehcache.distribution.
RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual, rmiUrls=//server1:40000/sampleCache1|//server2:40000/sampleCache1| //server1:40000/sampleCache2|//server2:40000/sampleCache2"
propertySeparator="," />
· CacheManagerPeerListener配置
CacheManagerPeerListener配置是用来监听集群中缓存消息的分发的。
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="hostName=fully_qualified_hostname_or_ip,
port=40001,
socketTimeoutMillis=120000"
propertySeparator="," />
· Cache配置
· name:Cache的唯一标识
· maxElementsInMemory:内存中最大缓存对象数。
· maxElementsOnDisk:磁盘中最大缓存对象数,若是0表示无穷大。
· eternal:Element是否永久有效,一但设置了,timeout将不起作用。
· overflowToDisk:配置此属性,当内存中Element数量达到maxElementsInMemory时,Ehcache将会Element写到磁盘中。
· timeToIdleSeconds:设置Element在失效前的允许闲置时间。仅当element不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
· timeToLiveSeconds:设置Element在失效前允许存活时间。最大时间介于创建时间和失效时间之间。仅当element不是永久有效时使用,默认是0.,也就是element存活时间无穷大。
· diskPersistent:是否缓存虚拟机重启期数据。(这个虚拟机是指什么虚拟机一直没看明白是什么,有高人还希望能指点一二)。
· diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
· diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
· memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。这里比较遗憾,Ehcache并没有提供一个用户定制策略的接口,仅仅支持三种指定策略,感觉做的不够理想。
· Cache Exception Handling配置
<cacheExceptionHandlerFactory class="com.example.ExampleExceptionHandlerFactory" properties="logLevel=FINE"/>
总结
这里只对通用缓存的配置做了详细的阐述,至于RMI缓存和集群缓存可以参考这里。
下面给出几个配置示例:
· Ehcache默认Cache配置
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskSpoolBufferSizeMB="30"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
· SampleCache1配置
简单配置,在ehcache.xml文件中有此配置,在使用Ehcache前最好将其删除掉,自己配置。
缓存名sampleCache1,内存中最多可缓存10000个Element,其中的element会在闲置5分钟或是存活10分钟之后失效。
超过10000element时,element将会输出到磁盘中,输出路径是java.io.tmpdir。
<cache name="sampleCache1"
maxElementsInMemory="10000"
maxElementsOnDisk="1000"
eternal="false"
overflowToDisk="true"
diskSpoolBufferSizeMB="20"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
memoryStoreEvictionPolicy="LFU"
/>
· SampleCache2配置
Cache名为SampleCache2,内存中最多可以缓存1000个element,超出1000不能输出到磁盘中。缓存是永久有效的。
<cache name="sampleCache2"
maxElementsInMemory="1000"
eternal="true"
overflowToDisk="false"
memoryStoreEvictionPolicy="FIFO"
/>
· SampleCache3配置
Cache名为SampleCache3。可缓存到磁盘。磁盘缓存将会缓存虚拟机重启期的数据。磁盘缓存失效线程运行间隔时间是10分钟。
<cache name="sampleCache3"
maxElementsInMemory="500"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="1"
memoryStoreEvictionPolicy="LFU"
/>
· sampleDistributedCache1配置
Cache名为sampleDistributedCache1。
<cache name="sampleDistributedCache1"
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
overflowToDisk="false">
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>
<bootstrapCacheLoaderFactory
class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/>
</cache>
· sampleDistributedCache2配置
<cache name="sampleDistributedCache2"
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
overflowToDisk="false">
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicateAsynchronously=false, replicatePuts=false,
replicateUpdates=true, replicateUpdatesViaCopy=true,
replicateRemovals=false"/>
</cache>
· sampleDistributedCache3配置
<!--
Sample distributed cache named sampleDistributedCache3.
This cache replicates using defaults except that the asynchronous replication
interval is set to 200ms.
-->
<cache name="sampleDistributedCache3"
maxElementsInMemory="10"
eternal="false"
timeToIdleSeconds="100"
timeToLiveSeconds="100"
overflowToDisk="false">
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="asynchronousReplicationIntervalMillis=200"/>
</cache>
展开阅读全文