2016-06-14 56 views
3

什麼是從列表中刪除相似字符串的有效方法?如何從列表中刪除相似的字符串?

考慮一個List<string>由這些(和其他)的字符串:

「SRS投資管理,LLC」

「SRS投資管理」

「Maplelane資本有限公司」

「Maplelane資本有限公司」

所以我需要做的是去除那些「足夠相似」的字符串。我的想法是,這應該通過大寫列表中的所有字符串來完成,然後刪除除了另一個字符串的最後一個X字符之外的所有匹配的字符串。最後,我希望這給我留下一個列表,其中包含他們實際代表的每個現實生活中的公司只有一個字符串。

關於我如何實現這一點的任何想法?

+3

您應該使用字符串的Levenshtein距離來測量它們的接近程度,並在某個閾值下刪除任何字符串。如果你想結束導致某種全局最小值的字符串,你可能想要做一些奇特的工作。這聽起來並不重要。 – Jashaszun

+0

列表中有多少項(大約)? – spender

+2

您是否保證列表中的所有名稱都具有從標準美式英語26字母表中抽取的表示形式?例如,如果您需要將「蘇黎世金融服務」與「蘇黎世金融服務有限公司」相匹配,那麼您的手中就會遇到更難的問題。這些字符串在第二個字符中不匹配。 –

回答

1

我建議你創建一個IEqualityComparer來封裝邏輯來確定兩個字符串是否相等。

如果你想混搭的SoundEx和萊文斯坦可能是這樣的

public class CompanyNameComparer : IEqualityComparer<string> 
{ 

    public bool Equals(string x, string y) 
    { 
     if (x == null && y == null) 
     { 
      return true; 
     } 
     if (x == null || y == null) 
     { 
      return false; 
     } 

     var src1 = FormatString(x); 
     var src2 = FormatString(y); 

     if (src1 == src2) 
     { 
      return true; 
     } 

     var difference = CalcLevenshteinDistance(src1, src2); 

     // arbitrary number you will need to find what works 
     return difference < 7; 
    } 

    private string FormatString(string source) 
    { 
     return source.Trim().ToUpper(); 
    } 

    // code taken from http://stackoverflow.com/a/9453762/1798889 
    private int CalcLevenshteinDistance(string a, string b) 
    { 
     // code not included 
    } 

    public int GetHashCode(string obj) 
    { 
     return Soundex(obj).GetHashCode(); 
    } 

    private string Soundex(string data) 
    { 
     // code not included 
    } 
} 

我並沒有包括所有的代碼,因爲這不是主要問題的一個例子。只有你會知道SoundEx和Levenshtein是否會起作用,或者它是否需要成爲別的東西。但是如果你把這個決策放在自己的課堂上,如果需要調整的話,它只是一個需要改變的地方。

然後,您可以使用Linq或HashSet獲取唯一列表。假設數據是列表中變量的名稱

var uniqueEnumerable = data.Distinct(new CompanyNameComparer()); 
var uniqueSet = new HashSet<string>(data, new CompanyNameComparer()); 
2

您可以從創建一個例程開始,用整個單詞替換明顯的縮寫,然後刪除空格。好消息是公司房子對公司名稱有嚴格的規定。例如,如果'Band C Ltd'已經存在,你就不能有一家名爲'B & C Ltd'的公司。 之後,您將需要開始考慮匹配算法,例如Levenshteins和Soundex。

+0

我嘗試過替換縮寫等,它似乎工作,雖然替換的東西列表得到廣泛..我認爲這是一個很好的起點,在使用@CharlesNRice提出的解決方案之前 –

+0

如果它是你想匹配的公司名稱,你需要非常小心的算法。我們花了數年時間開發我們的商業配對軟件,每個客戶都有不同的要求。我最好的建議就是繼續觀察結果,直到找到一個能夠爲個別項目取得適當平衡的方法。 – JonnyCab