Группировка строк профилей с одинаковыми словами, но в различном порядке.

Вопрос или проблема

У меня есть датафрейм, содержащий столбец типов профилей, который выглядит следующим образом:

0                                    Android Java
1                  Software Development Developer
2                            Full-stack Developer
3                      JavaScript Frontend Design
4                          Android iOS JavaScript
5                             Ruby JavaScript PHP

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

left_side                       right_side                  similarity
7   JavaScript Frontend Design  Design JavaScript Frontend  0.849943
8   JavaScript Frontend Design  Frontend Design JavaScript  0.814599
9   JavaScript Frontend Design  JavaScript Frontend         0.808010
10  JavaScript Frontend Design  Frontend JavaScript Design  0.802881
12  Android iOS JavaScript      Android iOS Java            0.925126
15  Machine Learning Engineer   Machine Learning Developer  0.839165
21  Android Developer Developer Android Developer           0.872646
25  Design Marketing Testing    Design Marketing            0.817195
28  Quality Assurance           Quality Assurance Developer 0.948010

Хотя это помогло, сократив количество уникальных профилей с 478 до 461, я хотел бы сосредоточиться на таких профилях:

Frontend Design JavaScript  Design Frontend JavaScript

Единственный инструмент, который я видел и который, похоже, решает эту проблему, это difflib?
Мой вопрос: какие еще методы можно использовать для стандартизации этих профилей, которые состоят из одинаковых слов, но в разном порядке, в одну стандартную строку.
Желаемым результатом будет преобразование строки, содержащей “Design”, “Frontend” и “JavaScript”, в “Design Frontend JavaScript”.

Сейчас я объединяю мой оригинальный датафрейм с датафреймом схожести, чтобы заменить все вхождения строки профиля справа на слева, но это означает, что я заменяю правую сторону ниже (“Java Python Data Science”) на левую сторону ниже (“JavaScript Python Data Science”).

53  JavaScript Python Data Science  Java Python Data Science

Любая помощь будет非常 ценна!!!

“Нечеткое совпадение” – это размытое понятие для многих различных мер схожести строк. Существует две основные категории:

Традиционно первая категория используется на уровне символов (например, для сопоставления “abcdefg” с “abdfeg”), а вторая на уровне слов (например, для сопоставления “управление командой” с “управление командой”), однако нет технических ограничений, чтобы оставить это таким образом. Основное различие между двумя категориями заключается в том, принимают ли они во внимание порядок единиц (например, слов или символов). На самом деле существуют также некоторые гибридные меры, такие как SoftTFIDF, которые объединяют оба подхода.

Вывод:

  • Для проблемы порядка слов простая мера “мешка слов”, такая как косинусная или Жаккара, идеально сопоставит два профиля.
  • Если нужна большая гибкость, Soft-TFIDF или другие варианты будут работать.

Ответ или решение

Для успешного решения задачи группировки профилей, состоящих из одинаковых слов, расположенных в разном порядке, важно рассмотреть несколько методов, основанных на статистических и алгоритмических подходах к обработке строк и текстов. Данная проблема подразумевает не только выявление дубликатов, но и стандартизацию их форматов для упрощения дальнейшего анализа. Ниже представлены основные стратегии и алгоритмы, которые могут быть полезны для достижения этой цели.

1. Метод Bag-of-Words (Мешок слов)

Один из самых простых и эффективных способов решения данной задачи — использование подхода "мешок слов". Этот метод игнорирует порядок слов и сосредотачивается на их наличиях. Сначала вам необходимо будет разбить ваши строки на отдельные слова, а затем создать набор уникальных слов для каждой строки. После этого можно просто сравнить эти наборы:

  • Пример реализации:

    import pandas as pd
    
    # Исходный DataFrame
    df = pd.DataFrame({'profiles': ['Frontend Design JavaScript', 'Design Frontend JavaScript']})
    
    # Функция для нормализации строк
    def normalize_profile(profile):
      return ' '.join(sorted(profile.split()))
    
    # Применение функции к DataFrame
    df['normalized'] = df['profiles'].apply(normalize_profile)
    
    # Объединение строк с одинаковыми нормализованными значениями
    df_grouped = df.groupby('normalized')['profiles'].apply(lambda x: ', '.join(x)).reset_index()
    print(df_grouped)

2. Косинусное сходство

Косинусное сходство — еще один полезный инструмент для сравнения строк. Этот метод также игнорирует порядок слов, и позволяет определить уровень схожести между строками на основе векторов, представляющих текстовые данные.

  • Применение:
    Для данного метода вам потребуется привести текстовые данные к векторному виду, а затем рассчитать косинусное сходство, используя библиотеку, такую как scikit-learn.

3. Jaccard Similarity

Показатель сходства Жаккара также полезен для анализа множеств. Он основан на делении размера пересечения множества на размеры объединения, что позволяет оценить, насколько строки схожи по набору садимов:

  • Реализация:

    from sklearn.metrics import jaccard_score
    
    # Функция для расчета Jaccard Similarity
    def jaccard_similarity(list1, list2):
      set1, set2 = set(list1), set(list2)
      return len(set1.intersection(set2)) / len(set1.union(set2))

4. Стандартизация строки

После применения вышеописанных методов следует выбрать как образец представления для каждого уникального набора слов. Наиболее распространённым подходом будет выбор самой частой или первой встреченной строки, которая имеет подходящие слова.

  • Пример:

    # Выбор наиболее часто встречающейся строки
    def choose_standard(profile_series):
      return profile_series.mode()[0]
    
    df_standardized = df_grouped.groupby('normalized')['profiles'].agg(choose_standard).reset_index()

Заключение

Выбор метода будет зависеть от конкретных требований и объема данных. Для более точных и гибких решений, возможно, стоит рассмотреть комбинирование методов, таких как Soft-TFIDF, который объединяет в себе особенности последовательных и космических подходов. Такой комбинированный подход позволит более точным образом стандартизировать профили, включая в него элементы, которые учитывают как наличие слов, так и их расположение.

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

Оцените материал
Добавить комментарий

Капча загружается...