AOE博客宣威凌网资讯
A-A+

如何用ASP获取与指定文章关键词匹配的相关文章

2013年01月27日 其他 暂无评论 阅读 1,839 views 次
淘宝天猫内部优惠券大放送

阿零以前曾写过一篇【ASP按关键字匹配度获取相关文章】,原ASP函数获取的相关文章匹配度思路有很多缺陷,在后来用ASP写【得失网】的时候做了较大更改。虽然小部分功能代码尚需改进,但整体效果还是非常理想的,所以先抛块砖,希望过路朋友不吝指教,提供更好的获取相关文章的思路和方法。

本文旨在阐述如何根据指定文章记录的关键词信息,获取与其匹配度最高的相关文章记录的ASP解决方法。判断相关文章匹配度的思路如下:

1、获取指定ID的文章的关键词字符串,并按照特定符号(逗号)分隔该关键词字符串存入数组;

2、从指定标识文章(A)的关键词数组中顺序取出一个关键词(K)与其他文章(B)记录比对,如果文章(B)的标题中包含关键词(K),则文章(A)与文章(B)的相关匹配度(OrderPriority)增加,如果文章(B)的标题不包含该关键词,则文章(A)与文章(B)的相关匹配度为0;接着用关键词(K)与文章(B)记录的关键词字符串比对,如果关键词(K)在文章(B)记录的关键词中出现,则相关匹配度增加。

3、以此类推,关键词越往后则权重越低,最后累计全部关键词相关匹配度之和并按降序排列。

Function getlikeart(myid)
'-----------------------------------------------------------
'函数功能:获取与指定ID文章记录关键词匹配度最高的相关文章记录
'程序作者:阿零
'程序版本:2.2
'更新时间:2013-1-25
'-----------------------------------------------------------

mynum=8
'mynum为需要列出的相关文章数量,myid指定的文章标识

dim mykey,keyarry
'定义变量:关键词串,关键词数组

qz = Array(25,20,15,12,10,8,6)
'关键词权重数组,第一个匹配度【默认】为35,第二个25,第三个20……依次往下

'说明:【zdid,zdtitle,zdlinkpath,zdviewcount,zdadddate,zdkeyword】字段分别标识【文章ID,文章标题,文章页面链接,浏览次数,更新日期,文章关键词(在数据库中体现为以英文逗号分隔的字串)】,数据表名:wzarticle

mysql="select zdkeyword from wzarticle where zdid = '"&myid&"'"
'取得指定文章标识的关键词字符串

dbrs.open mysql,dbconn,1,1

if dbrs.eof and dbrs.bof then     '找不到该标识的文章记录则退出
    response.Write "错误的文章标识!"
    dbrs.close
    set mysql=nothing
    exit function
end if

mykey=dbrs(0)
dbrs.close
set mysql=nothing
keyarry=split(mykey,",")

likesql="select top "&mynum&" zdid,zdtitle,zdlinkpath,zdviewcount,zdkeyword,((case when charIndex('"&keyarry(0)&"',zdtitle)>0 then 35 else 0 end) + (case when charIndex('"&keyarry(0)&"',zdkeyword)>0 then 30 else 0 end)"
'从指定标识文章(A)的关键词数组中顺序取出一个关键词(K)与其他文章(B)记录比对,如果文章(B)的标题中包含关键词(K),则文章(A)与文章(B)的匹配相关度(OrderPriority)为35,如果文章(B)的标题不包含该关键词,则文章(A)与文章(B)的匹配相关度为0;接下来关键词(K)与文章(B)记录的关键词字符串比对,如果关键词(K)在文章(B)记录的关键词中出现,则匹配相关度增加30。如果关键词(K)在文章(B)的标题中没有出现,仅文章(A)的关键词与文章(B)的关键词相符则相关度为0+30。

'要求:文章必须有至少一个关键词,在按照关键词查找相关文章时最多遍历前8个关键词

if ubound(keyarry) > 8 then
    dbcount=8
else
    dbcount=ubound(keyarry)
end if

for i=1 to dbcount
    likesql=likesql&" + (case when charIndex('"&keyarry(i)&"',zdtitle)>0 then "&qz(i-1)&" else 0 end) + (case when charIndex('"&keyarry(i)&"',zdkeyword)>0 then "&qz(i-1)-5&" else 0 end)"
next

likesql=likesql&") as OrderPriority from wzarticle WHERE zdid <> '"&myid&"'"

likesql=likesql&" and (zdtitle like '%"&keyarry(0)&"%'"

for j=1 to dbcount
    likesql=likesql&" or zdtitle like '%"&keyarry(j)&"%'"
next

likesql=likesql&") Order by OrderPriority desc"
'通过循环构造SQL查询字符串

dbrs.open likesql,dbconn,1,1

if dbrs.bof and dbrs.eof then    '如果没有找到相关文章记录则随机生成
    dbrs.close
    othersql="select top "&mynum&" zdid,zdtitle,zdlinkpath,zdviewcount,zdadddate from wzarticle where zdid <> '"&myid&"' order by newid()"    '排除自身,生成随机文章

dbrs.open othersql,dbconn,1,1

if dbrs.bof and dbrs.eof then
    response.Write "暂无相关文章可以显示!"
    dbrs.close
    exit function
end if

dbrs.movefirst

do while not dbrs.eof
    response.Write "<a target = '_self' href = '" & dbrs(2) & "' title='"& "阅读次数:" & dbrs(3) & ";发表于:" & dbrs(4) &"'>" & dbrs(1) & "</a><br>"
    dbrs.movenext
loop

dbrs.close
set othersql=nothing

else    '显示找到的相关文章记录
    dbrs.movefirst

do while not dbrs.eof
    if dbrs(7)>99 then
    mylike=99
    else
    mylike=dbrs(7)
    end if

'因为要兼顾关键词的顺序权重,同时也要保证相关文章匹配度的准确,所以特殊情况下指定ID的前三个关键词都会在其他文章的标题和关键词字段中出现,此时相关文章的匹配度会超出100,如果匹配度超过100,则置为99。

response.Write "<a target = '_self' href = '" & dbrs(2) & "' title='"& "阅读次数:" & dbrs(3) & ";相关度:" & dbrs(5) &"'>" & dbrs(1) & "</a><br>"

    dbrs.movenext
    loop
    dbrs.close
    set likesql=nothing
end if

End Function

科网虚拟主机—AOE博客在用

给我留言

Protected by WP Anti Spam

Copyright © 阿零博客 保留所有权利.   Theme  Ality

用户登录

分享到: