search

Home  >  Q&A  >  body text

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

最近有个项目要实现自动产生标签,发现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)函数,没有上一步分词函数)

迷茫迷茫2906 days ago635

reply all(1)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 14:29:15

    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格式的内容:

    <?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><![CDATA[的]]></kw>
            </item>
            <item>
                <kw><![CDATA[是]]></kw>
            </item>
            <item>
                <kw><![CDATA[discuz]]></kw>
            </item>
            <item>
                <kw><![CDATA[如何]]></kw>
            </item>
        </result>
        </keyword>
    </total_response>
    

    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;
             }
        }
    

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

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

    api代码为:

        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;    
        }
    

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

    reply
    0
  • Cancelreply