2016-07-26 138 views
0

我有列x其中有一个字符串ABN-AMRO-NV/SUNTRUST-BK/WACHOVIA和列y其中有一个字符串SunTrust Banks。正如你所看到的,第x列有三个字符串,它们之间用斜杠分隔。所以,我不得不使用strsplit拆分模糊匹配之前的字符串。为了做模糊匹配,我尝试了诸如stringdist,adist,agrep等软件包。但是我没有像我期望的那样得到好的结果。模糊字符串匹配使用R

那么,应该怎样解决我的匹配问题呢?我如何处理这个匹配问题以获得好的结果?正如您在示例中看到的,SunTrust Banks与我期望的词SUNTRUST-BK匹配,使用模糊匹配。

此外,为了提供说明,我在第x列和y列中的字符串会有很大差异。例如,x列中的字符串有时不会有正斜杠,意味着只有一个字符串。

谢谢大家的帮助和指导。

+0

“没有我期望的那么好”有多好?另外,你是否总是在一个小的选择中有一场比赛?对于示例情况,几乎每个简单的方法都应该能够将中间选项标识为最佳匹配。 (包括上述使用levenshtein距离的'agrep')。 –

+0

对不起,如果它看起来模糊。我的意思是我尝试了不同的最大值。使用匹配包的距离。设定的最大值距离为少数字符串工作,但不为休息。我的列'x'非常大,字符串变化很大。 – Santosh

+0

也许你应该包括你的方法失败的典型例子(而不是一个已经成功的例子)。尤其是你觉得不应该失败的例子。 - 如果你很幸运,考虑这些例子可能已经给你一些关于如何解决问题的想法! –

回答

1

看看下面的例子。我只是使用了一个随机匹配的方法(在这里是JaroWinkler)。

library(stringdist) 

fuzzy_select<-function(name_vec,name){ 
    Filter(function(x) ain(x, name, maxDist=.7, method="jw"), 
     strsplit(name_vec, "/")[[1]]) 
} 

fuzzy_select("ABN-AMRO-NV/SUNTRUST-BK/WACHOVIA", "SunTrust Banks") 

正如你所看到的maxDist必须是为了找到SUNTRUST-BKSunTrust Banks之间的匹配相当高。可能您希望在匹配之前进行一些预处理(例如,转换为小写,删除标点符号)。

+0

谢谢。结果不是'SUNTRUST-BK',我该如何返回'SunTrust Banks'。我颠倒了'ain'的顺序,但似乎并不奏效。 – Santosh