Я пытаюсь удалить номера социального страхования (SSN) по причинам, соответствующим GDPR, из грязных данных, генерируемых с преобразованием речи в текст. Вот пример строки (переведенной на английский язык sh, которая объясняет, почему 'и' происходит, когда в списке указаны номера SSN):
sample1 = "hello my name is sofie my social security number is thirteen zero four five and seventy eighteen seven and forty and I live on mountain street number twelve"
Моя цель - удалить часть "thirteen ... forty "
, сохраняя при этом другие числа, которые может появиться в строке, что приведет к:
sample1_wo_ssn = "hello my name is sofie my social security number is and I live on mountain street number twelve"
Длина номера социального страхования может варьироваться в зависимости от того, как генерируются данные (3-10 разделенных номеров).
Мой подход :
- Замените записанные числа цифрами, используя dict
- Используйте регулярные выражения, чтобы найти 3 или более чисел, встречающихся только с пробелами, или
"and"
, разделяя их, и удалите их вместе с любым числом. следуя этим 3 номерам.
Вот мой код:
import re
number_dict = {
'zero': '0',
'one': '1',
'two': '2',
'three': '3',
'four': '4',
'five': '5',
'six': '6',
'seven': '7',
'eight': '8',
'nine': '9',
'ten': '10',
'eleven': '11',
'twelve': '12',
'thirteen': '13',
'fourteen': '14',
'fifteen': '15',
'sixteen': '16',
'seventeen': '17',
'eighteen': '18',
'nineteen': '19',
'twenty': '20',
'thirty': '30',
'forty': '40',
'fifty': '50',
'sixty': '60',
'seventy': '70',
'eighty': '80',
'ninety': '90'
}
sample1 = "hello my name is sofie my social security number is thirteen zero four five and seventy eighteen seven and forty and I live on mountain street number twelve"
sample1_temp = [number_dict.get(item,item) for item in sample1.split()]
sample1_numb = ' '.join(sample1_temp)
re_results = re.findall(r'(\d+ (and\s)?\d+ (and\s)?\d+\s?(and\s)?(\d+)?\s?(and\s)?(\d+)?\s?(and\s)?(\d+)?\s?(and\s)?(\d+)?\s?(and\s)?(\d+)?\s?(and\s)?(\d+)?\s?(and\s)?(\d+)?\s?(and\s)?(\d+)?)', sample1_numb)
print(re_results)
Вывод:
[('13 0 4 5 and 70 18 7 and 40 and ', '', '', '', '5', 'and ', '70', '', '18', '', '7', 'and ', '40', 'and ', '', '', '', '', '')]
Вот где я застрял.
В этом примере я мог бы сделать что-то вроде sample1_wh_ssn = re.sub(re_results[0][0],'',sample1_numb)
, чтобы получить желаемый результат, но это не обобщает.
Любая помощь будет принята с благодарностью.