C # Сравнение строк с аббревиатурами - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь сравнить полную строку с ее сокращенной версией и вернуть оценку в соответствии с ее сходством.

Вот пример:

Quarta Vara Civel Santana de Parnaiba

И возможные сокращения

Qta VC Sta Parnaiba

Q V C Sta Pba

4 VC Sta Parnaiba

Я пытался использовать FuzzyStrings dll для этого, но когда дело доходит до серьезных сокращений, таких как второй и третий примеры, это не работает.

Есть идеи, как бороться с этой проблемой?

1 Ответ

0 голосов
/ 11 января 2019

Используя класс расстояния 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;
    }    
}

Примечание. Регулярное выражение определяет компоненты аббревиатуры в каждом пробеле или заглавной букве.

Затем мы можем сравнить каждую аббревиатуру (в abbrevs) с оригинальной 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

Я мог бы добавить вес для более коротких сокращений, в зависимости от моей конечной цели.

...