Группировка строк профилей, содержащих одинаковые слова, но расположенных не по порядку Python

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

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

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

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).

53  JavaScript Python Data Science  Java Python Data Science

Любая помощь будет принята с благодарностью!!!

РЕДАКТИРОВАТЬ *** Я написал следующее, чтобы заменить все слова, встречающиеся как в столбцах words_to_keep, так и в столбце clean_talentpool['profile'], но, похоже, это не работает? Не мог бы кто-нибудь указать, чего я не вижу? Я был бы очень признателен!

def standardize_word_order(row):
    words_to_keep = [
        "javascript frontend design",
        "android ios javascript",
        "android developer developer",
        "android developer",
        "quality assurance",
        "quality assurance engineer",
        "architecture developer",
        "big data architecture developer",
        "data architecture developer",
        "software architecture developer",
        "javascript python data science",
        "frontend php javascript",
        "javascript android ios",
        "frontend design javascript",
        "java python data science",
        "javascript frontend android",
        ".net javascript frontend",
    ]
    for word in words_to_keep:
        if (sorted(word.replace(" ", ""))) == sorted(
            row.replace(" ", "")
        ) and word != row:
            row.replace(row, word)
    return row

clean_talentpool["profile"] = clean_talentpool["profile"].apply(
    lambda x: standardize_word_order(x)
)

person Erin    schedule 13.10.2020    source источник
comment
Насколько я вижу, я не думаю, что вам нужна лямбда-функция. Lambdas — это анонимная функция для инкапсуляции небольшой части логики, объявленной на лету, для сохранения компактности кода.   -  person Nja    schedule 14.10.2020


Ответы (1)


В вашем случае я бы сосредоточился не на строке, а на символах. В основном, если две строки состоят из одних и тех же символов (переставленных), они совпадают.

a = "Frontend Design JavaScript"
b = "Javascript Frontend Design"

sorted(a) == sorted(b)
#prints True

Вы можете рассмотреть возможность удаления пробела и выполнить другую предварительную обработку, такую ​​как нижний регистр.

if sorted(a.lower().replace(" ","")) == sorted(b.lower().replace(" ","")):
    # they are the same, do something

В соответствии с вашим примером реализация может быть:

def standardize_word_order(row):
    words_to_keep = [
        "javascript frontend design",
        "android ios javascript",
        "android developer developer",
        "android developer",
        "quality assurance",
        "quality assurance engineer",
        "architecture developer",
        "big data architecture developer",
        "data architecture developer",
        "software architecture developer",
        "javascript python data science",
        "frontend php javascript",
        "javascript android ios",
        "frontend design javascript",
        "java python data science",
        "javascript frontend android",
        ".net javascript frontend",
    ]
    for word in words_to_keep:
        if ((sorted(word.replace(" ", ""))) == sorted(
            row.replace(" ", "")
        ) and word != row):
            return word
    return row

clean_talentpool["profile"] = standardize_word_order(clean_talentpool["profile"])
person Nja    schedule 13.10.2020
comment
Благодарю вас! Это отличная стратегия. Есть идеи, как взять слова, удовлетворяющие условию if, и заменить их списком words_to_keep, показанным выше? - person Erin; 14.10.2020