Наиболее подходящая функция для сопоставления строк - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь найти наиболее подходящий метод (который я мог бы использовать в VBA), чтобы сравнить тысячи записей из столбца A с данными в столбце B.

Можно увидеть пример данных ниже:

Column1                                Column2
Modra Digest (DC)                      Oldstewart2
South West Local /Sunday Times (new)   Oldstewart
OldStewart political print             Saigon Last month Saigon Last month
Oldstewart2 Local print (Former)       Modra Digest Velehrad Digest (used via Bembek) 
Saigon Last month                      South West Local South West Local /Sunday Times

Вот как выглядит таблица в Excel:

So far, I have tried the Fuzzy lookup (Excel add in) but it doesn't do the job exactly right. I have also tried the Levenshtein Distance method, which seems to work relatively fine once few tweaks are implemented (trim, removal of brackets, de-duplication of words in the string), however, the challenge appears when there is only one matching word in the string (despite it being a "keyword" - please see the "oldstewart" example above), as this method compares the number of changes that need to take place (edit, deletion, replacement etc.) in order to match a string to one another.

The desired result would ideally look somewhat like this, as you can see the matching percentage is lower for the above mentioned examples due to stipulated reasons. (Sorry about the pics, but I am struggling post the table in the same structure as I managed in the original post.*)

The desired output:

Сопоставление строк в VBA с использованием предопределенной функции .

Любые советы относительно методологии и т. Д. c. высоко ценится - так как кто-то мог иметь дело с чем-то подобным в прошлом.

Большое спасибо за вашу помощь!

1 Ответ

2 голосов
/ 12 июля 2020

Я мало что знаю об этом c, но нечеткое сопоставление в Power Query с порогом 0.50 с последующим удалением дубликатов, похоже, работает для вашего примера данных. Может потребоваться некоторая настройка ваших реальных данных.

  • Сделайте два столбца двумя разными таблицами

  • Data / Get & Преобразовать / Из таблицы / Диапазон для каждой таблицы

  • Затем в пользовательском интерфейсе PQ выберите Merge Queries

    • Я выбрал Left OuterJoin
    • Использовать нечеткое соответствие
    • Порог 0,5
  • Выберите первый столбец и Remove Duplicates

Все вышеперечисленных шагов можно выполнить из пользовательского интерфейса Power Query

Результаты

введите описание изображения здесь

Вы также можете сделать это, преобразовав два столбца в одну таблицу и введя приведенный ниже код в расширенный редактор:

Код разделяет таблицу на две таблицы, а затем использует метод FuzzyJoin / Remove Duplicates для их объединения.

let
    Source = Excel.CurrentWorkbook(){[Name="Table10"]}[Content],
    tbl1 = Table.FromList(Source[Column1], Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Changed Type1" = Table.TransformColumnTypes(tbl1,{{"Column1", type text}}),
        tbl2 = Table.FromList(Source[Column2], Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Changed Type" = Table.TransformColumnTypes(tbl2,{{"Column1", type text}}),
        tbl3 = Table.FuzzyNestedJoin(#"Changed Type1","Column1",#"Changed Type","Column1","Matched",JoinKind.LeftOuter,
            [IgnoreCase = true, IgnoreSpace= false, Threshold = 0.5]),
    #"Expanded Matched" = Table.ExpandTableColumn(tbl3, "Matched", {"Column1"}, {"Matched"}),
    #"Removed Duplicates" = Table.Distinct(#"Expanded Matched", {"Column1"})
in
    #"Removed Duplicates"
...