Функция, в которой слова не заменяются с помощью Regex

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

Я хочу написать функцию, в которой регулярное выражение ищет слова, заданные в списке. Если строка содержит одно из слов в данном списке, его не следует заменять. Приведу пример: Мейн Наам - это Ким и Хеб, который учился в Университете Амстердама.

Поэтому, поскольку Universiteit van Amsterdam написано заглавными буквами, оно будет анонимизировано другой функцией. Я хочу создать дополнительную функцию, использующую Regex, где заданный список с определенными словами будет игнорироваться, когда строка соответствует словам в списке.
У меня есть функция, которая заменяет ее, но я хочу, чтобы слова совпадений игнорировались.

Это функция, которая анонимизирует имена**

def anonymizeNames(sentence):
    '''
        :param sentence: the input sentence
        :return: the sentence without names
    '''

    ##define x
    x = ""

    ##Check naam: indication
    names0Reg = "[Aa]chternaam:|[Vv]oornaam:|[Nn]aam:|[Nn]amen:"
    res = re.search(names0Reg, sentence)
    if res != None:
        ##Achternaam:, voornaam: or naam: or namen: occurs; next Standardize
        sentence = re.sub('[Nn]amen:', 'naam:', sentence)
        sentence = re.sub('[Aa]chternaam:', 'naam:', sentence)
        sentence = re.sub('[Vv]oornaam:', 'naam:', sentence)
        sentence = re.sub('Naam:', 'naam:', sentence)

        ##Extract names
        names00Reg = "naam: [A-Za-z]+"
        x = re.findall(names00Reg, sentence)
        for y in x:
            ##remove naam:\s
            y = re.sub('naam: ', '', y)
            ##Check for tussenvoegsels
            if y in tussenVList:
                ##Add next word
                regTest = y + " " + "[A-Za-z]+"
                x2 = re.search(regTest, sentence)
                if x2 != None:
                    ##Name found
                    y = x2.group()
                    ##replace
                   sentence = re.sub(y, strz, sentence)

    ##Always check sentences for names 1
    names1Reg = "[Ii]k [Bb]en ([A-Z]{1}[a-z ]{2,})+[\\.\\,]*"
    res = re.search(names1Reg, sentence)
    if res != None:
        ##adjust result
        x = re.sub('[Ii]k [Bb]en ', '', res.group())
        x = re.sub('[\\,\\.]', '', x)
        ##use NLP to only keep names
        

    ##Always check sentences for names 2
    names2Reg = "[Mm]ijn [Nn]aam is ([A-Z]{1}[a-z\s-]{2,})+[\\.\\,]*"
    res = re.search(names2Reg, sentence)
    if res != None:
        ##adjust result
        x = re.sub('[Mm]ijn [Nn]aam is ', '', res.group())
        x = re.sub('[\\,\\.]', '', x)
        ##use NLP to only keep names
        

    ##Check for single letter followed by dot and series of letters
    if x == "":
        regNameLet = "^[A-Z]{1}\\.[A-Za-z]{2,}|\s[A-Z]{1}\\.[A-Za-z]{2,}"
        res = re.search(regNameLet, sentence)
        if res != None:
            ##replace word in sentence, first at start
            sentence = re.sub('^[A-Z]{1}\\.[A-Za-z]{2,}', strz, sentence)
            ##next in sentence with additional space
            strY = " " + strz
            sentence = re.sub('\s[A-Z]{1}\\.[A-Za-z]{2,}', strz, sentence)

    ##Check for occurence of two subsequent uppercase words (might be a name)
    if x == "":
        res = re.findall("[A-Z]{1}[a-z]{2,}\s[A-Z]{1}[a-z]{2,}", sentence)
        if res != []:
            for y in res:
                if len(y) > 1:
                    ##replace name with strX
                    sentence = re.sub(y, strz, sentence)

    ##Always recheck remaining sentence with NLP to make sure all personal info is removed
    sentence = pureNLP2(sentence)  ##pureNLP2 tries to include entity checks

    return (sentence)

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

school ['Hogenschool Amsterdam', 'Universiteit van Amsterdam']
strX='xxx'

def school (sentence):
   for schoolname in school:
     res = re.findall(schoolname,sentence)
     if res !=[]:
        for y in res:
            if len(y) >1:
               sentence = replaceNice(sentence, strX, y)
      return(sentence)
print(school('Mijn naam is Kim en ik volg een opleiding aan de Universiteit van Amsterdam'))

вывод: Mijn naam xxx en ik volg een opleiding aan de xxx xxx

Результат, который я хочу: Mijn naam is Kim en ik volg een opleiding aan de Universiteit van Amsterdam

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

Я думаю, вам не нужно использовать здесь регулярное выражение, верно? У вас есть список строк, которые вы хотите чем-то заменить, если они существуют в предложении, верно?

The fourth bird 05.08.2024 20:42

Да, я согласен с @Thefourthbird, но не уверен, хотите ли вы заменить его или сделать что-то еще?

Flow 05.08.2024 20:43

Я не хочу их заменять, они заменяются другой функцией для поиска имен, и поскольку люди описывают названия университетов заглавными буквами, другая функция думает, что это имя. Есть ли у вас другая идея? @Thefourthbird

Leyla Elkhamlichi 05.08.2024 20:44

Нет, я не хочу их заменять, просто если вы найдете подходящее слово в предложении, не заменяйте его, если вы думаете, что я могу сделать это по-другому, пожалуйста, дайте мне знать @Flow

Leyla Elkhamlichi 05.08.2024 20:47

В вашем сообщении есть противоречия. Вы пишете: «поскольку Universiteit van Amsterdam написано заглавными буквами, он будет анонимизирован другой функцией», но также «если в строке есть совпадающие слова из списка School, не заменяйте ее, а просто распечатайте обратно.». Так ты хочешь заменить или нет?

trincot 05.08.2024 20:47

@trincot нет, я не хочу его заменять,

Leyla Elkhamlichi 05.08.2024 20:48

Тогда что вы имеете в виду под «он будет анонимизирован другой функцией»?

trincot 05.08.2024 20:49

Можете ли вы предоставить работоспособный код, который принимает пример входных данных и выводит результат, и объясните, что не так с результатом? Здесь слишком много расплывчатых утверждений и кода.

trincot 05.08.2024 20:50

Цель всего моего скрипта — подмена личных данных. Таким образом, эта функция распознает слова в середине предложения, где используются заглавные буквы. Поэтому, когда люди описывают университет, они используют заглавные буквы, и это может быть образец имени и фамилии, и он будет заменен, но университет не следует заменять.

Leyla Elkhamlichi 05.08.2024 20:51

Насколько я понимаю, просьба Лейлы, первоначальная идея состоит в том, чтобы заменить все имена анонимными именами для защиты личности. Идея Лейлы заключалась в том, чтобы заменить все слова, написанные с заглавной буквы. Однако здесь возникает проблема замены других имен собственных, таких как Universiteit van Amsterdam.

Michael Cao 05.08.2024 20:53

@MichaelCao да, действительно, у тебя есть идеи, как я могу это решить?

Leyla Elkhamlichi 05.08.2024 20:54

Можете ли вы расширить функцию, которая делает данные анонимными, дополнительной проверкой списка school? Или добавьте эту функцию в вопрос, чтобы сделать его более понятным для читателей.

The fourth bird 05.08.2024 20:55

Предоставленная вами функция не работает. Можете ли вы сделать его работоспособным? Пожалуйста, устраните зависимости и ошибки отступов.

trincot 05.08.2024 21:07

@MichaelCao это то, что я хотел, но добавляю к комментариям один небольшой вопрос

Leyla Elkhamlichi 05.08.2024 21:18

Используйте функцию в re.sub() для динамического расчета замены. Он может проверить, есть ли слово в списке, и оставить его без изменений.

Barmar 05.08.2024 21:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
15
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Замените все безопасные слова версией в нижнем регистре, затем анонимизируйте, а затем восстановите безопасные слова в нижнем регистре в их исходную форму.

test_strings = ['Adam goes to Universiteit van Amsterdam', 'George goes to Washington College', 'Anthony Hopkins is a student at Johns Hopkins']
safe_words = ['Universiteit van Amsterdam', 'Johns Hopkins', 'Washington College']

def anonymize(sentence, safe_words):
    restore = {}

    for word in safe_words:
        sentence = sentence.replace(word, word.lower())

        restore[word.lower()] = word
    
    for word in sentence.split():
        if word[0].isupper():
            sentence = sentence.replace(word, word[0]+'.')
    
    for word, restored_word in restore.items():
        sentence = sentence.replace(word, restored_word)
    
    return sentence

for sentence in test_strings:
    print(anonymize(sentence, safe_words))

Выход:

A. goes to Universiteit van Amsterdam
G. goes to Washington College
A. H. is a student at Johns Hopkins

Это отличная функция, но я хочу применить ее к столбцу в фрейме данных, мне нужно написать ее так: df['personlijke information'].apply(anonymize, Safe_words) @michealCao

Leyla Elkhamlichi 05.08.2024 21:13
df.apply позволяет передавать аргументы ключевых слов. Просто используйте df['persoonlijke informatie'].apply(anonymize, safe_words = safe_words).
Michael Cao 05.08.2024 21:53

Другие вопросы по теме