2010-04-30 80 views
0

我正在使用常規HTML表單提交的基於用戶貢獻數據的網站 。用變量用戶輸入填充外鍵表

爲了簡化我的問題,我們假設將有兩個字段 的形式:「用戶名」和「國家」(這只是一個示例,而不是 實際站點)。

數據庫中將有兩個表:「國家」和「用戶」, ,其中「users.country_id」是「國家」表 (一對多)的外鍵。

初始數據庫將爲空。來自世界各地的用戶將提供他們的姓名和他們居住的國家,並最終將 「國家」表格填寫爲全球 中的所有國家名稱。

因爲一個國家可以有幾個備選名稱,輸入類似 智利,辣椒,辣椒,就會造成 國家表3條不同的記錄,但實際上只有一個國家。 當我搜索智利的記錄時,辣椒和辣椒不會包含在內。

所以我的問題是 - 什麼是對付這樣的 情況最好的方式,條件,使得初始數據庫是 空的,沒有其他資源可用,一切都基於 用戶輸入?

我該如何組織它,智利,辣椒和辣椒將 作爲一個國家進行處理,並且最小的手動干擾。

當提交數據規範化用戶 時,最佳實踐是什麼?有沒有一個科學術語?我確定這個 是一個常見的問題。

同樣,我用國名來簡化我的問題,它可以是 任何可能有不同拼寫的東西。

回答

0

看到設計中的任何問題,你不能以編程方式確定智利應該是一樣辣椒這與辣椒相同。通過國家/地區示例,您可以列出您輸入數據庫的國家/地區列表,並且可以從中選擇一個下拉列表。

如果數據全部是用戶輸入的,則只能匹配如果它是完全一樣的,那麼它們的含義是相同的。

你可能想出了一個算法該關聯是一樣但恕我直言,這只是呼籲非確定性結果(災難)字樣。例如(使用與您的國家不同的示例),您可能會編程確定單詞對視只能用一個字母關閉,因此它們是相似的。但他們真的嗎?僅僅因爲這兩個詞在句法上接近並不意味着它們在語義上也很接近。我猜這就是你以後的樣子。

+0

我覺得國家名稱是解釋我的問題的一個壞例子。另一個例子:現代藝術博物館和現代藝術博物館。詞彙不同但指一個實體。我明白,以編程方式檢測這是不可能的。我只是在尋找一些通用的方法來處理它,希望有人處理過類似的事情。一種解決方案就是在用戶界面中允許用戶將MoMA標記爲現代藝術博物館的變體,然後網站管理員可以對數據庫進行適當的更改。但是如果有這樣的成千上萬的記錄呢? – Vincent 2010-04-30 04:06:48

1

搜索引擎是否基於文件(Lucene,Sphinx等)或數據庫(Oracle Text,MSSQL Fulltext)用同義詞庫解決此問題。也就是說,他們根據他們是同義詞來收集詞彙。成爲同義詞的資格比羅傑特的書更嚴格,但原則是相同的。同義詞將縮寫,首字母縮略詞和常見拼寫錯誤捆綁在一起。因此,例如,搜索同義詞庫可能識別街道st是同樣的事情。雖然,背景是一切:在字符串「聖潘克拉斯路」st聖徒的同義詞。

那麼,這是否幫助你?在一定程度上。這表明要實現這種東西:

string  | canonical 
------------+---------- 
street  | 
st   | street 
strete  | street 
Chile  | 
chilly  | Chile 
chili  | Chile 

不幸的是,建立和維護一個詞庫,需要人類的智慧和努力。構建分類需要專業知識;追蹤新增內容需要時間。另一件事是,即使詞庫比賽保持probabalistic:紐約現代藝術博物館可能是一樣的現代藝術的博物館但它是一樣舊金山現代藝術博物館NYMOMA?不完全,但也許90%是一樣的?

另一種方法是做標籤的操作。當您爲問題添加標籤時,會出現一個下拉框,提示可用標籤。當你輸入更多的字母時,這個列表縮小了。這不是傻瓜萬無一失,見證了像tsqlt-sql這樣的標籤的存在,但它很不錯。 SO還有一個備份,即向高級用戶提供新近鑄造的標籤列表,以便他們可以調查這些鑄幣並可能消除它們。但這仍然保留了手動過程。

唉,沒有那個算法FFT是要能夠告訴紐約現代藝術博物館是一樣的現代藝術博物館,更別說弄清楚它是否引用在紐約或舊金山的機構。