场景描述:
过往我们在抽取网页标题的时候,都会直接抽取 之间的内容. 但实际情况是这样,例如javaeye 的一篇文章 http://www.iteye.com/news/21643 , 的内容为 "10年软件开发教会我最重要的10件事 - 非技术 - ITeye资讯", 但实际引用中我们期望的标题应该为 "10年软件开发教会我最重要的10件事". 所以标题后面堆砌了很多不相关的关键字(应该是为了 seo 吧). 所以我们希望过滤掉这些关键字. 有下面的方法可以参考:
1. 查找 h1 等标签.(分析sina news 一些网站之后, 觉得不可行,会有很多干扰)
2. 从全文去标题后,将 之间的内容切割(按 _ | -)为 a1,a2,a3,a4,然后从最长的词组a3开始从全文查找. 如果查找成功,那么开始向左边迭代查询 a2,a1,直到查询失败为止 。左侧失败后,再继续向右迭代,同理. (这里我采用的是这种方法)
<?php
/**
* @author pqcc <struts.ec@mgail.com>
* @date: 2011-06-18
* Description: 给定一个网页内容,提取网页的标题. 提取的标题不包括 seo 关键字.
* e.g: 一篇新闻标题的从<title>直接抽取结果为 "大学英语四六级本周六开考 909万人参考_新浪教育_新浪网",
* 但我们希望的结果是:"大学英语四六级本周六开考 909万人参考".
* 适用范围: 文章最终页标题的提取, 不包括专题页等.
*/
class TitlePurify{
private $matches_preg = '[-_\s|—]';
function getTitle($contents){/*{{{*/
$preg = "/<title[^>]*>([\w|\t|\r|\W]*?)<\/title>/i";
preg_match($preg, $contents, $matches);
if(count($matches)<=1){
return "标题抽取失败";
}
$title = $matches[1];
return $this->trimTitle($title, $contents);
}/*}}}*/
function trimMeta($contents){/*{{{*/
// 首先去除 <title> 内容, <meta> 内容.
$preg = "/<title[^>]*>([\w|\t|\r|\W]*?)<\/title>/i";
$contents = preg_replace($preg, '', $contents);
$preg = "/<meta[^>]*>/i";
$contents = preg_replace($preg, '', $contents);
return $contents;
}/*}}}*/
// 获取长度最长的 item 所处的index.
function getMaxIndex($titles){/*{{{*/
$maxItemIndex = 0;
$maxLength = 0;
$loop = 0;
foreach($titles as $item){
if(strlen($item)>$maxLength){
$maxLength = strlen($item);
$maxItemIndex = $loop;
}
$loop++;
}
return $maxItemIndex;
}/*}}}*/
function trim($title, $titles, $contents, $maxItemIndex){/*{{{*/
//@todo : 此处可优化contents
// 如果查找成功. result = tempTitle.
$tempTitle = $titles[$maxItemIndex];
$result = $tempTitle;
$count = count($titles);
// while 从当前index 向左进行迭代(直到到达第一个或者匹配失败才中止).
$leftIndex = $maxItemIndex-1;
while(true && $leftIndex>=0){
// tempTitle+左一个.
preg_match("/({$this->matches_preg}+{$tempTitle})/i", $title, $matches);
if(count($matches)>1){
// temp 用于匹配失败后,进行回滚.
$temp = $titles[$leftIndex] . $matches[1];
$tempTitle = $titles[$leftIndex] . $matches[1];
// 继续拿着 tempTitle 去匹配.
preg_match("/$tempTitle/i", $contents, $matches);
// 如果查找失败....
if(count($matches)<1){
$tempTitle = $temp;
break;
}else{
$result = $tempTitle;
}
}else{ // 正常情况下, 不会出现该情况.
break;
}
$leftIndex--;
}
// match(current[i-1].[|-].tempTitle), 如果成功, tempTitle = match 成功的值,继续.
// while 左边失败后, 从右边开始.
$rightIndex = $maxItemIndex+1;
while(true && ($rightIndex<=$count)){
preg_match("/({$tempTitle}{$this->matches_preg}+)/i", $title, $matches);
if(count($matches)>1){
// temp 用于匹配失败后,进行回滚.
$temp = $matches[1] . $titles[$rightIndex];
$tempTitle = $matches[1] . $titles[$rightIndex];
// 继续拿着 tempTitle 去匹配.
preg_match("/$tempTitle/i", $contents, $matches);
// 如果查找失败....
if(count($matches)<1){
$tempTitle = $temp;
break;
}else{
$result = $tempTitle;
}
}else{ // 正常情况下, 不会出现该情况.
break;
}
$rightIndex++;
}
return $result;
}/*}}}*/
function trimTitle($title, $contents){/*{{{*/
$contents = $this->trimMeta($contents);
// 配置切割标题的规则.
$titles = preg_split("/$this->matches_preg/i", $title);
$count = count($titles);
//var_dump($titles);exit;
// 将当前最长的 item 从全文查找.
$maxItemIndex = $this->getMaxIndex($titles);
$tempTitle = $titles[$maxItemIndex];
preg_match("/$tempTitle/i", $contents, $matches);
// 如果查找失败....
if(count($matches)<1){
return $title;
}
return $this->trim($title, $titles, $contents, $maxItemIndex);
}/*}}}*/
}
// ------------- test code ------------------------------
function convertEncoding($contents){
preg_match("/charset=([\w|\-]+);?/i", $contents, $match);
$charset = isset($match[1])? $match[1] : 'UTF-8';
$contents = mb_convert_encoding($contents, 'UTF-8', $charset);
return $contents;
}
$url = 'http://china.nba.com/news/4/2011/0617/61383331/10451.html';
$contents = file_get_contents($url);
$contents = convertEncoding($contents);
$startTime = microtime();
$purify = new TitlePurify();
$title = $purify->getTitle($contents);
$endTime = microtime();
echo "标题: $title ";
echo "cost: " . ($endTime-$startTime);
?>
分享到:
相关推荐
【网页新闻标题自动抽取】是信息抽取领域的重要研究方向,主要目标是从海量的网页内容中精确提取出新闻的标题,以便快速获取网页的核心信息。随着互联网技术的快速发展,网页新闻的数量呈爆炸式增长,手动抽取标题变...
你可以通过阅读源码和文档,更深入地了解jieba在关键词抽取上的应用,并将其应用于自己的项目中,如文本分类、信息检索或舆情分析等领域。 总之,jieba库为Python开发者提供了强大且易用的中文NLP工具,尤其是在...
网页信息抽取工具 java网页信息抽取工具 java网页信息抽取工具 java网页信息抽取工具 java网页信息抽取工具 java网页信息抽取工具 java网页信息抽取工具
### 基于统计的网页正文信息抽取方法 ...通过将网页转化为树形结构并利用统计信息分析,该方法不仅简化了内容抽取的过程,而且提高了抽取结果的质量,为后续的自然语言处理任务提供了有力的支持。
在IT领域,网页正文信息抽取是一项重要的技术,它主要用于从大量的网页数据中提取出有用的信息,如新闻报道、产品描述等。"基于统计的网页正文信息抽取"是一种利用统计学方法来识别和提取网页主要内容的技术。本文将...
本文主要探讨如何使用Java实现这一功能,通过解析网页URL和内容来获取尽可能准确的发布时间,并将其转换为标准的"yyyy-MM-dd HH:mm:ss"格式。 首先,我们可以看到代码中定义了多个正则表达式,用于匹配URL中可能...
标题中的“查找、抽取网页中的FLASH”是指在网页内容中搜索并提取出嵌入的FLASH对象,通常是SWF文件格式。这些文件可能是动画、广告、交互式内容等,它们是网页设计早期常用的多媒体元素。在现代网页中,由于HTML5...
### 基于文本抽取的网页正文去重算法 #### 一、背景及问题提出 随着互联网技术的迅速发展,搜索引擎已成为人们获取信息的重要手段。然而,在搜索过程中,经常会出现大量的重复信息,不仅降低了用户的搜索体验,也...
网页信息解析的目标是从网页中精确地提取有用信息,剔除无用的噪声。这一过程通常涉及将网页分割成多个语义上独立的区块,每个区块可能代表了页面上的一个特定功能或主题区域,如新闻报道、用户评论或产品详情。通过...
java实现新闻网页内容抽取,具体算法参考“基于统计的新闻网页内容抽取”
运用正则表达式能够精确的抽取某一固定格式的页面,但面对形形色色的HTML,运用规则处置难免捉襟见肘...能不能高效、精确的将一个页面的正文抽取出来,并做到在大范围网页范围内通用,这是一个直接关系上层应用的难题。
网页信息抽取是计算机科学领域中的一个重要分支,它涉及到如何自动地从海量的互联网网页中提取出结构化的、有用的信息。这份资源包包含了15篇英文原版的信息抽取资料,对于那些从事网页信息抽取研究和开发的专业人士...
【基于机器学习的网页文本抽取技术】 网页文本抽取技术是一种从HTML页面中提取有用信息的技术,主要用于信息检索、数据挖掘和知识发现等领域。随着互联网的快速发展,网页数量急剧增加,传统的方法,如针对特定目标...
### 基于特征句抽取的网页去重研究:一项深度探索 #### 摘要与背景 在信息爆炸的时代背景下,互联网成为人们获取信息的主要渠道。然而,互联网上信息的重复性问题日益严重,这不仅增加了搜索引擎的负担,降低了...
在IT领域,网页内容抽取是一项关键技术,特别是在信息检索、数据挖掘和搜索引擎优化中。本项目专注于从Web页面中提取主要内容,特别关注新闻类网页,旨在帮助用户快速获取关键信息,提高阅读效率。以下是对"web网页...
这通常涉及到对网页内容的深入分析,识别与主题相关的部分,过滤掉不相关的信息。 2. **网页抽取**: 这一步骤是爬虫的核心功能。Java提供了许多库,如Jsoup,用于解析HTML文档并提取所需元素。爬虫首先会发送HTTP...
使用winhttp组件抽取网页信息,里面还有手动获取网页信息,并且显示在form表单里
本文将详细讲解如何使用正则表达式进行网页标签抽取,并通过TextRank算法对提取的信息进行关键词抽取,以便进一步的处理和应用。 首先,让我们理解正则表达式(RegExp)。正则表达式是一种模式匹配工具,可以用来...