簡體   English   中英

C#比較字符串和縮寫

[英]C# Comparing strings to abbreviations

我正在嘗試將完整字符串與其縮寫版本進行比較,並根據其相似性返回分數。

這是一個例子:

Quarta Vara Civel Santana de Parnaiba

以及可能的縮寫

Qta VC Sta Parnaiba

QVC Sta Pba

4 VC Sta Parnaiba

我嘗試使用FuzzyStrings dll來執行此操作,但是當涉及第二個和第三個示例的嚴重縮寫時,它不能很好地工作。

關於如何處理此問題的任何想法?

使用此答案中的Jaro-Winkler距離類,該類優先考慮匹配的前綴,並將每個縮寫成分與短語單詞進行比較(選擇最大匹配項以補償跳過的單詞),我們可以編寫以下擴展名:

public static class StringExt {
    public static double JaroWinklerDistance(this string s1, string s2) => JaroWinkler.proximity(s1, s2);

    private static Regex AbbrevSplitRE = new Regex(@" |(?=\p{Lu})", RegexOptions.Compiled);
    public static double AbbrevSimilarity(this string abbrev, string phrase) {
        var phraseWords = phrase.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
        return AbbrevSplitRE.Split(abbrev)
                            .Where(aw => !String.IsNullOrEmpty(aw))
                            .Zip(Enumerable.Range(0, phraseWords.Length),
                                 (aw, pwp) => Enumerable.Range(pwp, phraseWords.Length-pwp).Select(n => aw.JaroWinklerDistance(phraseWords[n])).Max()
                            )
                            .Sum() / phraseWords.Length;
    }    
}

注意:正則表達式在每個空格或大寫字母處定義縮寫成分。

然后,我們可以將每個縮寫(以abbrevsabbrevs )與原始phrase

var ans = abbrevs.Select(Abbrev => new { Abbrev, Similarity = Abbrev.AbbrevSimilarity(phrase) });

對於您的示例,我得到以下答案:

      Abbrev        |     Similarity
Qta VC Sta Parnaiba | 0.65001322751322754
Q V C Sta Pba       | 0.60371693121693126
4 VC Sta Parnaiba   | 0.53890211640211649

根據我的最終目的,我可能會為較短的縮寫添加權重。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM