通过sae中文分词API提取文章关键字

摘要: 很早就想实现这样一个功能:自动提取文章的关键字。网上百度了一些资料,有点复杂,还需要分词字典什么的。后来注意到新浪SAE的第三方服务中有分词服务,可以轻松实现分词功能。于是就想到用sae应用写一个关键字提取功能通过jsonp(或者json)返回分词结果。

通过sae中文分词API提取文章关键字

很早就想实现这样一个功能:自动提取文章的关键字。
网上百度了一些资料,有点复杂,还需要分词字典什么的。后来注意到新浪SAE的第三方服务中有分词服务,可以轻松实现分词功能。于是就想到用sae应用写一个关键字提取功能通过jsonp(或者json)返回分词结果。


SAE分词服务

saeSegment是由新浪爱问提供的分词服务,是第三方服务。
该服务分词准确率高,而且可以返回给每个词的词性。


实现步骤


1、建立应用

见下图
注意这里选择的是php56.6

建立应用


建立应用,选择PHP5.6


在第三方服务下可以看到分词服务(如图保持开启即可)。

新浪SAE分词服务


2、上传代码

类WordSP.php

<?php
class WordSP {
    private $segment;
    private $error=array();
    public function __construct(){
        $this->segment=new SaeSegment();
    }
    public function getWords($content,$limit=10,$keywords="true"){
        if(empty($content)){
            $this->error=array("no"=>10,"message"=>"内容为空");
            return false;
        }
        $multi=(empty($multi)||!is_numeric($multi))?2:$multi;
        $limit=(empty($limit)||!is_numeric($limit))?10:$limit;
        $ret=$this->segment->segment($content, 1);
        if($ret===false){
            $this->error=array("no"=>$this->segment->errno()
            ,"message"=>$this->segment->errmsg());
            return false;
        }        
        if($keywords=="true"){
            $ret=array_map(array($this,"filterArr"),$ret);
        }
        $u=array_count_values(array_column($ret, 'word'));
        arsort($u);
        $result=array();
        foreach($u as $k=>$v){
            $result[]=$k;
            if(count($result)>=$limit)
                break;
        }
        if(empty($result)){
            $this->error=array("no"=>11,"message"=>"筛选内容为空");
            return false;
        }
        return $result;

    }
    protected function filterArr($arr){
        if(($arr["word_tag"]>=95 && $arr["word_tag"]<=104 ) ||$arr["word_tag"]==171 ||$arr["word_tag"]==200   ){
            return $arr;
        }else{
            return false;
        }
    }
    public function errno(){
        return $this->error["no"];
    }
    public function errmsg(){
        return $this->error["message"];
    }
}

文件 index.php

<?php
require "WordSP.php";
$content=isset($_GET["content"])?$_GET["content"]:"";
$respond=isset($_GET["respond"])?$_GET["respond"]:"jsonp";
$limit=isset($_GET["limit"])?$_GET["limit"]:10;
$callback=isset($_GET["callback"])?$_GET["callback"]:"callback";

$wp=new WordSP();

$ret=$wp->getWords($content,$limit);
$result=array();
if($ret===false){
    $result["error"]=$wp->errno();
    $result["message"]=$wp->errmsg();
}else{
    $result["error"]=0;
    $result["message"]="获取成功";
    $result["words"]=$ret;
}

switch($respond){
    case "jsonp":
        echo $callback."(".json_encode($result).")";
        break;
    default:
        json_encode($result);   
}

上传以上代码到服务器端根目录下即可,调用。

参数说明:

content:需处理的内容 ,get请求
respond:返回类型(jsonp|json)默认jsonp,get请求
limit:返回关键词的个数,默认10,get请求;
callback:回调函数名(返回类型为jsonp时有效),默认为callback,get请求;

返回结果说明:
error:错误码,无错误时返回0;
message:状态说明;
words:数组,结果。

3、调用(jsonp)

需引入jquery

var content= mdEditor.getHTML();//获取编辑器内容,这个依照编辑器不同而不同
content=content.replace(/[^\u4e00-\u9fa5]+/ig,'');//去除所有非中文

if(content.length>850)
    content=content.substr(0,850);//限制长度,参考《GET请求中URL的最大长度限制总结》连接见文末

 $.getJSON("http://wordsp.sinaapp.com/?callback=?",
            {respond:"jsonp",content:content})
            .done(function(data){
              if(data.error==0){                $("#post_keywords").html(data.words.join(","));                
              }
            });

最后上一张效果图

分词结果效果图


总结

这个分词API功能还非常简陋,接下来还将继续完善:

  1. 返回格式增加xml等;
  2. 增加调用验证;
  3. 等等….

参考文章
GET请求中URL的最大长度限制总结

猜你喜欢

微信QQ空间QQ好友新浪微博联系客服