2009-11-25 84 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