使用 BigQuery 进行字符串比较

String comparison using BigQuery

我有一个table写着人和他们的家乡名字,但是有相同的城市不同的写法,见:

Name Hometown
João São Paulo
Maria Sao Paul
Pedro São Paulo.
Maria S. Paulo

我需要处理这个以便将数据形式化为如下所示:

Name Hometown
João São Paulo
Maria São Paulo
Pedro São Paulo
Maria São Paulo

我尝试了 ,它是否正是我所需要的,但不适用于我的整个数据集。

考虑以下方法(考虑到您已查找 table 所有适当的城市名称)作为示例 - 我将其作为 CTE,只有几个

with cities as (
  select 'São Paulo' as city union all 
  select 'Los Angeles' union all 
  select 'Dnipro' union all 
  select 'Kyiv'
)
select Name, City as Hometown
from your_table 
left join cities 
on soundex(Hometown) = soundex(city)      

如果应用于您问题中的示例数据 - 输出为

注意:您显然需要注意潜在的重复,以防某些城市听起来相似,在这种情况下,添加国家/地区限制可能会有所帮助...

首先,基础知识。

  1. 删除 non-letters.
  2. 案例折叠。
  3. 转换为 ASCII 等价物。

第一个是 straight-forward,去掉所有不是字母的东西所以 São PauloSão Paulo. 都是 SãoPaulo.

大小写折叠也是straight-forward,将所有内容更改为小写或大写。 são pauloSão Paulo比较一样。

最后,将它们转换为正常的 ASCII 等价物。例如,são 变为 sao

完成此规范化后,空格、多余字符、重音和大小写的问题都解决了。我建议在 BigQuery 之外使用 Python 这样的语言来执行此操作。执行 select distinct 并使用 unidecode.

等库转换和比较每个值

然后您可以使用一些试探法来尝试找到“足够接近”的匹配项。一个例子是 Levenshtein distance which is the number of substitutions, insertions, and deletions one needs to do to turn one string into another. Python has a Levenshtein library.

例如,Sao PaulSao Paulo 的编辑距离为 1;加一个字母。 S PauloSao Paulo 的编辑距离为 2,添加两个字母。 Sao PauloSaint Paul 的编辑距离为 4;将 o 更改为 i,添加 n 和 t,删除 o.

同样,我建议使用常规编程语言执行此操作,然后将规范化结果写回 BigQuery。