Home >Backend Development >PHP Tutorial >discuz! 2.5x 3.0x的自动tag系统是如何实现的?

discuz! 2.5x 3.0x的自动tag系统是如何实现的?

WBOY
WBOYOriginal
2016-06-06 20:50:101192browse

最近有个项目要实现自动产生标签,发现discuz! 3.0x已经实现了这个功能,想问问discuz是如何实现分词和产生标签的。 例如:http://www.playsc.com/forum/forum.php?mod=viewthread&tid=359314&extra=page%3D1 以上链接地址有标签:SPL, Hero, 三星, 季后赛 这些标签都是自动产生的。这样的功能如何实现?discuz!在哪里实现这个功能?
主要是怎么实现的分词?哪里有算法?特别是php如何实现?
(我把discuz!下来了但是只找到tag.php类里面updatedata($appid, $data)函数,没有上一步分词函数)

回复内容:

最近有个项目要实现自动产生标签,发现discuz! 3.0x已经实现了这个功能,想问问discuz是如何实现分词和产生标签的。 例如:http://www.playsc.com/forum/forum.php?mod=viewthread&tid=359314&extra=page%3D1 以上链接地址有标签:SPL, Hero, 三星, 季后赛 这些标签都是自动产生的。这样的功能如何实现?discuz!在哪里实现这个功能?
主要是怎么实现的分词?哪里有算法?特别是php如何实现?
(我把discuz!下来了但是只找到tag.php类里面updatedata($appid, $data)函数,没有上一步分词函数)

DZ系列都有一个在线分词工具,具体的URI地址为:"http://keyword.discuz.com/related_kw.html?title=$subjectenc&content=$messageenc&ics=$SC[charset]&ocs=$SC[charset]"

以本标题为例子 discuz! 2.5x 3.0x的自动tag系统是如何实现的?,下面为生成的uri地址: http://keyword.discuz.com/related_kw.html?title=discuz!%202.5x%203.0x%E7%9A%84%E8%87%AA%E5%8A%A8tag%E7%B3%BB%E7%BB%9F%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%9A%84%EF%BC%9F&content=discuz!%202.5x%203.0x%E7%9A%84%E8%87%AA%E5%8A%A8tag%E7%B3%BB%E7%BB%9F%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%9A%84%EF%BC%9F&ics=utf-8&ocs=utf-8 请求后返回的是XML格式的内容:

<code class="lang-xml"><?xml version="1.0" encoding="utf-8" ?>
<total_response>
    <svalid>36000</svalid>
    <keyword>
    <info>
        <count>4</count>
        <errno>0</errno>
        <nextuptime>1291287160</nextuptime>
        <keep>0</keep>
    </info>
    <result>
        <item>
            <kw></kw>
        </item>
        <item>
            <kw></kw>
        </item>
        <item>
            <kw></kw>
        </item>
        <item>
            <kw></kw>
        </item>
    </result>
    </keyword>
</total_response>
</code>

PHP具体调用代码为:

<code class="lang-php">    function get_dz_tag($subject , $message){
        global $_SC;
        $subjectenc = rawurlencode(strip_tags($subject));
        $messageenc = rawurlencode(strip_tags(preg_replace("/\[.+?\]/U", '', $message)));

        $data = @implode('', file("http://keyword.discuz.com/related_kw.html?title=$subjectenc&content=$messageenc&ics=$_SC[charset]&ocs=$_SC[charset]"));

        if($data) {
            $parser = xml_parser_create();
            xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
            xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
            xml_parse_into_struct($parser, $data, $values, $index);
            xml_parser_free($parser);

            $kws = array();

            foreach($values as $valuearray) {
                if($valuearray['tag'] == 'kw' || $valuearray['tag'] == 'ekw') {
                    if(PHP_VERSION > '5' && $_SC['charset'] != 'utf-8') {
                        $kws[] = siconv(trim($valuearray['value']), $_SC['charset'], 'utf-8');//???????
                    } else {
                        $kws[] = trim($valuearray['value']);
                    }
                }
            }

            $return = '';
            if($kws) {
                foreach($kws as $kw) {
                    $kw = shtmlspecialchars($kw);
                    $return .= $kw.' ';
                }
                $return = trim($return);
            }
            return $return;
         }
    }
</code>

当然这只是一个在线分词工具,当然你也可以使用PHP扩展进行操作:如scws。

scws 有在线 api 和 扩展版两个方式:

api代码为:

<code class="lang-php">    function Scws($string){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_URL, "http://www.ftphp.com/scws/api.php");
        curl_setopt($ch, CURLOPT_POSTFIELDS, "data={$string}&respond=json");

        ob_start();
        curl_exec($ch);
        $content = ob_get_contents();
        curl_close($ch);
        ob_clean();
        $content  = json_decode($content ,true);
        return $content;    
    }
</code>

具体扩展版请参考scws文档:scws

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn