创建字符变体算法的最佳方法。创建同义词表

时间:2011-07-15 19:37:36

标签: c# sql algorithm variations

我需要为需要确保某人输入错误变量的客户创建变体/同义词表,我们可以返回正确的部分。

示例,如果我们的零件ID为GRX7-00C。当客户将其输入到零件表中时,他们希望自动创建一个变体表,用于存储该产品可能存在的变体。像GBX7-OOC(字母O而不是数字0)。或者,如果他们的数字为1,则可以使用L或I.

因此,如果我们有部分GRL8-OOI,我们可以在变体表中将以下内容与之关联起来:

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

我目前有一个手动输入,但这些部分可能有很多变化。那么,有人会对如何为此创建自动流程有个好主意吗?

我完全不知道如何在C#和/或SQL中执行此操作。

谢谢!

4 个答案:

答案 0 :(得分:4)

我不是C#程序员,但对于其他.NET语言,我更有意义的是创建一个类似的 CHARACTERS 列表,并将它们组合在一起,并使用RegEx来评估它是否匹配。

即。为你的例子:

原件:

GRL8-001

正则表达式-ploded:

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

您可以通过拥有一个可互换字符表并运行替换函数来自动为该字符分配RegEx来实现此目的。

答案 1 :(得分:3)

Lookex函数psuedocode(就像soundex一样,但外观相似而不是声音相同)

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个)。这将消耗最小的空间,并且使用单个索引非常快,并且计算成本也很低。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我根本不会去同义词路线。

我会使用标准规则集清理数据库中的所有值。

对于存在的每个值,将所有'0'替换为'O',删除破折号等,以便对于每个实际值,您只有一个修改后的值并将其存储在单独的字段\ table中。

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

现在输入: GRL8-OO1

有部分: GRL8-00I& GRL8-OOI

这些都将标准化为相同的值GRL8OOI,尽管GRL8-OOI的距离匹配更接近,因此这将是您最接近的赌注。

当然,这大大降低了你的零件编号的“独特性”,但是这个由两部分组成的比赛和Levenshtein的组合应该可以帮助你找到你想要的东西。

Levenshtein available

有几种T-SQL实现