Вопрос или проблема
У меня есть датафрейм, содержащий столбец типов профилей, который выглядит следующим образом:
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
Любая помощь будет非常 ценна!!!
“Нечеткое совпадение” – это размытое понятие для многих различных мер схожести строк. Существует две основные категории:
- Методы, основанные на последовательности, такие как расстояние редактирования Левенштейна (и его варианты), Jaro-Winkler
- Методы “мешка чего-то”, такие как Cosine-TFIDF, Overlap, Jaccard, …
Традиционно первая категория используется на уровне символов (например, для сопоставления “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, который объединяет в себе особенности последовательных и космических подходов. Такой комбинированный подход позволит более точным образом стандартизировать профили, включая в него элементы, которые учитывают как наличие слов, так и их расположение.
Эффективная реализация этих методов позволит вам лучше управлять данными профилей и существенно упростить процесс анализа, переходя от множества уникальных профилей к более сжато организованным стандартным строкам, что в свою очередь облегчит дальнейшие шаги в обработке и анализе данных.