【问题标题】:Best way of creating a character variation algorithm. Creating a synonym table创建字符变化算法的最佳方法。创建同义词表
【发布时间】:2011-07-15 19:37:35
【问题描述】:

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

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

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

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

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

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

谢谢!

【问题讨论】:

  • 这听起来是一个非常糟糕的解决问题的方法。如果 ID 错误,我宁愿验证用户输入并抛出一条消息。为用户提供用于选择部件 ID 的其他工具(下拉列表、按名称查找等)也会有所帮助。
  • 他们可能会使用它来建议正确的部分,所以我可以看到该功能的用途,但不确定存储所有变体是否明智。是要考虑字符插入和删除,还是只考虑字符替换?
  • 如何进行搜索,根据可用的真实代码对输入进行评分并返回最佳(甚至显示最接近的匹配)。
  • 按照 Jon 的思路,编写一个自定义类型的 Soundex 函数将相似字符折叠成单个字符怎么样。然后您可以存储一个“Lookex”代码。计算用户输入的 Lookex 并在该代码上搜索会很容易。
  • 需要考虑的事情 - 如果 O,0,Q 被认为是可替代的,而 1,L,I 被认为是可替代的,那么产品 QIOL-OOL 将有数千(2187)个排列,你必须商店。

标签: c# sql algorithm variations


【解决方案1】:

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

即以您为例:

原文:

GRL8-001

正则表达式:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        现在输入: GRL8-OO1

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

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

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

        Levenshtein available 有几种 T-SQL 实现

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-22
          • 2011-02-13
          • 2011-04-28
          • 1970-01-01
          • 2023-03-23
          • 2015-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多