2011-07-15 43 views
3

我需要爲需要確認某人輸入不正確變量的客戶創建變體/同義詞表,我們可以返回正確的部分。創建角色變化算法的最佳方法。創建同義詞表

例如,如果我們有部件ID爲GRX7-00C。當客戶將其輸入到零件表中時,他們希望自動創建一個變體表,以存儲此產品可能存在的變體。像GBX7-OOC(字母O而不是數字0)。或者,如果他們有數字1,要能夠如果我們有一部分GRL8-OOI我們可以有下列關聯到它在變化表使用L或I.

所以:

  • GRI8- OOI
  • GRL8-0OI
  • GRL8-O0I
  • GRL8-OOI
  • 等....

我目前有一個手動輸入,但是這些部分可能會有很多變化。那麼,有沒有人有一個好主意,我可以如何創建一個自動過程呢?

我完全沉迷於如何在C#和/或SQL中做到這一點。

謝謝!

+1

幾個T-SQL實現這聽起來像是一個非常糟糕的方式來解決這個問題。我寧願驗證用戶輸入並在ID錯誤時發出消息。爲用戶提供選擇部件ID(下拉列表,按名稱查找等)的附加工具也有幫助。 –

+0

他們可能會用它來建議正確的部分,所以我可以看到該功能的用途,但不確定存儲所有變體的智慧。字符插入和刪除是被考慮的,還是隻是字符替換? – hatchet

+1

如何進行搜索,根據可用實際代碼對輸入進行評分並返回最佳值(甚至顯示最接近的匹配項)。 –

回答

0

根據上面的輸入,我要做的不是存儲同義詞表,而是根據主字典檢查一組規則。因此,例如,如果用戶輸入的字典中找不到該值,請將O更改爲0,然後檢查字典中是否存在該值。將GR更改爲GB並檢查。等等他們想要允許的上述所有變化都可以解釋爲可以一次或組合使用的規則,並檢查結果條目是否存在。這樣你就不必擁有大量的同義詞詞典來維護和更新。

4

我不是C#程序員,但對於其他.NET語言,創建類似字符的列表更有意義,並將它們組合在一起,然後使用RegEx評估它是否匹配。

即對於你的例子:

原文:

GRL8-001

正則表達式,ploded:

GR(l|L|1)(8|b|B)-(0|o|O)(0|o|O)(1|l|L)

你可以通過具有通假字和運行表做到這一點自動將RegEx替換爲字符的替換功能。

+0

+1爲正則表達式的建議。尼斯。 –

3

Lookex功能僞碼(就像同音但看起來很相像,而不是聲音一樣)

string input 
for each char c 
    if c in "O0Q" c = 'O' 
    else if c in "IL1" c = 'I' 
    etc. 

計算一個Lookex代碼,並存儲每個產品ID。如果用戶的輸入與產品ID不匹配,請在其輸入上計算Lookex代碼,並搜索具有該代碼的所有產品(可能多於1個)。這將消耗最小的空間,並且對於單個索引來說速度很快,而且計算也很便宜。

0

我根本不會去同義詞路線。

我會使用標準規則集清理數據庫中的所有值。

對於存在的每個值,將所有'0'替換爲'O',去掉破折號等,以便對於每個實際值,只有一個修改後的值並將其存儲在單獨的字段\表中。

然後我會以相同的方式清理輸入,並進行兩部分匹配。根據實際的數據庫值檢查實際的輸入字符串(這會得到完全匹配),然後檢查清理後的輸入與清理後的值。然後使用諸如Levenshtein Distance之類的距離計算器對輸出與實際數據庫值進行排序,以獲得最可能的匹配。

現在的輸入: GRL8-OO1

隨着部分: GRL8-00I & GRL8OOI

這些都會歸爲相同的值GRL8OOI,雖然距離比賽將是更接近GRL8-OOI,所以這將是你最接近的賭注。

當然,這大大降低了您的零件號碼的「獨特性」,但兩部分匹配和Levenshtein的組合應該爲您提供您正在尋找的東西。

有萊文斯坦available