为同义词表创建字符变化算法
本文关键字:变化 算法 字符 创建 同义词 | 更新日期: 2023-09-27 18:02:08
我需要为客户创建一个变体/同义词表,客户需要确保如果有人输入了不正确的变量,我们可以返回正确的部分。
例如,如果我们的零件ID为GRX7-00C。当客户将此输入到零件表中时,他们希望自动创建一个变量表,该变量表将存储该产品可能存在的变量。比如GBX7-OOC(字母O代替数字0),或者如果他们有数字1,可以使用L或i。
如果我们有GRL8-OOI部分,我们可以在变化表中添加以下内容:
- GRI8-OOI
- GRL8-0OI
- GRL8-O0I
- GRL8-OOI
- 等等…
我目前对此有一个手动条目,但这些部分可能有大量的变化。所以,有没有人有一个好主意,我如何可以创建一个自动过程?
如何在c#和/或SQL中做到这一点?
我不是c#程序员,但对于其他。net语言,创建一个类似的字符列表对我来说更有意义,并将它们组合在一起,并使用RegEx来评估它是否匹配。
。例如:
原始: GRL8-001
Regex-ploded:
GR(l|L|1)(8|b|B)-(0|o|O)(0|o|O)(1|l|L)
您可以通过拥有一个可互换字符表并运行replace函数来自动为该字符替换RegEx来实现这一点。
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个)。这将消耗最小的空间,并且使用单个索引非常快,并且计算成本也很低。
对于上面的输入,我要做的不是存储同义词表,而是根据主字典检查一组规则。例如,如果用户键入的值在字典中找不到,将0更改为0,并检查字典中是否存在该值。将GR更改为GB并检查是否如此。等。上面所描述的他们想要允许的所有变化都可以解释为您可以一次应用一个或组合应用的规则,并检查结果条目是否存在。这样你就不需要维护和更新大量的同义词字典了。
我根本不会走同义词路线。
我将使用标准规则集清理数据库中的所有值。
对于存在的每个值,将所有的'0'替换为'O',去掉破折号等,以便对于每个实际值,您只有一个修改值并将其存储在单独的字段'表中。
那么我将以同样的方式清理输入,并进行两部分匹配。根据实际数据库值检查实际输入字符串(这将获得精确匹配),然后根据已清理的值检查已清理的输入。然后使用距离计算(如Levenshtein distance)对实际数据库值排序输出,以获得最可能的匹配。
现在输入:GRL8-OO1
的部分:GRL8-00I,GRL8-OOI
这些都将归一化为相同的值GRL8OOI,尽管距离匹配将更接近GRL8-OOI,因此这将是您最接近的赌注。
当然这大大降低了你的零件号的"唯一性",但是两部分匹配和Levenshtein的组合应该得到你正在寻找的东西。
Levenshtein有几个可用的T-SQL实现