2.4 识别并去除重复数据
清洗数据过程中的一个难题是如何处理重复值。如何找到它们?一旦找到了如何处理?尽管这个过程中的一些步骤是自动进行的,但整合它们通常需要手动完成,因为人们需要检查匹配到的潜在结果并确定它们是不是重复的和如何处理重复数据。当然,可以用启发式编程,但在特定时刻需要手动调用。
第一个需要回答的问题是数据的构成。如果数据有两个项,需要检查哪些域来判断是否存在重复?还有,相似程度多高的数据才可以算得上重复数据?
在本方法中,通过在命名域进行模糊匹配来检查一些数据,以判断是否存在重复。仅返回所有可能的重复对。
2.4.1 准备工作
首先,需要使用下列命令将模糊字符串匹配的库加到Leiningen project.clj文件中:
首先,就相似度而言,距离至多为fuzzy-max-diff。将之设置成2表明允许替换,通常是两种变化类型(删除和插入)。
或者最大距离可以是最短输入字符串长度的一个比例。在本例中,使用10%作为两个字符串的距离的最大值。
如果满足这两个条件之一,就可以判断两个字符串是相同的。这将导致出现两种情形。无论字符串的长度是多少,如果只有两个字符变化,它将认为是相同的。这对于很短的字符串而言是有问题的。
另外,固定的最大距离也对长字符串无效。如果是200个字符或者更多,也就是说,你想允许更多的字符不同而不是20个字符。fuzzy-percent-diff提供处理这种问题的灵活性。
2.4.4 更多信息
如前所述,这将无法处理短字符串。例如,它将认为ace和are是相同的。可以将逻辑设计得更加复杂,如果字符串的长度超过某一特定值,加入使用fuzzy-max-diff的一个条款。
在本方法中使用clj-diff.core/edit-distance。它可以计算将一个字符串转换成另一个需要做多少次单个字符的插入和删除操作。也可以选择用clj-diff.core/levenshtein-distance,它也使用单个字符的替换操作。