基于相似性比较字符串



我有一组格式正确的电话号码:

string[] phoneNumbers = {"US +1 866 XXX XXXX",
                         "UK +44 (0)XXX XXX XXXX",
                         "Singapore +65 XXXX XXXX"
                        };

我作为输入获得的电话号码对应于列表中的这些项目之一,但它的格式略有不同。输入可以是这 3 个之一。请注意,不包括开头的国家/地区名称。

  • (866) 三十至三十
  • +44 (0) XXX XXXXXX
  • +65 XXXXXXXX

如您所见,我的输入格式与数组略有不同。

我的问题是,当我的输入格式不同时,从数组中提取正确格式化版本的数字的好方法是什么。

我不要求某人为我做这件事,因为我可以很好地完成代码。逻辑现在出于某种原因让我。

我想做的是一个并行电话号码数组,其中包含所有格式不正确的输入,并获取该数组中项目的索引并获取正确数组的相应输入。这看起来合乎逻辑吗?有没有更好、更快的方法?


编辑:

目前我正在完成这项工作:

                for(int i=0; i<phoneNumbers.Count(); i++)
                {
                    var tempDialInNumber = (from t in input //input from the user
                                            where char.IsDigit(t)
                                            select t).ToArray();
                    string tDialInNumber = new string(tempDialInNumber);
                    var tempDigitPhoneNumber = (from t in phoneNumbers.GetValue(i).ToString()
                                            where char.IsDigit(t)
                                            select t).ToArray();
                    string tDigitPhoneNumber = new string(tempDigitPhoneNumber);
                    if (tDigitPhoneNumber.Contains(tDialInNumber))
                    {
                        dialInNumber = phoneNumbers.GetValue(i).ToString(); 
                    }
                }
执行此操作

的规范方法是:

  1. 将数据转换为规范形式。
  2. 对规范形式进行愚蠢的比较。

我会尝试在 1 http://en.wikipedia.org/wiki/Levenshtein_distance 使用它。

根据错误率,我会通过对组中的字符串进行预分类来调整算法(您可以使用正则表达式生成字符串类)并将类内部与 Levenshtein 进行比较。

另一种方法是基于字符串模式创建一个 Bloom 过滤器,然后使用它来匹配您想要的字符串。我不确定它是否会更好地处理您的情况。

似乎如果您忽略"+"和括号以及前导 1 和空格,那么您将获得与国家/地区代码集的前导 2 或 3 位数字的匹配项。因此,您只需删除"+"和括号和空格以及前导"1"1,然后查看前导数字匹配的前导国家/地区代码,然后检查尾随数字的数量是否与您对该国家/地区的预期匹配(否则匹配的国家/地区为"未知")。请注意,如果国家/地区代码以"1"开头,则国家/地区的主要代码有两种可能的匹配项。此外,如果位数计数与美国位数匹配,并且某个国家/地区不匹配,则它是美国数字。然后,一旦您知道了国家/地区,您就可以将电话号码的数字放入该国家/地区的标准模板中,如果需要,可以将国家/地区的名称放在前面,并且您就完成了。

最新更新