Удалить адрес электронной почты с пробелами

Я работаю с транскриптами колл-центра. В идеальном случае программа преобразования речи в текст расшифрует электронное письмо следующим образом: [email protected]. Так будет не всегда. Итак, я рассматриваю решение на основе регулярных выражений (RegEx), которое учитывает пробелы в адресе электронной почты, например. maya [email protected] или maya.lucco @proton.me или maya-lucco@pro ton.me

Я безуспешно пытался расширить это решение с помощью regex101 . Компиляция повторного объекта (шаблона), как предложено в этом решении, кажется слишком сложной для этой задачи. Я просмотрел сообщения о проверке адресов электронной почты, но они описывают другую проблему. Ниже моего кода:

import re 

#creating some data 
test = ['some random text maya @ proton.me with some more text [email protected]',
        '[email protected] with another address [email protected]',
        'some text maya.lucco @proton.me with some more bla [email protected]',
        '[email protected] more text maya@ proton.me '
        ]
        
test = pd.DataFrame(test, columns = ['words'])

#creating a function because I like to add some other data cleaning to it later on
def anonymiseEmail(text):
    
    text = str(text) #make text as string variable
    text = text.strip() #remove any leading, and trailing whitespaces
    text = re.sub(r'\S*@\S*\s?', '{e-mail}', text) #remove e-mail address
    
    return text

# applying the function
test['noEmail'] = test.words.apply(anonymiseEmail)

#checking the results
print(test.noEmail[0])
Output: some random text maya {e-mail}proton.me with some more text {e-mail}

Первый адрес электронной почты не удаляется полностью. Имя Майя осталось. Это проблема проекта.

Как можно расширить код, чтобы весь адрес электронной почты, независимо от количества в нем пробелов, был заменен установленным держателем или удален?

Обновление после комментариев:

Я просмотрел RegEx с просмотром вперед и назад, т. е. (?=@) и (?<=@), но, похоже, не могу сопоставить его со словами, которые следуют за знаком @ или следуют за ним. Я просматриваю фрагмент кода, любезно предоставленный Виктором Стрибижевом в другой раз \b(?:Dear|H(?:ello|i))(?:[^\S\r\n]+[A-Z]\w*(?:[’'-]\w+)*\.?)+''', '', text, и подумал, что могу обновить его до (?i)\b(?<=@)(?:[^\S\r\n]+[A-Z]\w*(?:[’'-]\w+)*\.?)+ но он не соответствует ни одному адресу электронной почты согласно regex101. Может быть, фрагмент кода (?i)\b(?<=@) (или любой другой RegEx) можно изменить, чтобы он соответствовал предыдущему и/или последующему слову (словам)?

Другое возможное решение, которое приходит мне в голову, — выбрать 5 слов до и после знака @, поместить их в отдельную переменную и проверить, есть ли какие-либо пробелы по 4 буквы/символа до и после знака @. Если да, поставьте их в очередь для ручной проверки. В этом решении меня беспокоит а) вычислительная мощность, б) техническая реализация и в) общая осуществимость. Но я решил поделиться этим в духе попытки найти решение.

Если у вас есть «случайный текст [email protected]», как вы узнаете, какой адрес электронной почты — [email protected], [email protected] или [email protected]? Есть ли у вас список известных адресов электронной почты для сравнения?

Jack 21.05.2024 18:56

Пришлось удалить этот вопрос раньше, примечание: пример не лишен воспроизводимости, поскольку имя в примере женское, например. Майя вместо Джона. Я думал, что это уже старая новость...

Simone 21.05.2024 18:56

@Джек, хороший вопрос. Тоже об этом подумал, но потом подумал, может быть, у кого-то здесь есть идеи, как это решить. Кстати, другой комментарий, который я оставил, не имеет ничего общего с вашим. ;-)

Simone 21.05.2024 18:57

@Jack Хорошая идея со списком. Я вижу две проблемы: i) CRM, из которой я мог бы получить список, устарела или в ней отсутствуют данные ii) я не могу получить доступ к данным из-за внутренних правил конфиденциальности данных.

Simone 21.05.2024 19:01

Проблема неразрешима. Как вы можете знать, что в предложении «мой адрес электронной почты — [email protected]» не должно быть «[email protected]»?

Tim Roberts 21.05.2024 19:12

Вероятно, вам лучше отправить исходный звук в модель НЛП, обученную идентифицировать и записывать адреса электронной почты, услышанные в разговоре - как отметил @TimRoberts, не существует чистого регулярного способа узнать, где заканчивается обычная копия и начинается электронное письмо, разделенное пробелами.

jmcgriz 21.05.2024 19:27

Спасибо за все предложения. Только что обновил пост, добавив некоторые идеи, взяв знак @ в качестве отправной точки для определения адресов электронной почты.

Simone 21.05.2024 19:42

@jmcgriz хорошая идея. stanza лучше всего подходит для текстовых данных на немецком языке, но RegEx превосходит его для задач, которые мне приходится выполнять. Пару недель назад протестировал несколько «моделей НЛП», включая строфу. Знайте мой путь туда :-) Или вы имели в виду обучение моей собственной модели НЛП для работы с электронной почтой?

Simone 21.05.2024 19:50

В общем, я знаю, что этот пост навязывает это. Но я должен попытаться. Работа с личными и конфиденциальными данными. Таким образом, 60% точности, которую строфа достигает в NER на немецком языке для определения названий улиц и городов, недостаточно. Вот почему я обратился к RegEx. Я ценю ваши мысли. Спасибо!

Simone 21.05.2024 19:51

«пример не лишен воспроизводимости, потому что имя в примере женское, например Майя, а не Джон». - никто такого не предполагал; обратная связь, которую вы получаете, совершенно не связана с полом; и тот факт, что вы можете себе это представить, не является многообещающим. Проблема по-прежнему принципиально неразрешима, и у нас здесь высокие стандарты вопросов, потому что это не дискуссионный форум; мы существуем не для того, чтобы решать проблему ФП, а для того, чтобы давать ответы на целенаправленные вопросы, доступные для поиска, которые могут помочь каждому.

Karl Knechtel 21.05.2024 20:55

@KarlKnechtel Я тоже не понимаю актуальности этого комментария. И к каким комментариям старого удалённого поста это должно относиться.

t.niese 21.05.2024 23:10

Ах я вижу. Причина, по которой адрес электронной почты в удаленном сообщении был отредактирован, заключается в том, что он оказался подлинным. Мы не хотим, чтобы вопросы включали адреса электронной почты, на которые можно случайно получить нежелательную почту (особенно спам), отправленную кому-то другому. (аналогично, причина задуматься, искали ли вы решение для Pandas, заключается в том, что в примере использован test = pd.DataFrame(test, columns = ['words']). Важно удалить ненужные детали из примеров, даже если из-за этого он будет отличаться от вашего фактического кода; см. минимальный воспроизводимый пример понимать.

Karl Knechtel 21.05.2024 23:13

Выяснить, сколько пробелов игнорировать после @, уже сложно и неоднозначно. Но часть перед @ может быть чем угодно. Можно иметь собственный домен, используя уникальный идентификатор для каждой зарегистрированной службы, это может быть вымышленное имя, место, фраза. Таким образом, вам нужно будет догадаться, основываясь на контексте, не должно ли здесь быть места. Это то, в чем могут быть хороши обученные языковые модели.

t.niese 21.05.2024 23:24
an example does not lack reproducibility because the name in the example is is female, e.g. Maya не уверен, насколько пол имени имеет отношение к проблеме. Кроме того, Майя - даже если это маловероятно - также может быть мужским именем или фамилией, и есть культуры, где такой порядок может быть surename.given-name@….
t.niese 22.05.2024 00:14

Чтобы прояснить это: причина, по которой я анонимизировал ваш исходный пост, как и заметки @KarlKnechtel, не имела ничего общего с предполагаемым полом владельца адреса. Я начал заменять его на [email protected], но получилось слишком абстрактно, поэтому я использовал самое общее имя, которое смог придумать. jane.smith подойдет вместо john.smith; извини, если это изменение раздражало твои чувства.

tripleee 22.05.2024 06:50
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
16
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вот измененное регулярное выражение для распознавания адресов электронной почты, таких как maya @ proton.me.

import pandas as pd

def anonymiseEmail(text):
    email_regex = r"\b[a-zA-Z0-9._%+-]+\s*@\s*[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b"
    return re.sub(email_regex, "{e-mail}", str(text).strip())


lines = [
    "some random text maya @ proton.me with some more text [email protected]",
    "[email protected] with another address [email protected]",
    "some text maya.lucco @proton.me with some more bla [email protected]",
    "[email protected] more text maya@ proton.me "
    ]

sample = pd.DataFrame(columns=["Lines"], data=lines)
sample["NoEmail"] = sample.Lines.apply(anonymiseEmail)

print(sample.NoEmail)

Выход:

0    some random text {e-mail} with some more text ...
1               {e-mail} with another address {e-mail}
2       some text {e-mail} with some more bla {e-mail}
3                          {e-mail} more text {e-mail}
Name: NoEmail, dtype: object

Пример ОП этого не подтверждает, но на самом деле более длинная расшифровка вполне может содержать дополнительные подсказки о том, каким может быть настоящее имя человека, и эти знания могут помочь вам предпочесть «maya@something» или «maya.lucco». @something» (с различными знаками препинания между именами или без них, а также с такими вариантами, как «luccom@something», «mlucco@something» или «mayal@something» и т. д.) вместо «randomtextmaya@something» и т. д.

tripleee 22.05.2024 06:53

Спасибо, что нашли время, чтобы предоставить решение. Это лучше, чем существующие решения, которые я нашел на SO и на которые ссылаюсь в своем посте. Для полноты информации для других читателей: это решение не будет работать maya@ proton .me. Для maya .lucca@ proton.me будет удалено только .lucca@ proton.me. майя останется. НО он очищает больше адресов электронной почты, чем предыдущий код.

Simone 23.05.2024 09:24

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