2016-07-26 136 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