Dictionary 如何将数据集A规范化为数据集B?

Dictionary 如何将数据集A规范化为数据集B?,dictionary,location,dataset,mapping,normalization,Dictionary,Location,Dataset,Mapping,Normalization,我有两个位置数据集;一个是创建的数据集,其中包含世界上每个城市的列表,另一个是来自用户输入的位置数据 我想将所有用户输入数据映射到完整的数据集。例如,用户输入数据可以有多行: 旧金山 旧金山 旧金山 < >我想将所有这些行映射到完整数据集中的旧金山。 您会推荐哪些程序、方法、工具等?我考虑过regex,但我不知道如何自动搜索所有不同的城市 澄清:计算机不知道像SF之类的东西是否应该代表旧金山,这取决于人类的判断。总的来说,我正在寻求关于如何解决这个问题的帮助。我不知道如何将一组映射到另一组,这就

我有两个位置数据集;一个是创建的数据集,其中包含世界上每个城市的列表,另一个是来自用户输入的位置数据

我想将所有用户输入数据映射到完整的数据集。例如,用户输入数据可以有多行:

旧金山 旧金山 旧金山 < >我想将所有这些行映射到完整数据集中的旧金山。

您会推荐哪些程序、方法、工具等?我考虑过regex,但我不知道如何自动搜索所有不同的城市


澄清:计算机不知道像SF之类的东西是否应该代表旧金山,这取决于人类的判断。总的来说,我正在寻求关于如何解决这个问题的帮助。我不知道如何将一组映射到另一组,这就是我一直坚持的部分

对不起,我花了这么长时间才回来——我自私地在那里度假了!如果您仍在处理此问题:

好的,基本上。假设有一个名为place的表和一个名为city的字段。您可以使用like运算符对第一个字符进行简单匹配,不管字符数有多大

select <whatever> from place where city like 'San Fran%';

你可能想忽略情况,所以圣弗兰将与旧金山比赛。在这种情况下:

select <whatever> from place where upper(city) like upper('San Fran%');
当然,在现实生活中,您不会硬编码旧金山,它将是一个运行时参数

创建一个城市索引,这将是非常快的。如果使用upper使其不区分大小写,则在uppercity上创建索引

好的,所以你也想处理另一个例子:缩写,比如旧金山的SF。< /P> 您不会说您正在使用什么风格的SQL。如果它支持函数,您可以编写一个函数,该函数可以由任何名称构成缩写。该函数可以使用子字符串或SQL中的任何等效项查看名称的字符-我认为这些函数不是很标准,查找空格,然后提取第一个字符,然后提取空格后面的每个字符,然后返回该字符。假设您将此函数称为缩写。那么查询将是:

select <whatever> from place where upper(city) like concat(@city,'%') or abbreviate(city) = @city;
以上是MS SQL Server中的情况,其中参数的名称以@开头

然后,您将在uppercity和Shortificaty上创建索引以保持快速

如果你想更灵活一些,我不认为有任何方法可以考虑你想处理的每一个案件。比如,如果你想让用户能够进入FRISCO,找到旧金山,或者拉斯维加斯得到拉斯维加斯,你可以在城市名称中搜索任何输入的字符串,比如城市“%FrISCO %”。但这有两个大问题。第一,我认为你会得到很多错误的点击,可能其中很多对用户来说相当神秘。像SAN一样,不仅仅是旧金山和圣地亚哥,还有千橡树,加利福尼亚。看到《千年老人》了吗?第二,当LIKE子句以通配符开头时,SQL不能使用索引,因此这样的搜索意味着每次都要进行完整的文件扫描。如果你希望在用户进入Beantown时找到波士顿,或者在用户进入big apple时找到纽约,那么你就处在一个完全不同的领域

如果你想让各种各样的变体发挥作用,我想你需要一个昵称表。在这种情况下,我将创建一个不包含地点名称的地点表。然后创建一个place_name表,该表包含要接受的名称的所有变体。在地名和地点之间创建多对一关系。在名称中包含一个字段,用于标识主名称。然后查询变成:

select n2.name, p.place_id, <whatever>
from place_name n 
join place p on n.place_id=p.place_id
join place_name n2 on n2.place_id=n.place_id and n2.is_primary=1
where n.name like concat(@name,'%') or abbrev(n.name)=@name;
对于只有一个名称的地方,该地方只有一个地名记录


我建议把所有的名字都放在place_name表中,而不仅仅是备用的名字,这样你只需要搜索一个表而不是两个表就可以找到这个地方。它简化了对人工阅读器和数据库引擎的查询。

请更具体地说明如何连接数据。计算机是否应该知道圣弗兰和旧金山是同一个地方,因为弗兰是弗朗西斯科的前四个字母?它怎么知道SF是旧金山,而不是圣费尔南多、Sfitzbergen或春田?或者你打算在什么地方得到一份有效缩写的列表?谢谢你的回复!我想我所坚持的是把圣弗兰映射到旧金山的工具。你是对的,我可能会看@前几个字符,但对于缩写,我可能会手工做普通的。我被困在接近的方法上,而不是小细节。