تحليل رسائل WhatsApp باستخدام Python (الجزء 1)

أنا واحد من هؤلاء الأشخاص الذين يحتفظون بكل محادثة أجراها على WhatsApp. لم أحذف مطلقًا واحدًا منذ عام 2014 ، عندما حصلت على أول هاتف ذكي. هذا يعني ، لقد حصلت في سجل WhatsApp على أكثر من 800 ألف رسالة مع أصدقائي وزملائي في العمل وعائلتي وحتى أصدقائي القدامى.

بمجرد أن تعلمت تقنيات البرمجة اللغوية العصبية ، كان هدفي الأول واضحًا: استعرض سجل WhatsApp بالكامل لفهم كيف تطورت الرسائل النصية الخاصة بي على مر السنين ، إذا كانت علاقاتي تختلف عن بعضها البعض ، ولماذا لا للمتعة ، انظر ماذا يمكنني أيضًا اعرف عن نفسي!

يمكنك العثور على الكود الكامل والعرض النهائي الخاص بي في GitHub repo

في هذا الجزء الأول ، سوف أتحدث عن استيراد المحادثات والتعامل مع الرموز التعبيرية وبعض التحليل العام للرسائل.

في الجزء الثاني ، سوف أقفز مباشرة إلى تحليل موضوع WhatsApp الخاص بي باستخدام تقنيات NLP.

تنصل

من أجل البساطة ، قررت في هذا النهج الأول تخطي ملفات الوسائط.

تحميل محفوظات الرسائل

تجعل رسائل WhatsApp المشفرة من الصعب جدًا الوصول حتى إلى تاريخ رسائلنا الخاصة. كحل بديل ، قررت تصدير كل محادثة يدويًا ثم تحميلها باستخدام إعادة بناء الجملة.

def read_history (file): f = open ('data / {}'. format (file)، 'r') # كل رسالة نصية لها نفس التنسيق: التاريخ - المرسل: الرسالة. Messages = re.findall ('(\ d + / \ d + / \ d +، \ d +: \ d + \ d +) - (. *): (. *)'، f.read ()) f.close () #Convert قائمة بإطار بيانات وتسمية تاريخ الأعمدة = pd.DataFrame (رسائل ، أعمدة = ['date'، 'name'، 'msg']) history ['date'] = pd.to_datetime (history ['date']، التنسيق = "٪ m /٪ d /٪ y ،٪ H:٪ M") السجل ['date1'] = السجل ['date']. تطبيق (lambda x: x.date ()) # ملف بتنسيق سجل "محادثة WhatsApp مع XXX.txt" ['conv_name'] = ملف [19: -4] إرجاع التاريخ

قمت بحفظ جميع محادثاتي في مجلد بيانات حتى أتمكن من سردها وتحميلها ودمجها في إطار بيانات واحد.

# سرد جميع الملفات في ملفات الدليل = os.listdir ('data') all = [] للملف في الملفات: history = read_history (file) all.append (history) history = pd.concat (all) .reset_index () # تظهر رسائل الوسائط كـ ، لذلك أحذفهم history_clean = history [history ['msg']! = ' "]

في النهاية ، لديّ إطار بيانات جميل يبدو كالتالي:

أولاً ، بعض الإحصائيات

كم عدد الرسائل التي تقول أنك أرسلتها على مدى السنوات الخمس الماضية؟ كم عدد الأشخاص الذين تحدثت معهم؟

في حالتي ، أرسلت أكثر من 350 ألف رسالة ، وتحدثت مع أكثر من 3000 شخص مختلف (بما في ذلك المحادثات الجماعية) وكان لدي 474 محادثة WhatsApp فريدة من نوعها.

ستوفر لنا البنية الأساسية لـ Pandas بسهولة الثلاثة جميعًا:

history_clean [history_clean ['name'] == 'Lai'] ['msg']. count () # عدد الرسائل المرسلة history_clean ['name']. nunique () # عدد الأشخاص الذين تحدثت إلي history_clean ['conv_name '] .nunique () # عدد المحادثات الفريدة

ولكن بالطبع نظرت في عدد وطول الرسائل التي أرسلتها واستلمتها على مر السنين. إليك بعض الأشياء الممتعة التي واجهتها:

أولاً ، عدد الرسائل التي أرسلتها على مر السنين:

# إنشاء مجموعة فرعية من إطار البيانات مع الرسائل التي أرسلتها فقط msg_lai = history_clean [history_clean ['name'] == 'Lai'] # Plot msg_lai.groupby (['date1']). count () ['msg' ].قطعة()

لقد فوجئت للغاية عندما رأيت هذا ، لأنه في كل مرة يسقط فيها مراسلتي ، أبدأ في مواعدة شخص ما: see_no_evil: (أي خلال عام 2014 ، وبين 2016 ومنتصف 2017).

لقد وجدت أيضًا أنه من المضحك جدًا أن ننظر إلى طول رسائلي:

history_clean.groupby (['date1']) ['msg_len']. يعني (). مؤامرة ()

لذا بالطبع نظرت إلى ذلك الغريب ووجدت هذا:

history_clean [history_clean ['msg_len'] == history_clean ['msg_len']. max ()] ['msg']. القيم

اتضح أن هذه رسالة من صديق يتمنى لي عيد ميلاد سعيد ("feliz cumple" باللغة الإسبانية) ، مرسلة في 19 مارس ، عيد ميلادي: little_smiling_face:

ولكن الآن الجزء الأكثر تسلية:

دعونا نلقي نظرة على الرموز التعبيرية!

اتضح أنني استخدمت ما مجموعه 369 رمزًا مختلفًا من الرموز التعبيرية (لم أكن أعرف حتى أن العديد من الرموز التعبيرية موجودة!): صرخة:

هذه هي الطريقة التي أحصل عليها: باستخدام مكتبة الرموز التعبيرية ، أقوم بإنشاء وظيفة لاستخراج الرموز التعبيرية من النص ، وتطبيقها على عمود "msg" ، واحتساب القيم الفريدة.

def extract_emojis (str): return '' .join (c for c in str if c in emoji.UNICODE_EMOJI) # msg_lai هي مجموعة فرعية من history_clean مع الرسائل المرسلة فقط len (set (msg_lai ['msg']. تطبيق (lambda x : extract_emojis (x)). sum ()))

ولكن الآن ، لنرى كيف تغير استخدامي للرموز التعبيرية بمرور الوقت.

أقوم بتعريف وظيفة لحساب عدد الرموز التعبيرية ، لكني أنظر فقط إلى أكثر 50 رمزًا تعبيريًا شائعًا لمنع إطار البيانات من أن يكون كبيرًا جدًا (هناك أكثر من 500 رمز تعبيري!).

def Count_Emojis (df): all_words = df ['msg']. تطبيق (lambda x: extract_emojis (x)). sum () word_count = Counter (all_words) مطلوب = {} أمر ['msg'] = [] # إنشاء أعمدة إطار البيانات الجديد مع 50 رمزًا تعبيريًا للمفتاح ، الرقم في word_count.most_common () [: 50]: مرتبة [key] = [] # املأ القيم بعدد الرموز التعبيرية في كل جملة للجملة في السلسلة :ause_count = عداد (extract_emojis (جملة)) للكلمة بالترتيب: count = جملة_ عدد [word] إذا كانت جملة عدد الكلمات [word] else 0 مرتبة [word] + = [count] # فقط أضف بعض المتغيرات الفئوية التي أود الاحتفاظ بها لأغراض التصفية مرتبة ['msg'] = قائمة (سلسلة) مرتبة ['date'] = list (df ['date']) مرتبة ['name'] = list (df ['name']) مرتبة ['conv_name '] = قائمة (df [' conv_name ']) بإرجاع pd.DataFrame (مرتبة)

بعد أن جاهدت لفترة من الوقت باستخدام أدوات تصور الثعبان المختلفة التي لا تتوافق مع الرموز التعبيرية كما كنت أتوقع ، وجدت أن Tableau كان سهلًا جدًا عندما يتعلق الأمر بالرموز التعبيرية ، لذلك قمت بتصدير إطار البيانات إلى CSV وقمت بإنشاء لوحة تحكم Tableau التي يمكنك تنزيل.

كنت سعيدًا برؤية أن حياتي مليئة بالحب والسعادة والمفاجأة!

وقد كنت مستمتعًا لرؤية مدى استخدامي للرموز التعبيرية لحظات مختلفة من حياتي:

لا تتردد في إلقاء نظرة وتنزيل لوحة التحكم العامة الخاصة بي Tableau ، وملئها ببياناتك الخاصة واللعب مثلي!

جميع الشفرات المستخدمة هنا متاحة بالكامل في My Github ، فلا تتردد في التواصل معي بأي أسئلة على [email protected] أو ترك تعليق!

أيضًا ، ألق نظرة على الجزء 2 لبعض نماذج موضوع WhatsApp!

نشر في الأصل في sprejerlaila.github.io.