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

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

WBOY
Release: 2016-06-06 20:50:10
Original
1201 people have browsed it

最近有个项目要实现自动产生标签,发现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>
Copy after login

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>
Copy after login

当然这只是一个在线分词工具,当然你也可以使用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>
Copy after login

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

source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template