如何检测数据的“相似性”

时间:2010-09-03 16:42:01

标签: java algorithm

一般来说,你能否建议一种让我测试物体以确保它们相似的方法。

如果超过'n%'的对象内容相同,则接受对象是相同的。

除了蛮力外,还有可以利用的库吗?

感谢

5 个答案:

答案 0 :(得分:3)

作为一个起点,看一下名为Levenshtein distance的内容,看看它是否与您的使用相关?

答案 1 :(得分:1)

这只能根据具体情况进行。如果我真的需要这个功能,我会定义一个接口:

public interface Similar<Entity> {
boolean isSimilar(Entity other);
}

每个实现类都可以定义与另一个实例“相似”的含义。要记住的事项与克隆时要记住的问题相同:浅拷贝与深拷贝等等。

天真实施人:

public class Person implements Similar<Person> {
    private String firstName;
    private String lastName;

    public String getLastName() {
        return lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public boolean isSimilar(Person other) {
        if (other != null) {
            if (lastName.equalsIgnoreCase(other.getLastName())
                || (firstName.equalsIgnoreCase(other.getFirstName()))) {
                return true;
            }
        }

        return false;
    }
}

答案 2 :(得分:1)

如果您专注于特定问题的详细信息,我相信您可以找到一个好的解决方案。对于一般情况,我想到的唯一“合理”解决方案是基于reflection:扫描数据成员并递归地找到相应成员对的相似性。

然而,这个想法存在很多问题,所以我认为这不可行。其中:

1)应该很好地定义成员子树的权重的概念,以便能够返回相似性百分比。

2)如何处理仅属于其中一个对象的数据成员?在将类A的实例与后代类B的实例进行比较时,这种情况经常发生。

3)也许最大的问题是:对象的内部结构与其抽象数据表示之间的映射不是一个内射函数。例如,由于表重新分配的历史不同,表示相同映射的两个哈希映射可能具有不同的内部结构。

答案 3 :(得分:0)

你可以尝试的一件事是编码对象然后比较结果......特别是我用JSON完成了这个。为了检测对象是否完全匹配,这很简单。

答案 4 :(得分:0)

您可以实现Comparable接口并定义自己的'逻辑'来比较类的实例。

如前所述,对于文本相似性,您可以使用距离计算算法,您可以在SimMetrics库中找到它(http://www.dcs.shef.ac.uk/~sam/simmetrics.html)。

比较的另一种方法是比较对象哈希码(在覆盖Object类的hashCode()方法之后) - 请注意确保它正是您要查找的内容。