`
pqcc
  • 浏览: 129716 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PHP 抽取网页标题并剔除不相关的seo关键字

    博客分类:
  • PHP
阅读更多
场景描述:

  过往我们在抽取网页标题的时候,都会直接抽取 之间的内容. 但实际情况是这样,例如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);

?>




0
1
分享到:
评论

相关推荐

    一种基于文本相似度的网页新闻标题自动抽取算法_何春辉1

    【网页新闻标题自动抽取】是信息抽取领域的重要研究方向,主要目标是从海量的网页内容中精确提取出新闻的标题,以便快速获取网页的核心信息。随着互联网技术的快速发展,网页新闻的数量呈爆炸式增长,手动抽取标题变...

    使用jieba进行关键字抽取

    你可以通过阅读源码和文档,更深入地了解jieba在关键词抽取上的应用,并将其应用于自己的项目中,如文本分类、信息检索或舆情分析等领域。 总之,jieba库为Python开发者提供了强大且易用的中文NLP工具,尤其是在...

    网页信息抽取工具 java网页信息抽取工具 java

    网页信息抽取工具 java网页信息抽取工具 java网页信息抽取工具 java网页信息抽取工具 java网页信息抽取工具 java网页信息抽取工具 java网页信息抽取工具

    基于统计的网页正文信息抽取方法

    ### 基于统计的网页正文信息抽取方法 ...通过将网页转化为树形结构并利用统计信息分析,该方法不仅简化了内容抽取的过程,而且提高了抽取结果的质量,为后续的自然语言处理任务提供了有力的支持。

    基于统计的网页正文信息抽取

    在IT领域,网页正文信息抽取是一项重要的技术,它主要用于从大量的网页数据中提取出有用的信息,如新闻报道、产品描述等。"基于统计的网页正文信息抽取"是一种利用统计学方法来识别和提取网页主要内容的技术。本文将...

    Java精确抽取网页发布时间

    本文主要探讨如何使用Java实现这一功能,通过解析网页URL和内容来获取尽可能准确的发布时间,并将其转换为标准的"yyyy-MM-dd HH:mm:ss"格式。 首先,我们可以看到代码中定义了多个正则表达式,用于匹配URL中可能...

    查找 抽取 网页中的 FLASH

    标题中的“查找、抽取网页中的FLASH”是指在网页内容中搜索并提取出嵌入的FLASH对象,通常是SWF文件格式。这些文件可能是动画、广告、交互式内容等,它们是网页设计早期常用的多媒体元素。在现代网页中,由于HTML5...

    一种基于文本抽取的网页正文去重算法

    ### 基于文本抽取的网页正文去重算法 #### 一、背景及问题提出 随着互联网技术的迅速发展,搜索引擎已成为人们获取信息的重要手段。然而,在搜索过程中,经常会出现大量的重复信息,不仅降低了用户的搜索体验,也...

    一种基于分块的Web数据实体抽取方法

    网页信息解析的目标是从网页中精确地提取有用信息,剔除无用的噪声。这一过程通常涉及将网页分割成多个语义上独立的区块,每个区块可能代表了页面上的一个特定功能或主题区域,如新闻报道、用户评论或产品详情。通过...

    新闻网页内容抽取java版

    java实现新闻网页内容抽取,具体算法参考“基于统计的新闻网页内容抽取”

    基于行块分布函数的通用网页正文抽取算法

    运用正则表达式能够精确的抽取某一固定格式的页面,但面对形形色色的HTML,运用规则处置难免捉襟见肘...能不能高效、精确的将一个页面的正文抽取出来,并做到在大范围网页范围内通用,这是一个直接关系上层应用的难题。

    网页信息抽取英文资料15篇

    网页信息抽取是计算机科学领域中的一个重要分支,它涉及到如何自动地从海量的互联网网页中提取出结构化的、有用的信息。这份资源包包含了15篇英文原版的信息抽取资料,对于那些从事网页信息抽取研究和开发的专业人士...

    基于机器学习的网页文本抽取技术.pdf

    【基于机器学习的网页文本抽取技术】 网页文本抽取技术是一种从HTML页面中提取有用信息的技术,主要用于信息检索、数据挖掘和知识发现等领域。随着互联网的快速发展,网页数量急剧增加,传统的方法,如针对特定目标...

    基于特征句抽取的网页去重研究

    ### 基于特征句抽取的网页去重研究:一项深度探索 #### 摘要与背景 在信息爆炸的时代背景下,互联网成为人们获取信息的主要渠道。然而,互联网上信息的重复性问题日益严重,这不仅增加了搜索引擎的负担,降低了...

    web网页主内容抽取

    在IT领域,网页内容抽取是一项关键技术,特别是在信息检索、数据挖掘和搜索引擎优化中。本项目专注于从Web页面中提取主要内容,特别关注新闻类网页,旨在帮助用户快速获取关键信息,提高阅读效率。以下是对"web网页...

    java实现的网页爬虫1.5版本聚焦爬虫抽取网页html

    这通常涉及到对网页内容的深入分析,识别与主题相关的部分,过滤掉不相关的信息。 2. **网页抽取**: 这一步骤是爬虫的核心功能。Java提供了许多库,如Jsoup,用于解析HTML文档并提取所需元素。爬虫首先会发送HTTP...

    winHttp组件抽取网页信息

    使用winhttp组件抽取网页信息,里面还有手动获取网页信息,并且显示在form表单里

    网页正则标签抽取例子

    本文将详细讲解如何使用正则表达式进行网页标签抽取,并通过TextRank算法对提取的信息进行关键词抽取,以便进一步的处理和应用。 首先,让我们理解正则表达式(RegExp)。正则表达式是一种模式匹配工具,可以用来...

Global site tag (gtag.js) - Google Analytics