Рубрики
Без рубрики

Анализ электронной почты с использованием Python 3 (часть I)

Есть много данных, в основном неструктурированных. Электронные письма – отличный источник общения … с меткой Python.

Есть много данных, в основном неструктурированных. Электронные письма являются отличным источником данных общения. Как таковые. Нет ограничений на то, что мы можем использовать из них. В конце этого урока вы сможете получить данные электронной почты для понимания.

Предварительные условия

  • Питон 3
  • Панды
  • Matplotlib
  • Морской
  • WordCloud
  • Учетная запись Gmail

Получение данных

Есть несколько способов достичь цели этой статьи; Найдите ниже, как я сделал свой.

Здесь используется учетная запись Gmail; Чтобы сценарий imaplib для работы я внес следующие изменения в свою учетную запись; включен IMAP и включил менее защищенные приложения.

  1. Сначала откройте Gmail, нажмите на Настройки ⚙ Значок и нажмите «Посмотреть все настройки», чтобы включить IMAP.
  2. На следующей странице нажмите на Пересылка и поп/imap вкладка
  3. В IMAP Access Раздел, выберите Включить imap Анкет Затем нажмите Сохранить изменения Анкет Если вам нужна дополнительная помощь, пожалуйста, посетите это Страница справки Gmail Анкет
  4. Чтобы включить менее безопасные приложения, перейдите к панели панели Google, нажав на аватар своей учетной записи в верхнем правом углу экрана, а затем нажмите Моя учетная запись или перейдите к myaccount.google.com.
  5. Затем выберите Вход и безопасность Прокрутите вниз, пока не увидите опцию разрешить менее безопасные приложения, и включите доступ.

Если вы все еще не можете войти в систему после того, как сделано выше, пожалуйста, посетите здесь официальный Google Помогите поддержать Анкет

Шаг 1: Импорт необходимых библиотек для получения данных электронной почты

  • IMAPLIB – это библиотека протокола доступа к Интернету (IMAP)

  • Электронная почта – это библиотека Python, которая анализирует, обрабатывает и генерирует сообщения электронной почты.

  • GetPass – это библиотека Python, которая содержит утилиты для получения пароля или текущего имени пользователя

  • Pandas – это библиотека Python для манипулирования и анализа данных.

import imaplib
import email
import getpass
import pandas as pd

Шаг 2: Получение доступа к адресу электронной почты

  • Имя пользователя это адрес электронной почты.
  • пароль это пароль по адресу электронной почты при запросе. [Если вы не хотите использовать пакет GetPass, вы можете ввести свой пароль в качестве строки.]
  • Почта Является ли почтовый сервер, к которому мы собираемся подключиться, и он варьируется, для этого урока мы используем Gmail.
  • mail.login Войдет в сервер, используя предоставленные учетные данные.
username =  input("Enter the email address: ")
password = getpass.getpass("Enter password: ")
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login(username, password)

Шаг 3: Указание почтового ящика для получения данных.

  • mail.list () это метод, который дает список почтовых ящиков, то есть входящие ящики, черновик и т. Д. В адресе электронной почты.
  • mail.select () это метод, который принимает аргумент в пользу почтового ящика, из которого вы хотите получить данные.
print(mail.list())
mail.select("inbox")

Шаг 4: Поиск и получение данных

  • Строка 1: mail.uid () – это метод, первым аргументом которого является команда, которую вы хотите выполнить, в данном случае командой является «поиск». Остальные аргументы используются для поиска. (Поиск дается от самых старых к недавним)
  • Строка 1: Результатом является код выхода команды, в то время как номера – это список, который содержит объект типа байта.
  • Строка 2: это список каждого раздела в цифрах.
  • Строка 3: это список декодированных байтов
  • Строка 4: является кусочком недавних 100 предметов (напомните, что поиск приказывает его с самых старых до недавнего).
  • Строка 5: Команда, которую мы хотим выполнить, – это «привлечь» и хранить ее в сообщениях. Мы получаем предмет сообщений в этом случае.
result, numbers = mail.uid('search', None, "ALL")
uids = numbers[0].split()
uids = [id.decode("utf-8") for id in uids ]
uids = uids[-1:-101:-1]
result, messages = mail.uid('fetch', ','.join(uids), '(BODY[HEADER.FIELDS (SUBJECT FROM DATE)])')

Шаг 5: Подготовка данных для экспорта

  • Строка 1-3: Пустые списки для данных, которые мы указали в сообщениях.
  • Строка 4: Проверка по содержанию сообщения, которое мы получили. Используя шаг из двух, потому что он вернул кортеж из двух элементов.
  • Строка 5: Расположение по электронной почте байтов в объект сообщения.
  • Строка 6-11: MSG находится в байтах, чтобы использовать его, он должен был быть декодирован в формат, который мы можем прочитать.
  • Строка 12: Добавление дат на дату_листа.
  • Строка 13-15: Получив детали отправителя, он находится в формате «Имя отправителя», поэтому методы разделения и замены используются, чтобы получить только «имя отправителя».
  • Строка 16-19: Преобразование объектов в date_list в объекты DateTime, поскольку время включает свой формат UTC, был создан новый список, и формат UTC был отрезан из каждого объекта в списке.
  • Строка 20-22: Проверка длины созданных списков, потому что массивы должны быть одинаковой длины.
  • Строка 23-25: Преобразование списков в словарь а затем пандас DataFrame, просмотр и сохранение для загрузки.
date_list = []
from_list = [] 
subject_text = []
for i, message in messages[::2]:
    msg = email.message_from_bytes(message)
    decode = email.header.decode_header(msg['Subject'])[0]
    if isinstance(decode[0],bytes):
        decoded = decode[0].decode()
        subject_text.append(decoded)
    else:
        subject_text.append(decode[0])
    date_list.append(msg.get('date'))
    fromlist = msg.get('From')
    fromlist = fromlist.split("<")[0].replace('"', '')
    from_list1.append(fromlist)
date_list = pd.to_datetime(date_list)
date_list1 = []
for item in date_list:
    date_list1.append(item.isoformat(' ')[:-6])
print(len(subject_text))
print(len(from_list))
print(len(date_list1))
df = pd.DataFrame(data={'Date':date_list1, 'Sender':from_list, 'Subject':subject_text})
print(df.head())
df.to_csv('inbox_email.csv',index=False)

Визуализация

Теперь, когда у нас есть данные электронной почты в формате CSV, мы можем прочитать данные с помощью Pandas и визуализировать их. Есть несколько библиотек визуализации данных Python, но здесь я использовал WordCloud, Matplotlib и Seaborn. Я хотел увидеть инфографику по самым используемым словам в предметах моих электронных писем, и вот как я это сделал.

Шаг 1: Чтение и просмотр CSV

Шаг 2: Получение статистических данных

Я использовал метод описания, чтобы получить статистические данные, уникальные значения и все, чтобы получить представление о том, что в данных.

Шаг 3: Создание новых переменных

Я создал две переменные; Время и синкемид. Синкемид – это количество часов после полуночи.

(Примечание: время может быть полностью удалено из столбца даты)

from datetime import datetime
FMT = '%H:%M:%S'
emails['Time'] = emails['Date'].apply(lambda x: datetime.strptime(x, '%Y-%m-%-d%H:%M:%S').strftime(FMT))
emails['SinceMid'] = emails['Time'].apply(lambda x: (datetime.strptime(x, FMT) - datetime.strptime("00:00:00", FMT)).seconds) / 60 / 60

Шаг 4: Графики

Я создал изображение Wordcloud самых используемых слов в предметах моих почт. В этом примере нет стоп -слов, остаточные слова обычно отфильтровываются, так как в большинстве случаев они не информативны.

from wordcloud import WordCloud
import matplotlib.pyplot as plt


# Create a list of words
text = ""
for item in emails["Subject"]:
    if isinstance(item,str):
        text += " " + item
    text.replace("'", "")
    text.replace(",","")
    text.replace('"','')


# Create the wordcloud object
wordcloud = WordCloud(width=800, height=800, background_color="white")

# Display the generated image:
wordcloud.generate(text)
plt.figure(figsize=(8,8))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.margins(x=0, y=0)
plt.title("Most Used Subject Words", fontsize=20,ha="center", pad=20)
plt.show()

Вот выход:

Я создал гистограмму часов после полуночи, используя Seaborn.

import seaborn as sns
sns.distplot(emails["SinceMid"],bins=20)
plt.title("Hours since midnight")

Вот гистограмма:

Вы можете проверить Галерея Python Для более возможных визуализаций.

Вывод

Мне было весело писать это, надеюсь, вы тоже это сделали, читая это. Это само собой разумеется, я столкнулся с ошибками, делая это [Некоторые из них я никогда раньше не видел]. Когда вы получаете сообщения об ошибках, хорошей отправной точкой является использование оператора печати, чтобы получить понимание, а затем поиск сообщения об ошибке. Часть II также будет опубликована в этом блоге, она будет сосредоточена на получении тела почты, а не на эту тему как этот.

Полный код можно найти ниже:

yomaokobiah/email_analysis

Анализ данных электронной почты

Анализ данных электронной почты

Спасибо, что прочитали до этого момента.

Отказ от ответственности: я призываю вас экспериментировать вне того, что написано здесь, если вы столкнетесь с ошибками, и вам хочется привлечь меня [после Google], отправьте мне DM на Twitter Я был бы рад узнать что -то новое. Спасибо в ожидании.

Ссылки/кредиты

Оригинал: “https://dev.to/yomaokobiah/email-analysis-using-python-3-part-i-275e”