Соответствие строк между двумя столбцами, чтобы получить точное или частичное соответствие - PullRequest
0 голосов
/ 10 марта 2020

У меня проблема с написанием запроса в степени bi для частичного или полного соответствия двух строк. В дополнение к этому я пытаюсь вычислить процент совпадений, если он найден, и помещаю результаты в новый столбец.

Фактический набор данных содержит много строк и таблиц, но ради этого примера я используя только 4 столбца.

столбцы «ID» и «текст» идентифицируются однозначно. «KI ID» и «KI Test» также уникальны, но они не связаны со столбцами «ID» и «Текст» только в случае совпадения.

Мне необходимо реализовать следующее:

Я бы хотел сопоставить ввод каждой строки в столбце «Текст» с каждой строкой в ​​столбце «Текст KI». Если есть совпадение, я хотел бы знать «KI ID» и процент совпадений. Взгляните на набор данных для лучшего понимания.

ps: Это действительно достижимо с помощью мощного запроса или это просто фантазия, потому что, с моей точки зрения, я направляюсь к машинному обучению Я думаю?

Набор данных https://drive.google.com/open?id=1JrsxPa6DICNi5N-tI5ESukh62W_uedaQ

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

Расчет совпадения основан на количество слов, встречающихся в обоих столбцах: «Текст» и «Текст KI». например, если одна из строк в столбце «Текст» содержит два предложения, и эти предложения частично совпадают с одной из строк «Текст KI», в которой всего около 6 предложений. Совпадение между строками частично, поэтому в основном оно должно рассчитываться как 2/6, что соответствует 33,3% совпадению.

Кроме того, в столбце «KI Text» содержится множество строк, которые могут сносно соответствовать с одной из строк столбца «Текст». Только если он больше или равен 80%, он должен показывать результаты, иначе это не интересно.

1 Ответ

0 голосов
/ 29 марта 2020

Надеюсь, это то, что вы ищете, или, по крайней мере, приближает вас к ответу.

Хотя я полагаю, что ваши данные ID / Text и KI ID / KI Text, скорее всего, поступают из двух разных таблицы, вы представили их в одной электронной таблице как набор данных , поэтому я начал с этого. Единственный доступный мне контент в вашей электронной таблице - Sheet2. Я просто скопировал и вставил содержимое Sheet2 вашей электронной таблицы в свою собственную таблицу в Excel. Затем я использовал имя таблицы по умолчанию для Table1, чтобы обратиться к ней. Я привел его так же, как вы его представили:

enter image description here

Затем, все еще работая в рамках того же запроса, я разделил его на две новые таблицы: идентификатор таблица и таблица идентификаторов KI. Вы можете создать первую таблицу, выбрав существующие столбцы идентификатора и текста, затем выберите «Главная»> «Удалить столбцы»> «Удалить другие столбцы»; но чтобы создать вторую таблицу, вам нужно использовать панель формул.

enter image description here

Прежде чем создать вторую таблицу, я добавил столбец в первую таблицу (таблицу идентификаторов) с номером 1 в каждой строке. Я назвал этот столбец ID Key Key.

enter image description here

Затем я скопировал формулу первой таблицы из примененного шага, где я ее создал, чтобы использовать ее в панель формул для создания второй таблицы для идентификатора KI. Я отредактировал его, изменив имена столбцов в соответствии с идентификатором KI:

enter image description here

Затем я добавил столбец с номером 1 в каждой строке ко второму. таблица (таблица идентификаторов KI). Я назвал этот столбец KI ID Key Match.

enter image description here

Затем я выполнил полное внешнее слияние двух только что созданных таблиц - идентификатора и таблицы идентификаторов KI. Для этого я сначала использовал Home> Merge Queries и слил Table1 с собой. (Какой столбец использовать для совпадения не имеет значения, потому что он временный.) Я выбрал Full Outer в качестве вида соединения. Когда слияние было завершено, я отредактировал слияние на панели формул, чтобы изменить таблицы на # «Добавленный ключ совпадения идентификатора» и # «Добавленный ключ совпадения идентификатора KI» (которые являются именами этих двух «таблиц»). после того, как я их создал и добавил их ключи соответствия для использования в этом слиянии) и соответствующие поля соответствия для «ID Match Key» и «KI ID Match Key»:

enter image description here

После объединения я расширил результирующий столбец:

enter image description here

Затем я заменил все пустые значения в столбцах «Текст» и «Текст KI» на пустой текст, выбрав оба столбца (щелкнув один столбец, затем нажав и удерживая клавишу Ctrl), затем щелкните «Преобразование»> «Заменить значения»> введите «null» в поле «Значение для поиска», оставьте поле «Заменить на» пустым и нажмите кнопку «ОК».

Затем я добавил столбцы, чтобы разбить каждый из ячеек столбцов Текст и KI Текст на списки их слов. Перед каждым разделением я сначала отфильтровал все, кроме строчных и прописных букв от a до z, чисел от 0 до 9, пробелов и знаков равенства. Я использовал Text.SplitAny для разделения слов в любых пробелах или знаках равенства:

enter image description here

enter image description here

Затем я добавил столбец и определил, какие слова из текста были в KI Text. Я использовал List.Intersect, чтобы сделать это. В нем перечислены дубликаты, что я и хотел:

enter image description here

Затем я добавил столбец и сделал обратное - определил, какие слова из KI Text были в тексте. Я снова использовал List.Intersect:

enter image description here

Затем я собрал информацию о количестве. Я создал новый столбец с подсчетом количества слов (всех вхождений) в каждом из списков, которые я создал. Я делал это один раз для текста, текста KI, текста в тексте KI и текста в тексте KI. Я просто использовал List.Count, чтобы сделать это. На самом деле в этом не было необходимости делать отдельные шаги с отдельными столбцами. Я просто сделал это, чтобы ясно увидеть цифры. Код М, который я создал в двух столбцах, следующих за этими четырьмя столбцами, не использует эти четыре столбца. Я также сделал подсчет в следующих двух столбцах:

enter image description here

Затем я создал два новых столбца для расчета% текста в тексте KI и % KI текста в тексте. Я использовал эти базовые c формулы (представленные здесь, надеюсь, в ясном английском sh, в отличие от кода М):

  • % Текст в тексте KI = (Количество слов из текста, которые в KI Text / Количество слов в KI Text) * 100
  • % KI Text in Text = (Количество слов из KI Text, находящихся в тексте / Количество слов в тексте) * 100

    Обязательно проверьте мою математику.

enter image description here

Наконец, я удалил все столбцы, которые мне больше не нужны.

enter image description here

После первых трех комментариев я добавил несколько шагов в свой запрос, чтобы получить это:

enter image description here

Вот код M с изменениями, которые я сделал после ваших трех комментариев . Смотрите мои комментарии для большего контекста .:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", type text}, {"Text", type text}, {"KI ID", type text}, {"KI Text", type text}, {"Outcome", type text}}),
    #"Made ID Table" = Table.SelectColumns(#"Changed Type",{"ID", "Text"}),
    #"Added ID Match Key" = Table.AddColumn(#"Made ID Table", "ID Match Key", each 1),
    #"Made KI ID Table" = Table.SelectColumns(#"Changed Type",{"KI ID", "KI Text"}),
    #"Added KI ID Match Key" = Table.AddColumn(#"Made KI ID Table", "KI ID Match Key", each 1),
    #"Merged Queries" = Table.NestedJoin(#"Added ID Match Key", {"ID Match Key"}, #"Added KI ID Match Key", {"KI ID Match Key"}, "KI Table", JoinKind.FullOuter),
    #"Expanded KI Table" = Table.ExpandTableColumn(#"Merged Queries", "KI Table", {"KI ID Match Key", "KI ID", "KI Text"}, {"KI ID Match Key", "KI ID", "KI Text"}),
    #"Replaced Value" = Table.ReplaceValue(#"Expanded KI Table",null,"",Replacer.ReplaceValue,{"Text", "KI Text"}),
    #"Split Text to List" = Table.AddColumn(#"Replaced Value", "Text Listed", each Text.SplitAny(Text.Select([Text],{"a".."z","A".."Z","0".."9"," ","="})," =")),
    #"Split KI Text to List" = Table.AddColumn(#"Split Text to List", "KI Text Listed", each Text.SplitAny(Text.Select([KI Text],{"a".."z","A".."Z","0".."9"," ","="})," =")),
    #"Got Text in KI Text" = Table.AddColumn(#"Split KI Text to List", "Text in KI Text", each List.Intersect({[KI Text Listed],[Text Listed]})),
    #"Got KI Text in Text" = Table.AddColumn(#"Got Text in KI Text", "KI Text in Text", each List.Intersect({[Text Listed], [KI Text Listed]})),
    //You don't actually need the next four lines. I included them so you can see the numbers in the table. They are calculated in the two #"Calculated..." lines below.
    //If you choose to remove them, you'll need to replace #"Got Count of KI Text in Text", in the first #"Calculated..." line, with #"Got KI Text in Text".
    #"Got Count of Text" = Table.AddColumn(#"Got KI Text in Text", "Text Count", each List.Count([Text Listed])),
    #"Got Count of KI Text" = Table.AddColumn(#"Got Count of Text", "KI Text Count", each List.Count([KI Text Listed])),
    #"Got Count of Text in KI Text" = Table.AddColumn(#"Got Count of KI Text", "Text in KI Text Count", each List.Count([Text in KI Text])),
    #"Got Count of KI Text in Text" = Table.AddColumn(#"Got Count of Text in KI Text", "KI Text in Text Count", each List.Count([KI Text in Text])),
    #"Calculated % Text in KI Text" = Table.AddColumn(#"Got Count of KI Text in Text", " % Text in KI Text", each Number.Round((List.Count([Text in KI Text])/List.Count([KI Text Listed]))*100, 2), type number),
    #"Calculated % KI Text in Text" = Table.AddColumn(#"Calculated % Text in KI Text", "% KI Text in Text", each Number.Round((List.Count([KI Text in Text])/List.Count([Text Listed]))*100, 2), type number),
    #"Removed Other Columns" = Table.SelectColumns(#"Calculated % KI Text in Text",{"ID", "Text", "KI ID", "KI Text", " % Text in KI Text", "% KI Text in Text"}),
    //
    //What follows is my edit after your three comments.
    #"Added Custom" = Table.AddColumn(#"Removed Other Columns", "Outcome", each Text.From([#" % Text in KI Text"]) & "% match with " & [KI ID]),
    #"Grouped Rows" = Table.Group(#"Added Custom", {"ID"}, {{"AllData", each _, type table [ID=text, Text=text, KI ID=text, KI Text=text, #" % Text in KI Text"=number, #"% KI Text in Text"=number, Outcome=text]}}),
    #"Added Custom1" = Table.AddColumn(#"Grouped Rows", "Text", each [AllData][Text]{0}),
    #"Added Custom2" = Table.AddColumn(#"Added Custom1", "Outcome", each [AllData][Outcome]),
    #"Extracted Values" = Table.TransformColumns(#"Added Custom2", {"Outcome", each Text.Combine(List.Transform(_, Text.From), "#(cr)"), type text}),
    #"Removed Other Columns1" = Table.SelectColumns(#"Extracted Values",{"ID", "Text", "Outcome"})
in
    #"Removed Other Columns1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...