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函数,没有上一步分词函数)

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 = rawurlencodestrip_tags$subject; $messageenc = rawurlencodestrip_tagspreg_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 { ifPHP_VERSION > 5 && $_SC[charset] != utf-8 { $kws[] = siconvtrim$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

发表评论

电子邮件地址不会被公开。 必填项已用*标注