Как нечетко сопоставить только соседние ячейки?

У меня есть строка из 10 000 имен в двух соответствующих столбцах, по 10 000 в каждом. Каждая ячейка в столбце A соответствует соседней ячейке в столбце B. Я хочу провести нечеткое сопоставление и получить оценку совместимости для всех из них только с соседней ячейкой. Я не хочу, чтобы он выполнял поиск по всему столбцу по сравнению с целым столбцом, только по соседним ячейкам, что я, похоже, не могу сделать с помощью надстройки Excel Fuzzy Match, идеи?

Пример:

Column A:       Column B:        Value:
Apple           Aplle            80%
Banana          Banana           100%
Orange          Ornge            85%   

person Seamus    schedule 20.11.2015    source источник
comment
Как вы хотите, чтобы рассчитывались значения в третьем столбце ??   -  person Gary's Student    schedule 20.11.2015
comment
Привет, я просто хочу получить оценку уверенности в том, насколько похожи имена? Некоторые из них могут полностью совпадать, другие могут быть совершенно разными. Точно так же, как инструмент «Нечеткое совпадение», но я не думаю, что могу настроить его только для соседних ячеек, он рассчитывает только столбец по сравнению с столбцом. Спасибо!   -  person Seamus    schedule 20.11.2015
comment
Это было бы довольно запутанно с формулами; для решения, отличного от vba, вероятно, потребуется количество вспомогательных столбцов, равное максимальному количеству сравниваемых букв. Сомневаюсь, что это то, что вы ищете. Проблема в том, что вы хотите, чтобы Apple отображала только одну букву, когда 'p' изменена на 'l', но вы хотите, чтобы Orange отображался как только одна буква, когда отсутствует буква [я считаю, что это просто расстояние Левенштейна ]. С помощью формул Excel трудно показать, что оранжевый - это не 4 буквы, отличающиеся друг от друга, если просто сравнить их по буквам.   -  person Grade 'Eh' Bacon    schedule 20.11.2015


Ответы (1)


Что ж, я не знаю о надстройке Fuzzy Match, но вы можете выполнить то же самое, что и ваши требования, с помощью UDF.

Что-то вроде этого на основе ваших данных образца

Function FuzzyComparision(String1 As String, String2 As String) As Double
Dim intStringLength As Integer
Dim dblScore As Double
Dim dblUnitScore As Double
Dim intCounter As Integer

intStringLength = WorksheetFunction.Max(Len(String1), Len(String2))
dblUnitScore = 1 / intStringLength
dblScore = 0#

For intCounter = 1 To intStringLength
    If Mid(UCase(String1), intCounter, 1) = Mid(UCase(String2), intCounter, 1) Then
        dblScore = dblScore + dblUnitScore
    Else
        If Len(String1) <> Len(String2) And intCounter < intStringLength Then
            If Mid(UCase(String1), intCounter + 1, 1) = Mid(UCase(String2), intCounter, 1) Then
                dblScore = dblScore + dblUnitScore
            End If
        End If
    End If
Next

FuzzyComparision = dblScore
End Function

Конечно, при необходимости сравнение может быть импровизировано. Сообщите мне, если это поможет

Изменить: как указал Grade Bacon (спасибо за это наблюдение), это не работает должным образом для отсутствующих букв. Я немного изменил функцию, чтобы проводить сравнение без учета регистра и компенсировать пропущенные буквы, как в примере.

Несмотря на то, что это работает, полезность зависит от допустимого отклонения оценок +/-. OP может пролить свет.

person PankajR    schedule 20.11.2015
comment
Отлично работает. +1 за качество и усилия. - person SQL Police; 20.11.2015
comment
Действительно ли это работает для случая, когда из одного слова удаляется буква? См. Его Апельсин выше - он показывает, что из 100% предполагается «убрать» только 1 букву. По вашему методу не будет ли учитываться 4 разницы, начиная с пропущенной буквы? - person Grade 'Eh' Bacon; 20.11.2015