У меня есть сценарий, в котором я анонимизирую личные данные, поэтому, когда в строке есть слова, начинающиеся с заглавных букв, они заменяются другой функцией (то есть анонимизируют имена).
Я хочу написать функцию, в которой регулярное выражение ищет слова, заданные в списке. Если строка содержит одно из слов в данном списке, его не следует заменять. Приведу пример: Мейн Наам - это Ким и Хеб, который учился в Университете Амстердама.
Поэтому, поскольку 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
Думаю, у меня есть начало. Но когда я хочу закончить переменное предложение, я немного застреваю, потому что здесь я хочу сказать, есть ли в строке совпадающие слова из списка. Школа не заменяет ее, а просто распечатывает обратно.
Да, я согласен с @Thefourthbird, но не уверен, хотите ли вы заменить его или сделать что-то еще?
Я не хочу их заменять, они заменяются другой функцией для поиска имен, и поскольку люди описывают названия университетов заглавными буквами, другая функция думает, что это имя. Есть ли у вас другая идея? @Thefourthbird
Нет, я не хочу их заменять, просто если вы найдете подходящее слово в предложении, не заменяйте его, если вы думаете, что я могу сделать это по-другому, пожалуйста, дайте мне знать @Flow
В вашем сообщении есть противоречия. Вы пишете: «поскольку Universiteit van Amsterdam написано заглавными буквами, он будет анонимизирован другой функцией», но также «если в строке есть совпадающие слова из списка School, не заменяйте ее, а просто распечатайте обратно.». Так ты хочешь заменить или нет?
@trincot нет, я не хочу его заменять,
Тогда что вы имеете в виду под «он будет анонимизирован другой функцией»?
Можете ли вы предоставить работоспособный код, который принимает пример входных данных и выводит результат, и объясните, что не так с результатом? Здесь слишком много расплывчатых утверждений и кода.
Цель всего моего скрипта — подмена личных данных. Таким образом, эта функция распознает слова в середине предложения, где используются заглавные буквы. Поэтому, когда люди описывают университет, они используют заглавные буквы, и это может быть образец имени и фамилии, и он будет заменен, но университет не следует заменять.
Насколько я понимаю, просьба Лейлы, первоначальная идея состоит в том, чтобы заменить все имена анонимными именами для защиты личности. Идея Лейлы заключалась в том, чтобы заменить все слова, написанные с заглавной буквы. Однако здесь возникает проблема замены других имен собственных, таких как Universiteit van Amsterdam
.
@MichaelCao да, действительно, у тебя есть идеи, как я могу это решить?
Можете ли вы расширить функцию, которая делает данные анонимными, дополнительной проверкой списка school
? Или добавьте эту функцию в вопрос, чтобы сделать его более понятным для читателей.
Предоставленная вами функция не работает. Можете ли вы сделать его работоспособным? Пожалуйста, устраните зависимости и ошибки отступов.
@MichaelCao это то, что я хотел, но добавляю к комментариям один небольшой вопрос
Используйте функцию в re.sub()
для динамического расчета замены. Он может проверить, есть ли слово в списке, и оставить его без изменений.
Замените все безопасные слова версией в нижнем регистре, затем анонимизируйте, а затем восстановите безопасные слова в нижнем регистре в их исходную форму.
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
df.apply
позволяет передавать аргументы ключевых слов. Просто используйте df['persoonlijke informatie'].apply(anonymize, safe_words = safe_words)
.
Я думаю, вам не нужно использовать здесь регулярное выражение, верно? У вас есть список строк, которые вы хотите чем-то заменить, если они существуют в предложении, верно?