思路:
RSS採集
相似演算法
聚類
分類
(一)原理
小偷程序實際上是通過了XML中的XMLHTTP組件調用其它網站上的網頁。比如新聞小偷程序,很多都是調用了sina的新聞網頁,並且對其中的html進行了一些替換,同時對廣告也進行了過濾。用小偷程序的優點有:無須維護網站,因為小偷程序中的數據來自其他網站,它將隨著該網站的更新而更新;可以節省伺服器資源,一般小偷程序就幾個文件,所有網頁內容都是來自其他網站。缺點有:不穩定,如果目標網站出錯,程序也會出錯,而且,如果目標網站進行升級維護,那麼小偷程序也要進行相應修改;速度,因為是遠程調用,速度和在本地伺服器上讀取數據比起來,肯定要慢一些。
(二)事例
以下是代碼片段:
下面就XMLHTTP在ASP中的應用做個簡單說明
〈%
』常用函數
』1、輸入url目標網頁地址,返回值getHTTPPage是目標網頁的html代碼
function getHTTPPage(url)
dim Http
set Http=server.createobject("MSXML2.XMLHTTP")
Http.open "GET",url,false
Http.send()
if Http.readystate〈〉4 then
exit function
end if
getHTTPPage=bytesToBSTR(Http.responseBody,"GB2312")
set http=nothing
if err.number〈〉0 then err.Clear
end function
』2、轉換亂瑪,直接用xmlhttp調用有中文字元的網頁得到的將是亂瑪,可以通過adodb.stream組件進行轉換
Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
』下面試著調用http://www.3doing.com/earticle/的html內容
Dim Url,Html
Url="http://www.3doing.com/earticle/"
Html = getHTTPPage(Url)
Response.write Html
%〉ASP小偷入門教程.....附qq天氣小偷源代碼
要做一名好的小偷有點難度:P,靈活運用XMLHTTP組件,你也可以做「小偷」
這里所說的「小偷」指的是在ASP中運用XML中的XMLHTTP組件提供的強大功能,把遠程網站上的數據(圖片,網頁及其他文件)抓取到本地,經過各種處理後顯示到頁面上或者存儲進資料庫的一類程序。你可以通過這種小偷程序,完成過去一些似乎完全不可能實現的任務,比如說把某個站的頁面偷梁換柱後變成自己的頁面,或者把某個站的一些數據(文章,圖片)保存到本地資料庫中加以利用。「小偷」的優點有:無須維護網站,因為小偷程序中的數據來自其他網站,它將隨著該網站的更新而更新;可以節省大量的伺服器資源,一般小偷程序就幾個文件,所有網頁內容都是來自其他網站。缺點在於:不穩定,如果目標網站出錯,程序也會出錯,而且,如果目標網站進行升級維護,那麼小偷程序也要進行相應修改;速度,因為是遠程調用,速度和在本地伺服器上讀取數據比起來,肯定要慢一些。怎麼樣,聽起來很神奇吧?我們現在就開始來學習一些「小偷」程序的入門知識吧!
我們拿個簡單點的東西來研究一下吧,QQ網站上的天氣預報程序
程序演示地址:http://www.colasky.com/weather.asp
源碼下載:http://www.colasky.com/weather.rar
代碼如下:
以下是代碼片段:
〈%
On Error Resume Next
Server.ScriptTimeOut=9999999
Function getHTTPPage(Path)
t = GetBody(Path)
getHTTPPage=BytesToBstr(t,"GB2312")
End function'首先,進行小偷程序的一些初始化設置,以上代碼的作用分別是忽略掉所有非致命性錯誤,把小偷程序的運行超時時間設置得很長(這樣不會出現運行超時的錯誤),轉換原來默認的UTF-8編碼轉換成GB2312編碼,否則直接用XMLHTTP組件調用有中文字元的網頁得到的將是亂碼。
以下是代碼片段:
Function GetBody(url)
on error resume next
Set Retrieval = CreateObject("Microsoft.XMLHTTP")
With Retrieval
.Open "Get", url, False, "", ""
.Send
GetBody = .ResponseBody
End With
Set Retrieval = Nothing
End Function
』然後調用XMLHTTP組件創建一個對象並進行初始化設置。
Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function
Function Newstring(wstr,strng)
Newstring=Instr(lcase(wstr),lcase(strng))
if Newstring〈=0 then Newstring=Len(wstr)
End Function
』處理抓取回來的數據需要調用adodb.stream組件並進行初始化設置。%〉
』以下即為頁面顯示部分
〈%
Dim wstr,str,url,start,over,city
』定義一些需要使用到的變數
city = Request.QueryString("id")
』程序傳回的ID變數(即用戶選擇的城市)賦給id
url="http://appnews.qq.com/cgi-bin/news_qq_search?city="&city&""
』這里設置需要抓取的頁面地址,當然你也可以直接指定某個地址而不使用變數
wstr=getHTTPPage(url) ' 以下是代碼片段:
獲取指定頁面的全部數據
start=Newstring(wstr," ")
』這里設置需要處理的數據的頭部,這個變數應視不同情況而設置,具體內容可以通過查看需要抓取的頁面的源代碼來確定。因為在這個程序里我們需要抓取整個頁面,所以設置為頁面全部抓取。注意,設置的內容必須是頁面內容唯一的,不可以重復。
over=Newstring(wstr," ")
』和start相對應的就是需要處理的數據的尾部,同樣的,設置的內容必須是頁面中唯一的。
body=mid(wstr,start,over-start)
』設置顯示頁面的范圍
』下面就是動用乾坤挪移大法的時候了,通過replace可以用一些字元替換掉數據中指定的字元。
body = replace(body,"skin1","天氣預報")
body = replace(body,"http://appnews.qq.com/cgi-bin/news_qq_search?city","tianqi.asp?id")
』本程序中已經完成了替換的工作,如果有其他需要的話可以繼續進行類似的替換操作。
response.write body
%〉替換完需要修改的內容後,就可以把修改的內容顯示在頁面上了。至此程序結束
程序使用方法及結果:把上述代碼去掉說明部分後保存為tianqi.asp,上傳到支持ASP和XML的空間下,在瀏覽器中運行即可。你可以在在這個程序的基礎上進行進一步的界面美化或者程序優化。
以上只是一些關於XMLHTTP組件的初級應用,實際上它還能實現的功能還有很多,比如說保存遠程圖片到本地伺服器上,配合adodb.stream組件可以把獲取來的數據保存進資料庫。小偷的作用和使用范圍都很廣。但是不可以拿來做違法的事哦!
也許還有人要問了,這種「小偷」程序難道只是ASP的專利嗎?非也,PHP通過fopen函數一樣可以實現同樣的效果,由於PHP本身的各種特點,寫出來的小偷程序和ASP相比,在體積和執行效率上都有著明顯的優勢,但限於篇幅,這里就不一一說明了。
2. 誰有求兩個字元串相似度演算法代碼的,C++或者C的都行啊,急求,[email protected],必有重賞啊!!!!!!!
已經調試完了 望採納~
#include <string.h>
int main()
{
char str1[30] = {0};
char str2[30] = {0};
double count1 = 0;
double count2 = 0;
printf("請輸入兩個字元串\n");
scanf("%s",str1);
scanf("%s",str2);
if(strlen(str1)==strlen(str2))
{
int i;
for(i=0; i<30; i++)
{
if(str1[i]=='\0')
break;
count1=count1+1;
if(str1[i]==str2[i])
count2=count2+1;
}
printf("1=%g,2=%g\n",count1,count2);
printf("兩個字元串的相似度是%g%%\n",(count2/count1)*100);
}
else
printf("長度不等無法判斷相似度\n");
}
3. 常見的相似度度量演算法
本文目錄:
定義在兩個向量(兩個點)上:點x和點y的歐式距離為:
常利用歐幾里得距離描述相似度時,需要取倒數歸一化,sim = 1.0/(1.0+distance),利用numpy實現如下:
python實現歐式距離
從名字就可以猜出這種距離的計算方法了。想像你在曼哈頓要從一個十字路口開車到另外一個十字路口,駕駛距離是兩點間的直線距離嗎?顯然不是,除非你能穿越大樓。實際駕駛距離就是這個「曼哈頓距離」。而這也是曼哈頓距離名稱的來源, 曼哈頓距離也稱為城市街區距離(City Block distance)。
(1)二維平面兩點a(x1,y1)與b(x2,y2)間的曼哈頓距離
(2)兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的曼哈頓距離
python實現曼哈頓距離:
國際象棋玩過么?國王走一步能夠移動到相鄰的8個方格中的任意一個。那麼國王從格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走試試。你會發現最少步數總是max( | x2-x1 | , | y2-y1 | ) 步 。有一種類似的一種距離度量方法叫切比雪夫距離。
(1)二維平面兩點a(x1,y1)與b(x2,y2)間的切比雪夫距離
(2)兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的切比雪夫距離
python實現切比雪夫距離:
閔氏距離不是一種距離,而是一組距離的定義。
兩個n維變數a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的閔可夫斯基距離定義為:
其中p是一個變參數。
當p=1時,就是曼哈頓距離
當p=2時,就是歐氏距離
當p→∞時,就是切比雪夫距離
根據變參數的不同,閔氏距離可以表示一類的距離。
閔氏距離,包括曼哈頓距離、歐氏距離和切比雪夫距離都存在明顯的缺點。
舉個例子:二維樣本(身高,體重),其中身高范圍是150 190,體重范圍是50 60,有三個樣本:a(180,50),b(190,50),c(180,60)。那麼a與b之間的閔氏距離(無論是曼哈頓距離、歐氏距離或切比雪夫距離)等於a與c之間的閔氏距離,但是身高的10cm真的等價於體重的10kg么?因此用閔氏距離來衡量這些樣本間的相似度很有問題。
簡單說來,閔氏距離的缺點主要有兩個:
(1)將各個分量的量綱(scale),也就是「單位」當作相同的看待了。
(2)沒有考慮各個分量的分布(期望,方差等)可能是不同的。
標准歐氏距離的定義
標准化歐氏距離是針對簡單歐氏距離的缺點而作的一種改進方案。標准歐氏距離的思路:既然數據各維分量的分布不一樣,好吧!那我先將各個分量都「標准化」到均值、方差相等吧。均值和方差標准化到多少呢?這里先復習點統計學知識吧,假設樣本集X的均值(mean)為m,標准差(standard deviation)為s,那麼X的「標准化變數」表示為:
而且標准化變數的數學期望為0,方差為1。因此樣本集的標准化過程(standardization)用公式描述就是:
標准化後的值 = ( 標准化前的值 - 分量的均值 ) /分量的標准差
經過簡單的推導就可以得到兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的標准化歐氏距離的公式:
如果將方差的倒數看成是一個權重,這個公式可以看成是一種加權歐氏距離(Weighted Euclidean distance)。
有M個樣本向量X1~Xm,協方差矩陣記為S,均值記為向量μ,則其中樣本向量X到u的馬氏距離表示為:
而其中向量Xi與Xj之間的馬氏距離定義為:
若協方差矩陣是單位矩陣(各個樣本向量之間獨立同分布),則公式就成了:
也就是歐氏距離了。
若協方差矩陣是對角矩陣,公式變成了標准化歐氏距離。
馬氏距離的優缺點:量綱無關,排除變數之間的相關性的干擾。
幾何中夾角餘弦可用來衡量兩個向量方向的差異,機器學習中借用這一概念來衡量樣本向量之間的差異。
在二維空間中向量A(x1,y1)與向量B(x2,y2)的夾角餘弦公式:
兩個n維樣本點a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夾角餘弦
類似的,對於兩個n維樣本點a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可以使用類似於夾角餘弦的概念來衡量它們間的相似程度。
即:
夾角餘弦取值范圍為[-1,1]。夾角餘弦越大表示兩個向量的夾角越小,夾角餘弦越小表示兩向量的夾角越大。當兩個向量的方向重合時夾角餘弦取最大值1,當兩個向量的方向完全相反夾角餘弦取最小值-1。
python實現餘弦相似度:
兩個等長字元串s1與s2之間的漢明距離定義為將其中一個變為另外一個所需要作的最小替換次數。例如字元串「1111」與「1001」之間的漢明距離為2。
應用:信息編碼(為了增強容錯性,應使得編碼間的最小漢明距離盡可能大)。
python實現漢明距離:
兩個集合A和B的交集元素在A,B的並集中所佔的比例,稱為兩個集合的傑卡德相似系數,用符號J(A,B)表示。
傑卡德相似系數是衡量兩個集合的相似度一種指標。
與傑卡德相似系數相反的概念是傑卡德距離(Jaccard distance)。傑卡德距離可用如下公式表示:
傑卡德距離用兩個集合中不同元素占所有元素的比例來衡量兩個集合的區分度。
可將傑卡德相似系數用在衡量樣本的相似度上。
樣本A與樣本B是兩個n維向量,而且所有維度的取值都是0或1。例如:A(0111)和B(1011)。我們將樣本看成是一個集合,1表示集合包含該元素,0表示集合不包含該元素。
p :樣本A與B都是1的維度的個數
q :樣本A是1,樣本B是0的維度的個數
r :樣本A是0,樣本B是1的維度的個數
s :樣本A與B都是0的維度的個數
這里p+q+r可理解為A與B的並集的元素個數,而p是A與B的交集的元素個數。
而樣本A與B的傑卡德距離表示為:
皮爾遜相關系數即為相關系數 ( Correlation coefficient )與相關距離(Correlation distance)
相關系數的定義
相關系數是衡量隨機變數X與Y相關程度的一種方法,相關系數的取值范圍是[-1,1]。相關系數的絕對值越大,則表明X與Y相關度越高。當X與Y線性相關時,相關系數取值為1(正線性相關)或-1(負線性相關)。
1. 機器學習中的相似性度量
2. 推薦演算法入門(1)相似度計算方法大全
3. Python Numpy計算各類距離
4. 皮爾遜積矩相關系數