什么是比较和分组数以百万计的商店名称的有效方法?

数据挖掘 大数据
2021-09-27 18:05:33

就数据科学而言,我是一个完全的业余爱好者,我正在尝试找出一种方法来对大型数据集进行一些字符串比较。

我有一个存储商家交易的 Google BigQuery 表,但商店名称到处都是。例如,可以有“Wal-Mart Super Center”和“Wal-Mart SC #1234”,或“McDonalds F2222”和“McDonalds #321”。

我需要做的是将所有“沃尔玛”和“麦当劳”以及其他任何东西分组。我的第一种方法是进行递归正则表达式检查,但这需要很长时间并最终超时。

使用超过 2000 万行的表执行此操作的最佳方法是什么?我愿意尝试任何适合这项工作的技术。

2个回答

这是一个实体解析,也就是记录链接,也就是数据匹配问题。

我将通过删除所有非字母字符(包括数字)、转换为全部大写然后使用分层匹配来解决这个问题。首先匹配确切的案例,然后在字段之间进行 Levenshtein 评分。在您宣布某事不匹配之前,请先决定您将允许 Levenshtein 或标准化 Levenshtein 分数获得多大。

为每一行分配一个 id,当你有一个匹配时,将较低的 ID 重新分配给匹配的两个成员。

Levenshtein 距离算法简单但出色(取自此处):

def levenshtein(a,b):
    "Calculates the Levenshtein distance between a and b."
    n, m = len(a), len(b)
    if n > m:
        # Make sure n <= m, to use O(min(n,m)) space
        a,b = b,a
        n,m = m,n

    current = range(n+1)
    for i in range(1,m+1):
        previous, current = current, [i]+[0]*n
        for j in range(1,n+1):
            add, delete = previous[j]+1, current[j-1]+1
            change = previous[j-1]
            if a[j-1] != b[i-1]:
                change = change + 1
            current[j] = min(add, delete, change)

    return current[n]

这本数据匹配书是一个很好的资源,在亚马逊上免费提供 7 天。

名义上,这是一个 n2 算法没有利用一些排序效率,所以我希望必须使用多个核心 2×107行。但这应该在 8 核AWS 实例上运行良好。它最终会在一个核心上完成,但可能需要几个小时。

希望这可以帮助!

我真的很想偷懒并应用一些旧技术来快速而肮脏的解决方案,无需编程,使用 linuxsort命令。这将为您提供按字典顺序排序的列表。

如果商店名称不是第一个字段,则只需重新排序它们或通过开关告诉sort使用不同的字段。-k

将数据保存到纯 CSV 文本文件,然后对其进行排序:

$sort myStores.csv > sortedByStore.csv

您可以通过分配大量内存来帮助排序,在这种情况下为 16GB:

$sort -S16G myStores.csv > sortedByStore.csv

您可以更进一步,为它们生成唯一商店名称和实例计数的列表,以帮助您掌握数据的样子:

$sort -S16G myStores.csv  | cut -f1 -d, | uniq -c > storeIdsAndCounts.csv

或者为了避免使用并且只有唯一的 ID:

$cat sortedByStore.csv   | cut -f1 -d, | uniq  > storeIds.csv