2009-11-25 48 views
1

我在包含位置名称的数据库中有一个“有点”丑陋的字段。例如,麦迪逊广场花园也被输入为“麦迪逊广场花园”等。分组以提取半结构化数据中的常见值

我试图提取数据,以便我可以得到所有位置的准确列表。 为了做到这一点,我所做的是创建一个SQL查询,我加入每个位置的事件,然后按位置名称进行分组,并且只使用具有多于10个条目的位置组(过滤掉某些不是 - 可靠的条目),但我仍然结束了一些非常不同的拼写和条目,导致重复的属性/位置。

我的SQL查询看起来像这样

 
"SELECT location, COUNT(*) FROM locations 
JOIN event ON locations.lid=events.lid 
WHERE `long` 
BETWEEN - 74.419382608696 
AND - 73.549817391304 
AND lat 
BETWEEN 40.314017391304 
AND 41.183582608696 
GROUP BY location 
HAVING COUNT(*)>10 

运行此查询提供了3个不同的条目“麦迪逊广场花园”,“麦迪逊广场花园”,“麦迪逊广场花园”。当然,这只是麦迪逊广场花园的入场券。大多数条目有多个稍微不同的拼写。

我用lat/long限制我的搜索,所以我没有在分组到一起的不同城市中获得同名的位置。

是否有正则表达式或GROUP子句中的某些方法来使这些分组保持一致?即使只是在分组之前删除尾部's'和'the'也可能是一大好处。

我打算取每个结果,然后在经纬度范围内对所有位置进行正则表达式匹配?

幸运的是,我有足够的链接事件到位置,我有点能够识别主要位置。

从半结构化数据中提取位置的任何其他建议? 数据从各种来源报废,所以我无法控制输入。

回答

0

如果你的问题是“相似”字符串相同,你可能想看看SOUNDEX算法。我不确定它是否适用于所有不同的场景,但这是一个开始。

它在这个线程讨论: How do I do a fuzzy match of company names in MYSQL with PHP for auto-complete?

+0

对于Soundex来说不是一个好主意,但是通过soundex(location)的分组返回与非soundex查询相同的结果。 – pedalpete 2009-11-26 00:00:54

+0

也许你可以尝试更先进的算法,然后像这里:http://codejanitor.com/wp/2007/02/10/levenshtein-distance-as-a-mysql-stored-function/ – dcp 2009-11-26 00:03:32

+0

我只是读完全一样的东西! – pedalpete 2009-11-26 00:11:49

1

这里有你一些建议。

在你的数据库创建一个标准化的场地名称列: (1)通过一些简单的转换运行每个名称... 转向“麦迪逊广场花园”和“华盛顿纪念碑”到“麦迪逊广场花园”和“华盛顿纪念碑” 将复数名词变成单数的简单方法...剥去你的名字中每个单词的“es”,然后是“s”。 压倒一切。 消除任何剩余的短词“a”“it”“the”和“”&“你明白了。 按照字母顺序排列你的词,让你“花园麦迪逊广场” 将结果字符串存储到你的表中的新列。 匹配它,同时仍显示您的原始字符串。

(2)创建一个包含不同场地拼写的查找表。这适用于像“波士顿花园”/“舰队中心”/“TD Banknorth花园”/“北站”等场地名称和垃圾。同一地点,不同的拼写。(例如“Penn Station”)。 (3)您可以使用Yahoo或Google Maps地理编码服务,这些服务将使用不完整的名称和地址并对其进行标准化。

Soundex会给你带来不少误报。它被设计为后备,需要人为消除歧义。

+0

我在想那样的Ollie。有没有办法在mysql中完成这些转换?或者我需要将请求转换为php,然后转换文本并更新?有什么建议么? – pedalpete 2009-11-26 01:56:33

+0

皮特,我认为你将需要使用PHP。要使用存储的mySql函数(例如“NORMALIZE_NAME”)执行此操作,您需要一个REGEXP_REPLACE原始函数,但尚未就绪。 如果这是一个高容量的应用程序,您可以考虑创建一个mySql用户定义的函数。但是你必须用C来创建它,这将是一个PITA来维护。 – 2009-11-26 12:37:33

+0

感谢Ollie,我一直怀疑,但认为它可能会更快在SQL单独。 – pedalpete 2009-11-26 15:35:06