提问者:小点点

按单词匹配搜索重复项


我在列表中有这样的数据:

Microsoft Ltd
Microsoft
Google Inc
Amazon Ltd.
Amazon Ltd.
DropBox Corporation Ltd.
DropBox Corporation

我当前的解决方案能够检测到完全匹配的重复项。因此,它当前将输出:

Amazon Ltd.
Amazon Ltd.

我想增加一些可能性,以便它们也在输出列表中:

Microsoft Ltd
Microsoft
Amazon Ltd.
Amazon Ltd.
DropBox Corporation Ltd.
DropBox Corporation

下面是我当前的代码:

var dups = companyList.AsEnumerable()
.Where(g => !string.IsNullOrWhiteSpace(g.Name))
.GroupBy(dr => dr.Name.Trim())
.Where(gr => gr.Count() > 1)
.SelectMany(g => g)
.OrderBy(c => c.Name)
.ToList();

我将非常感谢任何善意的建议,以导致实现这种检查的解决办法?我个人认为这里没有任何可能的合乎逻辑的解决办法?也许只是某种基于分数的Levenshtein距离计算和检测?如果这是不可能的,将是有益的,至少得到这些(匹配多个单词,例如两个):

DropBox Corporation Ltd.
DropBox Corporation

共1个答案

匿名用户

你可以通过删除标点符号和诸如“inc”、“corp”之类的单词(参见下面的部分示例),以及删除括号来完成一定数量的“规范化”,但最终这是一个非常困难的问题,因为(i)缩写;㈡地点说明(东部、北部、..);(iii)公司分类:它是一个子公司、一个分公司、一个特许经营商,还是一个单独的公司?

最终,一个同义词列表可能是最好的方法,再加上一些轻微的规范化,以去除常见的公司实体类型名称。

    private static string Clean(string corporation)
    {
        corporation = corporation.EndsWith("Inc") ? corporation.Substring(0, corporation.Length - 3) : corporation;
        return corporation
            .Replace(" LLC", "")
            .Replace(" S.A.", "")
            .Replace(" SA", "")
            .Replace(" S.L.", "")
            .Replace(" SL", "")
            .Replace("(1)", "")
            .Replace(" GmbH", "")
            .Replace("(UK) Ltd.", "")
            .Replace(" Limited", "")
            .Replace(" Corporation", "")
            .Replace(" Corp.", "")
            .Replace(" Corp ", " ")
            .Replace(" Ltd.", "")
            .Replace(" Ltd", "")
            .Replace(" Inc.", "")
            .Replace("(Pa)", "")
            .Replace(" Inc ", " ")
            .Replace(" Corporation", "")
            .Replace(", LLP.", "")
            .Replace(" N.V.", "").Trim();
    }