使用 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
- 数据集有超过 2400 个不同的值,所以我不能硬编码。
- 我有一个国家 table 维度,其中包含所有城市及其正确名称。
我尝试了 ,它是否正是我所需要的,但不适用于我的整个数据集。
考虑以下方法(考虑到您已查找 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)
如果应用于您问题中的示例数据 - 输出为
注意:您显然需要注意潜在的重复,以防某些城市听起来相似,在这种情况下,添加国家/地区限制可能会有所帮助...
首先,基础知识。
- 删除 non-letters.
- 案例折叠。
- 转换为 ASCII 等价物。
第一个是 straight-forward,去掉所有不是字母的东西所以 São Paulo
和 São Paulo.
都是 SãoPaulo
.
大小写折叠也是straight-forward,将所有内容更改为小写或大写。 são paulo
和Sã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 Paul
和 Sao Paulo
的编辑距离为 1;加一个字母。 S Paulo
和 Sao Paulo
的编辑距离为 2,添加两个字母。 Sao Paulo
和 Saint Paul
的编辑距离为 4;将 o 更改为 i,添加 n 和 t,删除 o.
同样,我建议使用常规编程语言执行此操作,然后将规范化结果写回 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 |
- 数据集有超过 2400 个不同的值,所以我不能硬编码。
- 我有一个国家 table 维度,其中包含所有城市及其正确名称。
我尝试了
考虑以下方法(考虑到您已查找 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)
如果应用于您问题中的示例数据 - 输出为
注意:您显然需要注意潜在的重复,以防某些城市听起来相似,在这种情况下,添加国家/地区限制可能会有所帮助...
首先,基础知识。
- 删除 non-letters.
- 案例折叠。
- 转换为 ASCII 等价物。
第一个是 straight-forward,去掉所有不是字母的东西所以 São Paulo
和 São Paulo.
都是 SãoPaulo
.
大小写折叠也是straight-forward,将所有内容更改为小写或大写。 são paulo
和Sã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 Paul
和 Sao Paulo
的编辑距离为 1;加一个字母。 S Paulo
和 Sao Paulo
的编辑距离为 2,添加两个字母。 Sao Paulo
和 Saint Paul
的编辑距离为 4;将 o 更改为 i,添加 n 和 t,删除 o.
同样,我建议使用常规编程语言执行此操作,然后将规范化结果写回 BigQuery。