创建角色变化算法的最佳方法。创建同义词表

问题描述:

我需要为需要确认某人输入不正确变量的客户创建变体/同义词表,我们可以返回正确的部分。创建角色变化算法的最佳方法。创建同义词表

例如,如果我们有部件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

如何进行搜索,根据可用实际代码对输入进行评分并返回最佳值(甚至显示最接近的匹配项)。 –

根据上面的输入,我要做的不是存储同义词表,而是根据主字典检查一组规则。因此,例如,如果用户输入的字典中找不到该值,请将O更改为0,然后检查字典中是否存在该值。将GR更改为GB并检查。等等他们想要允许的上述所有变化都可以解释为可以一次或组合使用的规则,并检查结果条目是否存在。这样你就不必拥有大量的同义词词典来维护和更新。

我不是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为正则表达式的建议。尼斯。 –

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'替换为'O',去掉破折号等,以便对于每个实际值,只有一个修改后的值并将其存储在单独的字段\表中。

然后我会以相同的方式清理输入,并进行两部分匹配。根据实际的数据库值检查实际的输入字符串(这会得到完全匹配),然后检查清理后的输入与清理后的值。然后使用诸如Levenshtein Distance之类的距离计算器对输出与实际数据库值进行排序,以获得最可能的匹配。

现在的输入: GRL8-OO1

随着部分: GRL8-00I & GRL8OOI

这些都会归为相同的值GRL8OOI,虽然距离比赛将是更接近GRL8-OOI,所以这将是你最接近的赌注。

当然,这大大降低了您的零件号码的“独特性”,但两部分匹配和Levenshtein的组合应该为您提供您正在寻找的东西。

有莱文斯坦available