需要算法在比较字符串列表时查找最高匹配

时间:2013-11-18 03:54:41

标签: c# regex algorithm pattern-matching string-matching

我有一个从excel表导入列的函数,然后我将列名放入列表中。

我有一个“系统列”列表,导入的列最终会映射到这些列。

用户稍后可以将这些列映射到任何系统列,但我希望通过智能地尝试将导入的列名称与最接近它的系统列名匹配来简化此过程。

例如

导入列后,我可能会有以下导入列列表:

List<string> importedColumnNames = importService.ResolveColumnNames();

Console.WriteLine(importedColumnNames[0]); //Prints 'Security_ID'
Console.WriteLine(importedColumnNames[1]); //Prints 'User_ID'
Console.WriteLine(importedColumnNames[2]); //Prints 'Date'

* 注意 *写入控制台的代码只是为了显示一些示例导入的列名称。

此外,系统列名的代码可能如下:

List<string> systemColumnNames = GetSystemColumnNames();

Console.WriteLine(systemColumnNames[0]); //Prints 'Security Identifier' or 'Security ID'
Console.WriteLine(systemColumnNames[1]); //Prints 'User' or 'User Identifier'
Console.WriteLine(systemColumnNames[2]); //Prints 'Item Date' or 'Datetime'

一旦导入了这些内容,我希望能够找到一种方法来匹配使用最接近的匹配系统列名值的importedColumnNames。

Dictionary<string,string> matchedImportedColumns = MatchService.Match(importedColumnNames,systemColumnNames);

foreach(var item in matchedImportedColumns)
{
   Console.WriteLine("Imported Value '{0}' was matched to System Value '{1}',item.Key,item.Value);
} 

这有望打印如下内容:

Imported Value 'Security ID' was matched to System Value 'Security Identifier'
Imported Value 'User ID' was matched to System Value 'User'
Imported Value 'Date' was matched to System Value 'Item Date'

还有一点需要注意,我希望有一个问题是,是否要使其区分大小写。我希望这可能是我在运行时可以做的事情,只需传入一个布尔标志,表示是否匹配使用区分大小写。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

我想你的情况最简单的事情就是(最好不要破坏机器学习)将它们分成单词(空格和下划线,可能是从低到大的过渡),小写它们,找到查询与每个候选项之间的集合交集的大小,并返回具有最大交集的候选项。您可以通过执行您观察到的常见替换来改进它,例如“ID” - &gt; “标识符”(在查询和候选集上)。

如果你需要进行一个内射的set-to-set匹配,那么你需要做一些动态编程来找到最好的非冲突匹配集,而不是仅按顺序进行并将最佳映射映射到每个匹配。