3

我需要为需要确保如果有人输入不正确的变量的客户创建一个变体/同义词表,我们可以返回正确的部分。

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

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

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

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

我完全不知道如何在 C# 和/或 SQL 中做到这一点。

谢谢!

4

4 回答 4

4

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

即你的例子:

原来的:

GRL8-001

正则表达式:

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

您可以通过拥有一个可互换字符表并运行替换功能来自动为字符替换 RegEx 来完成此操作。

于 2011-07-15T19:59:47.340 回答
3

Lookex 函数伪代码(像 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 个)。这将消耗最少的空间,并且使用单个索引非常快,并且计算成本也很低。

于 2011-07-15T20:02:07.137 回答
0

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

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

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

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

现在输入:GRL8-OO1

带零件:GRL8-00I & GRL8-OOI

这些都将归一化为相同的值 GRL8OOI,尽管 GRL8-OOI 的距离匹配会更接近,所以这将是你最接近的赌注。

诚然,这会显着降低零件编号的“唯一性”,但两部分匹配和 Levenshtein 的组合应该可以满足您的需求。

有几种可用的 Levenshtein 的 T-SQL 实现

于 2011-07-18T14:50:02.410 回答
0

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

于 2011-07-15T19:56:31.810 回答