在列表中的术语上使用列文施泰因距离合并 2 个列表



下午好,

我希望我能从某人那里得到帮助。如果不是一些示例代码,那么我应该朝着这个方向前进。

从本质上讲,我有两个字符串术语和 ID 的大型列表(每个大约 10-20,000 条记录)。这些列表来自两个不同的数据提供程序。这些列表显然在主题上彼此相关,但是每个数据提供程序的术语命名约定略有不同。例如,list1 将具有术语"术语(某些子类别)">,列表 2 将具有"术语 - 某个子类别"。此外,list1 可以有"术语(某些子类别)"和"术语(某些子类别 2)">,而列表 2 只有"术语 - 某些子类别"。

这两个列表都具有以下属性 - "term"和"id"。我需要做的是比较两个列表中的每个术语,如果找到合理的匹配,则生成一个包含"term","list1id","list2id"属性的新列表。如果没有找到一个术语的匹配项,我还需要将其添加到列表中,并带有"list1id"或"list2id"空/空白(这将指示不匹配术语的来源)。

我愿意给我们一个NuGet包来积累这个,或者如果有人有一个我需要的很好的例子,那也会有所帮助。从本质上讲,我正在尝试根据每个术语中的模糊术语生成一个新的合并列表,同时以某种方式保留匹配术语的 ID。

我的研究挖掘了一些类似的文章和来源,如 https://matthewgladney.com/blog/data-science/using-levenshtein-distance-in-csharp-to-associate-lists-of-terms/和 https://github.com/wolfgarbe/symspell,但似乎都不符合我的需求。

我该何去何从?任何帮助都会很棒!

掘金

你的问题很宽泛,但我会尝试一个广泛的答案,至少,让你开始。 我以前做过这种事情。

分两个阶段进行:首先规范化,然后匹配。 通过这样做,您可以消除已知但不相关的差异原因。例如,通过规范化,使所有内容都大写,删除空格,删除非字母数字字符等。 你需要有一点创造力,并在你可能遇到的任何限制下工作("艾米(小马)"和"艾米小马"是一回事吗? 然后计算 距离。

创建一个具有几个属性的类,以包含左侧列表中的值、右侧列表中的值、规范化值、分数等。

获得匹配项后,创建该类的实例,将其添加到列表或等效项,从原始列表中删除旧值,然后继续。

尝试编写代码,以便跟踪中间值(例如规范化值等)。 这将使调试更容易,并允许您在完成处理记录所有内容。

完成后,您可以丢弃中间值,只保留您标识为匹配项的内容。

最新更新