Надеюсь, это то, что вы ищете, или, по крайней мере, приближает вас к ответу.
Хотя я полагаю, что ваши данные ID / Text и KI ID / KI Text, скорее всего, поступают из двух разных таблицы, вы представили их в одной электронной таблице как набор данных , поэтому я начал с этого. Единственный доступный мне контент в вашей электронной таблице - Sheet2. Я просто скопировал и вставил содержимое Sheet2 вашей электронной таблицы в свою собственную таблицу в Excel. Затем я использовал имя таблицы по умолчанию для Table1, чтобы обратиться к ней. Я привел его так же, как вы его представили:
Затем, все еще работая в рамках того же запроса, я разделил его на две новые таблицы: идентификатор таблица и таблица идентификаторов KI. Вы можете создать первую таблицу, выбрав существующие столбцы идентификатора и текста, затем выберите «Главная»> «Удалить столбцы»> «Удалить другие столбцы»; но чтобы создать вторую таблицу, вам нужно использовать панель формул.
Прежде чем создать вторую таблицу, я добавил столбец в первую таблицу (таблицу идентификаторов) с номером 1 в каждой строке. Я назвал этот столбец ID Key Key.
Затем я скопировал формулу первой таблицы из примененного шага, где я ее создал, чтобы использовать ее в панель формул для создания второй таблицы для идентификатора KI. Я отредактировал его, изменив имена столбцов в соответствии с идентификатором KI:
Затем я добавил столбец с номером 1 в каждой строке ко второму. таблица (таблица идентификаторов KI). Я назвал этот столбец KI ID Key Match.
Затем я выполнил полное внешнее слияние двух только что созданных таблиц - идентификатора и таблицы идентификаторов KI. Для этого я сначала использовал Home> Merge Queries и слил Table1 с собой. (Какой столбец использовать для совпадения не имеет значения, потому что он временный.) Я выбрал Full Outer в качестве вида соединения. Когда слияние было завершено, я отредактировал слияние на панели формул, чтобы изменить таблицы на # «Добавленный ключ совпадения идентификатора» и # «Добавленный ключ совпадения идентификатора KI» (которые являются именами этих двух «таблиц»). после того, как я их создал и добавил их ключи соответствия для использования в этом слиянии) и соответствующие поля соответствия для «ID Match Key» и «KI ID Match Key»:
После объединения я расширил результирующий столбец:
Затем я заменил все пустые значения в столбцах «Текст» и «Текст KI» на пустой текст, выбрав оба столбца (щелкнув один столбец, затем нажав и удерживая клавишу Ctrl), затем щелкните «Преобразование»> «Заменить значения»> введите «null» в поле «Значение для поиска», оставьте поле «Заменить на» пустым и нажмите кнопку «ОК».
Затем я добавил столбцы, чтобы разбить каждый из ячеек столбцов Текст и KI Текст на списки их слов. Перед каждым разделением я сначала отфильтровал все, кроме строчных и прописных букв от a до z, чисел от 0 до 9, пробелов и знаков равенства. Я использовал Text.SplitAny для разделения слов в любых пробелах или знаках равенства:
Затем я добавил столбец и определил, какие слова из текста были в KI Text. Я использовал List.Intersect, чтобы сделать это. В нем перечислены дубликаты, что я и хотел:
Затем я добавил столбец и сделал обратное - определил, какие слова из KI Text были в тексте. Я снова использовал List.Intersect:
Затем я собрал информацию о количестве. Я создал новый столбец с подсчетом количества слов (всех вхождений) в каждом из списков, которые я создал. Я делал это один раз для текста, текста KI, текста в тексте KI и текста в тексте KI. Я просто использовал List.Count, чтобы сделать это. На самом деле в этом не было необходимости делать отдельные шаги с отдельными столбцами. Я просто сделал это, чтобы ясно увидеть цифры. Код М, который я создал в двух столбцах, следующих за этими четырьмя столбцами, не использует эти четыре столбца. Я также сделал подсчет в следующих двух столбцах:
Затем я создал два новых столбца для расчета% текста в тексте KI и % KI текста в тексте. Я использовал эти базовые c формулы (представленные здесь, надеюсь, в ясном английском sh, в отличие от кода М):
- % Текст в тексте KI = (Количество слов из текста, которые в KI Text / Количество слов в KI Text) * 100
% KI Text in Text = (Количество слов из KI Text, находящихся в тексте / Количество слов в тексте) * 100
Обязательно проверьте мою математику.
Наконец, я удалил все столбцы, которые мне больше не нужны.
После первых трех комментариев я добавил несколько шагов в свой запрос, чтобы получить это:
Вот код 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"