Страницы: 1
RSS
PowerQuery - Группировка строк по нечеткому текстовому совпадению
 
Добрый день!
Помогите, пожалуйста, разобраться, возможно ли вообще средствами PowerQuery в таблице сгруппировать похожие (не одинаковые) тексты в столбце и суммировать по ним количество из другого столбца.
Дано: таблица с заголовками статей разной степени похожести и баллами для каждого заголовка
Нужно на выходе: таблица, в которой группы похожих заголовков схлопнуты в одну строку и в соседнем столбце сумма баллов по всей группе заголовков из этой строки.

К примеру, в таблице есть три похожих, но не одинаковых заголовка, у каждого проставлено по 8 баллов:
Пользователи Сети говорят о беременности жены Моргенштерна Дилары
В Сети обсуждают возможную беременность жены Моргенштерна
В Сети обсуждают беременность жены Моргенштерна

На выходе нужно, чтобы из них остался один заголовок (любой) и сумма баллов 8+8+8=24
 
По какому принципу к "Пользователи Сети говорят о беременности жены Моргенштерна Дилары" нужно отнести только а), но не б) ?
а) В Сети обсуждают беременность жены Моргенштерна
б) Пользователи Сети говорят о беременности жены Морана Дилана
Изменено: surkenny - 09.12.2022 20:30:02
 
surkenny, я предполагаю, что "схлопывание" похожих заголовков можно каким-то образом реализовать через существующую в query функцию слияния через нечеткие соответствия. Логика работы "нечеткого соответствия" в данном случае вполне устраивает, но не могу разобраться, как сделать так, чтобы на выходе оставалось по одной строке для всей группы.
Если говорить о конкретных примерах, то опять же следуя логике "нечеткого соответствия", а) и б) должны считаться похожими заголовками и относиться в одну группу.
 
NewbieMe, попробуйте такой вариант (с коэффициентом поиграйтесь уже сами):
Код
let
  data = Excel.CurrentWorkbook(){[ Name = "data" ]}[Content],
  typed = Table.TransformColumnTypes ( data, { { "Заголовок", type text }, { "Релевантность", type number } } ),
  addInd = Table.AddIndexColumn ( typed, "ind", 0, 1, Int64.Type ),
  join = Table.FuzzyNestedJoin (
    addInd,
    { "Заголовок" },
    addInd,
    { "Заголовок" },
    "tbl",
    JoinKind.LeftOuter,
    [ IgnoreCase = true, IgnoreSpace = true, Threshold = .5 ]
  ),
  transform = Table.FromRecords (
    Table.TransformRows ( join, ( r ) => Record.TransformFields ( r, { { "Заголовок", ( x ) => Table.Min ( r[tbl], { "ind" } )[Заголовок] } } ) ),
    Value.Type ( join )
  ),
  group = Table.Group ( transform, { "Заголовок" }, { { "Релевантность", each List.Sum ( [Релевантность] ), type number } } ),
  sort = Table.Sort ( group, { { "Релевантность", Order.Descending } } )
in
  sort
 
вариант
Код
let
    Source = Excel.CurrentWorkbook(){[Name="data"]}[Content],
    tableTransformColumnTypes = Table.TransformColumnTypes(Source, {{"Заголовок", type text}}),

    tableAddFuzzyClusterColumn =
        Table.AddFuzzyClusterColumn(
            tableTransformColumnTypes,
            "Заголовок",
            "Заголовок Общий",
            [IgnoreCase = true, IgnoreSpace = true, Threshold = 0.5, SimilarityColumnName = "columnFuzzy"]
        )
in
    tableAddFuzzyClusterColumn
->
Код
let
    Source = Excel.CurrentWorkbook(){[Name="data"]}[Content],
    tableTransformColumnTypes = Table.TransformColumnTypes(Source, {{"Заголовок", type text}}),

    tableAddFuzzyClusterColumn =
        Table.AddFuzzyClusterColumn(
            tableTransformColumnTypes,
            "Заголовок",
            "Заголовок Общий",
            [IgnoreCase = true, IgnoreSpace = true, Threshold = 0.5]
        ),
    tableGroup =
        Table.Group(
            tableAddFuzzyClusterColumn,
            {"Заголовок Общий"},
            {
                {"Релевантность", each List.Sum([Релевантность]), type number}
            }
        )
in
    tableGroup
Изменено: te1n - 13.12.2022 01:06:02
Страницы: 1
Наверх