分组以提取半结构化数据中的公共值

时间:2009-11-25 22:58:26

标签: mysql data-mining

我在数据库中有一个“有点”丑陋的字段,其中包含位置的名称。例如,麦迪逊广场花园也被列为“麦迪逊广场花园”等。

我正在尝试提取数据,以便我可以获得所有位置的准确列表。 为了实现这一点,我所做的是创建一个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'也可能是一个很大的好处。

我打算采用每个结果,然后对纬度/长度范围内的所有位置进行正则表达式匹配?

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

有关从半结构化数据中提取位置的其他建议吗? 数据从各种来源中删除,因此我无法控制输入。

2 个答案:

答案 0 :(得分:1)

以下是一些建议。

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

(2)创建一个包含场地拼写拼写的查找表。这适用于“波士顿花园”/“舰队中心”/“TD Banknorth花园”/“北站”等场地名称以及类似的垃圾。相同的地方,不同的拼写。 (“Penn Station”为例)。

(3)您可以使用Yahoo或Google Maps地理编码服务,这些服务将采用不完整的名称和地址并对其进行标准化。

Soundex会给你带来一些误报。它被设计为后备并且需要人为消歧。

答案 1 :(得分:0)

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

在这个帖子中讨论过: How do I do a fuzzy match of company names in MYSQL with PHP for auto-complete?