最近因為專案需要對乙個web網頁變更進行實時監控,之前專案組有人採用的是比較簡單 的文字對比的方式,只要發現文字中一處發生變動就進行告警,最後導致的結果就是誤報的情況比較多,比如在對首頁進行監控時,後台對使用者訪問量的統計會在首頁實時更新,這樣就會被當做**被改動來處理了,而這並不是我們所需要的,因為我們感興趣的不是網頁動態資料區域的變化,這樣我們最終要解決的就是怎麼來分離網頁的動態區域和靜態區域。
動態區域和靜態區域的分離技術應用在很多方向,資料探勘方面應用的較廣,如網頁資料抽取、網頁聚類、網頁篡改等等。
在參考了以下**《 web網頁中動態資料區域的識別去抽取》《基於模板的網頁資料抽取》《基於區域性變化性的網頁篡改識別模型及方法》《網頁篡改系統的研究與實現》之後,大體思路就是採用編輯距離來計算樹或字串的相似度,對字串的編輯距離計算相當於計算一維向量的編輯距離。
本系統大體也是採用了dom遍歷比較以及節點標記的方式來實現,最終形成乙個節點集合,然後對形成的節點集合中相鄰的節點進行合併形成網頁模板。這個也是我大體的方案。
第乙個難點是如何去遍歷兩顆dom樹,首先我們先解決比較兩個節點集合中的變化節點,如果採用**中的for for語句來遍歷的話會出現相鄰節點順序變化卻無法檢測到的情況,並且節點會重複遍歷,而我們想要找出插入、刪除的節點,修改的節點相當於執行了刪除插入操作,而我們這裡將標籤 名沒變化內容或屬性變化的情況稱作修改操作。原先我們採用在for for迴圈中引入了乙個移動標記位來解決也可以一次找出變化的節點,後來發現編輯距離不僅可以解決相似度的問題,而且通過矩陣回溯也可以一次找出變化的節點,一下是標準的字串編輯距離演算法。
值得說明的是,編輯距離計算的前提是只允許插入、刪除、修改操作來達到字串轉換的目的。
而我們的演算法 也只需要這3中操作,而編輯距離演算法本身卻不之侷限這3種操作,具體可參考
而我們也可以去掉某種操作或該重新定義某種操作的行為,一下是標準的編輯距離計算方法。
// strings of size m and n are passed.
// construct the table for x[0...m, m+1], y[0...n, n+1]
int editdistancedp(char x, char y)
// t[0][j] = j
for(int j = 0; j < n; j++)
*operation=0;
// build the t in top-down fashion
for(int i = 1; i < m; i++)
else
} else
else
} *(t + (i)*n + (j)) = mincell;
} }// 結果儲存在 t[m][n]
cost = *(t + m*n - 1);
backtrace(operation, x, y);
free(t);
return cost;
}
通過矩陣回溯可計算出變化的位置
void backtrace(int* operation, char* a, char* b)
} printf("insert:%d,delete:%d,substitute:%d\n",insertion,deletion,substitution);
}
下面是計算helloworld和ahellowored的編輯距離結果顯示,圖中矩陣為回溯矩陣
編輯字串距離
題目 題意 編輯距離,又稱levenshtein距離 也叫做edit distance 是指兩個字串之間,由乙個轉成另 乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪 除乙個字元。例如將kitten轉化成sitting sitten k s sittin ...
字串編輯距離
題目描述 給定乙個源串和目標串,能夠對源串進行如下操作 在給定位置上插入乙個字元 替換任意字元 刪除任意字元 寫乙個程式,返回最小運算元,使得對源串進行這些操作後等於目標串,源串和目標串的長度都小於2000。關於字串最短編輯距離的解題思路 給定相關資料的定義 mep i j 表示源字串source ...
字串編輯距離
給出兩個單詞word1和word2,寫乙個函式計算出將word1 轉換為word2的最少操作次數。你總共三種操作方法 1 插入乙個字元 2 刪除乙個字元 3 替換乙個字元 格式 輸入行輸入兩個字串 word1 和 word2,最後輸出將 word1 轉換為 word2的最少操作次數 樣例輸入 wor...