Страницы: 1
RSS
Поиск совпадений в двух ячейках, Поиск частичных совпадений между двумя ячейками
 
Всем доброго времени суток! Задача такая, что мне нужно увидеть, процент совпадений между двумя ячейками. К примеру, есть два столбца с ячейками. В одном столбце указан адрес типа "г. Москва, ул. Тургенева, 1", а в другой ячейке указан адрес типа "Россия, город Москва, 369669, улица Тургенева, дом 1" - информация одна и та же, но текст разный. В общем мне нужно сопоставить такие ячейки друг с другом. Понятно, что можно вручную искать по ключевым словам но таких ячеек оооочень много. ВПР и ПОИСКПОЗ также не вар.
По сути, данная задача является аналогом составления программы антиплагиат. Только объем данных здесь гораздо меньше.
Буду благодарен за помощь :)
 
Приветствую.
Попробуйте тут почитать.
Кому решение нужно - тот пример и рисует.
 
Ещё можно почитать тут
 
Цитата
Артур Артур написал:
В одном столбце указан адрес типа "г. Москва, ул. Тургенева, 1", а в другой ячейке указан адрес типа "Россия, город Москва, 369669, улица Тургенева, дом 1"
Кстати, а какой по Вашему мнению, процент совпадения в этом примере
 
Артур Артур, здравствуйте
Это задача для нечёткого поиска. В общем смысле нужно упростить обе строки, удалив незначительные символы так, чтобы после этого удаления они совпали. В вашем примере нужно оставить только "Москва Тургенева 1"
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Если не помогли советы выше, то можно пользовательской функцией, будет искать только точное совпадение. Если делать нечёткий поиск то слишком много условий нужно учитывать это в платную ветку
Код
Function СОПОСТАВЛЕНИЕ(txt1 As String, txt2 As String)
    Dim arr1, arr2, str1$, str2$, i&
    Set dic = CreateObject("Scripting.Dictionary")
    Set RegExp = CreateObject("VBScript.RegExp")
    RegExp.Global = True
    RegExp.IgnoreCase = True
    str1 = Replace_symbols(Trim(txt1))
    arr1 = Split(str1, " ")
    For i = LBound(arr1) To UBound(arr1)
        If Not dic.exists(arr1(i)) Then dic.Add CStr(arr1(i)), CStr(arr1(i))
    Next
    str1 = " " & Join(dic.Items, " | ") & " "
    dic.RemoveAll
    str2 = Replace_symbols(Trim(txt2))
    arr2 = Split(str2, " ")
    For i = LBound(arr2) To UBound(arr2)
        If Not dic.exists(arr2(i)) Then dic.Add CStr(arr2(i)), CStr(arr2(i))
    Next
    str2 = " " & Join(dic.Items, "  ") & " "
    dic.RemoveAll
    RegExp.Pattern = str1
    For i = 0 To RegExp.Execute(str2).Count - 1
        dic.Add Trim(CStr(RegExp.Execute(str2).Item(i).Value)), Trim(CStr(RegExp.Execute(str2).Item(i).Value))
    Next
    СОПОСТАВЛЕНИЕ = Join(dic.Items, "; ")
End Function

Function Replace_symbols(ByVal txt As String) As String
    Dim st$, i&
    st$ = ",.\/<>?^*:|`'"""
    For i& = 1 To Len(st$)
        txt = Replace(txt, Mid(st$, i&, 1), " ")
    Next i&
    Do
        txt = Replace(txt, "  ", " ")
    Loop While InStr(txt, "  ") > 0
    Replace_symbols = Trim(txt)
End Function

PS: Выводит совпадения, а проценты считайте сами
Изменено: Msi2102 - 07.04.2022 13:39:58
 
Неточный поиск (Fuzzy Lookup). Метод перестановки слов местами
Нечёткий поиск / Fuzzy Lookup: как повторить или подключиться через VBA
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
написал:
PS: Выводит совпадения, а проценты считайте сами

Прикрепленные файлы
Книга1.xlsm  (16.56 КБ)
Спасибо большое вам!!  
Страницы: 1
Наверх