HTML页面比较 - Levenshtein距离

时间:2017-07-12 06:03:10

标签: java html algorithm tomcat levenshtein-distance

我的任务是比较两个html页面'内容,如他们彼此之间的差异。根据差异,我的意思是两者有多少不同/相同w.r.t. div s,img s,内容和其他标记(用户可以直观地解释所有差异。如果您要比较两个html页面以购买产品,那么购买流程有3个步骤。我比较step2(信用卡信息)和step3(Checkout / Confirmation页面),然后几乎所有两个页面的购买面板之外的内容都相同,但内部所有内容都不同。因此用户可以直观地解释两个页面都不同)。

为此,我使用了Levenshtein距离,代码低于

     /**
     * The method levenshteinDistance() is use to calculate the distance between
     * two strings
     * 
     * @param lhs
     *            first string
     * @param rhs
     *            secont sreing
     * @return distance
     */
    public static int levenshteinDistance(CharSequence lhs, CharSequence rhs) {
        int len0 = lhs.length() + 1;
        int len1 = rhs.length() + 1;

        // the array of distances
        int[] cost = new int[len0];
        int[] newcost = new int[len0];

        // initial cost of skipping prefix in String s0
        for (int i = 0; i < len0; i++)
            cost[i] = i;

        // dynamically computing the array of distances

        // transformation cost for each letter in s1
        for (int j = 1; j < len1; j++) {
            // initial cost of skipping prefix in String s1
            newcost[0] = j;

            // transformation cost for each letter in s0
            for (int i = 1; i < len0; i++) {
                // matching current letters in both strings
                int match = (lhs.charAt(i - 1) == rhs.charAt(j - 1)) ? 0 : 1;

                // computing cost for each transformation
                int cost_replace = cost[i - 1] + match;
                int cost_insert = cost[i] + 1;
                int cost_delete = newcost[i - 1] + 1;

                // keep minimum cost
                newcost[i] = Math.min(Math.min(cost_insert, cost_delete), cost_replace);
            }

            // swap cost/newcost arrays
            int[] swap = cost;
            cost = newcost;
            newcost = swap;
        }

        // the distance is the cost for transforming all letters in both strings
        return cost[len0 - 1];
    }

问题

1) Levenshtein距离是比较两个 html页面的正确方法吗?

1.1)如果是,则有时字符串长度大于120000个字符。在这一点上,Levenshtein距离消耗了太多资源,有时它会暂停其他进程/ tomcat-server几分钟。 Levenshtein再一次是一种比较两个 html页面的正确方法吗?

1.2)如果没有那么建议我一个好的/有效的算法来比较这些 html页面。

P.S:我使用Java 8和tomcat 8作为服务器。

1 个答案:

答案 0 :(得分:0)

如果你想知道“用户可以在视觉上解释的所有差异”方面的差异,我认为比较代码(html)来提取差异是不合逻辑的。因为视觉上相同的部分可能来自不同的代码,所以它对你来说是误报。

我可以通过屏幕截图比较来查看视觉差异。