تخطَّ إلى المحتوى

تحليل المشاعر بـ TensorFlow وFlask

الذكاء الاصطناعي التطبيقي

بقلم Elhabib Elhab · 18 دجنبر 2024 · مدة القراءة: 4 د

اسألني عن هذا على واتساب
تحليل المشاعر بـ TensorFlow وFlask

خلال تدريبي في Norsys Afrique، أتيحت لي فرصة رائعة للعمل على مشروع لتحليل المشاعر صار من أثمن تجاربي التعليمية. ولم يرسّخ هذا المشروع شغفي بالتطبيقات العملية للذكاء الاصطناعي فحسب، بل علّمني أيضًا أهمية ردم الهوّة بين المعرفة النظرية والتنفيذ في الواقع.

التحدّي: فهم مشاعر الزبناء على نطاق واسع

كانت Norsys Afrique بحاجة إلى نظام يحلّل آراء الزبناء الواردة من عدّة قنوات:

  • الإشارات على وسائل التواصل
  • تذاكر دعم الزبناء
  • تقييمات المنتجات
  • إجابات الاستبيانات

وكان الهدف تصنيف المشاعر تلقائيًا وتقديم خلاصات قابلة للتنفيذ لتحسين تجربة الزبون وقرارات النشاط.

المقاربة التقنية

1. جمع البيانات وتجهيزها

كان التحدّي الأول هو تجميع بيانات نصّية متنوّعة وتنظيفها:

import pandas as pd
import re
from textblob import TextBlob
import nltk
from nltk.corpus import stopwords
 
class DataPreprocessor:
    def __init__(self):
        self.stop_words = set(stopwords.words('french', 'arabic', 'english'))
        
    def clean_text(self, text):
        # Remove special characters and normalize
        text = re.sub(r'[^\w\s]', '', text)
        text = text.lower()
        
        # Remove stopwords
        words = text.split()
        words = [word for word in words if word not in self.stop_words]
        
        return ' '.join(words)
    
    def preprocess_dataset(self, df):
        df['cleaned_text'] = df['text'].apply(self.clean_text)
        return df

2. بنية النموذج مع TensorFlow

صمّمت مقاربة هجينة تجمع بين تقنيات معالجة اللغة الطبيعية التقليدية والتعلّم العميق:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense, Dropout
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
 
class SentimentAnalysisModel:
    def __init__(self, vocab_size=10000, max_length=100):
        self.vocab_size = vocab_size
        self.max_length = max_length
        self.tokenizer = Tokenizer(num_words=vocab_size)
        
    def build_model(self):
        model = Sequential([
            Embedding(self.vocab_size, 128, input_length=self.max_length),
            LSTM(64, return_sequences=True),
            Dropout(0.3),
            LSTM(32),
            Dropout(0.3),
            Dense(16, activation='relu'),
            Dense(3, activation='softmax')  # Positive, Negative, Neutral
        ])
        
        model.compile(
            optimizer='adam',
            loss='categorical_crossentropy',
            metrics=['accuracy']
        )
        
        return model
    
    def train_model(self, X_train, y_train, X_val, y_val):
        model = self.build_model()
        
        # Tokenize and pad sequences
        X_train_seq = self.tokenizer.texts_to_sequences(X_train)
        X_train_padded = pad_sequences(X_train_seq, maxlen=self.max_length)
        
        X_val_seq = self.tokenizer.texts_to_sequences(X_val)
        X_val_padded = pad_sequences(X_val_seq, maxlen=self.max_length)
        
        # Train the model
        history = model.fit(
            X_train_padded, y_train,
            validation_data=(X_val_padded, y_val),
            epochs=50,
            batch_size=32,
            verbose=1
        )
        
        return model, history

3. تطوير الواجهة البرمجية بـ Flask

لجعل النموذج متاحًا للاستعمال، أنشأت واجهة برمجية بأسلوب REST:

from flask import Flask, request, jsonify
import pickle
import numpy as np
 
app = Flask(__name__)
 
# Load the trained model
model = tf.keras.models.load_model('sentiment_model.h5')
tokenizer = pickle.load(open('tokenizer.pkl', 'rb'))
 
@app.route('/predict', methods=['POST'])
def predict_sentiment():
    try:
        data = request.get_json()
        text = data['text']
        
        # Preprocess the text
        cleaned_text = preprocess_text(text)
        
        # Tokenize and pad
        sequence = tokenizer.texts_to_sequences([cleaned_text])
        padded_sequence = pad_sequences(sequence, maxlen=100)
        
        # Make prediction
        prediction = model.predict(padded_sequence)
        sentiment = np.argmax(prediction[0])
        
        # Map to sentiment labels
        sentiment_labels = {0: 'Negative', 1: 'Neutral', 2: 'Positive'}
        confidence = float(np.max(prediction[0]))
        
        return jsonify({
            'sentiment': sentiment_labels[sentiment],
            'confidence': confidence,
            'text': text
        })
        
    except Exception as e:
        return jsonify({'error': str(e)}), 500
 
if __name__ == '__main__':
    app.run(debug=True)

أداء النموذج

لم أُعِد التحقّق من أداء هذا النموذج مقابل سجلّات التدريب الأصلية من فترة التدريب، ولذلك لا أنشر أي أرقام للدقّة أو الإحكام أو الاستدعاء أو مقياس F1.

ما الذي يغيّره نظام كهذا:

  • سرعة المعالجة: تُصنَّف الآراء فور وصولها بدل انتظارها في طابور مراجعة
  • الاتساق: يطبّق النموذج نفسه المعايير نفسها على كل نصّ، بما يزيل التفاوت بين مُقيِّم وآخر
  • الطاقة الاستيعابية: بعد النشر خلف واجهة Flask، يصبح الحجم محكومًا بالبنية التحتية لا بعدد المحلّلين

لا أملك بيانات Norsys Afrique الداخلية عن التكاليف أو عدد الموظّفين، لذا لا أُرفق هنا رقمًا عن وفورات التكلفة ولا عبارة «أسرع بكذا مرّة»، فذلك يتطلّب خطّ أساس خاصًا بالشركة للقياس عليه.

التحدّيات والحلول

1. دعم عدّة لغات

التحدّي: التعامل مع نصوص بالفرنسية والعربية والإنجليزية الحلّ: كشف اللغة تلقائيًا ومسارات تجهيز منفصلة لكل لغة

2. عدم توازن مجموعة البيانات

التحدّي: عيّنات محايدة أكثر بكثير من الإيجابية أو السلبية الحلّ: استعمال SMOTE للزيادة العيّنية ووزن الفئات أثناء التدريب

3. المعالجة الفورية

التحدّي: متطلّبات زمن استجابة الواجهة البرمجية الحلّ: تحسين النموذج واعتماد استراتيجيات تخزين مؤقت

# Caching implementation
from functools import lru_cache
 
@lru_cache(maxsize=1000)
def cached_prediction(text_hash, text):
    return model.predict(padded_sequence)

أبرز ما تعلّمته

مهارات تقنية اكتسبتها:

  • TensorFlow / Keras: تطوير نماذج التعلّم العميق
  • تقنيات معالجة اللغة الطبيعية: تجهيز النصوص والتقطيع والتضمين اللغوي
  • تطوير الواجهات البرمجية: Flask وخدمات REST ومعالجة الأخطاء
  • نشر النماذج: اعتبارات الإنتاج وتحسين الأداء

مهارات شخصية طوّرتها:

  • حلّ المشكلات: تفكيك متطلّبات معقّدة
  • التواصل: شرح مفاهيم تقنية لأطراف غير تقنية
  • إدارة المشاريع: الالتزام بالمواعيد والمخرجات
  • التوثيق: إنتاج توثيق تقني شامل

تحسينات مقبلة

  1. بنى متقدّمة: تجربة BERT ونماذج المحوّلات
  2. المعالجة التدفّقية: اعتماد Kafka لتحليل المشاعر آنيًا
  3. التحليل متعدّد الوسائط: إدماج الصور والفيديو
  4. اختبارات A/B: إطار لمقارنة أداء النماذج

بنية مستودع الشيفرة

sentiment-analysis/
├── data/
│   ├── raw/
│   └── processed/
├── models/
│   ├── sentiment_model.h5
│   └── tokenizer.pkl
├── src/
│   ├── preprocessing.py
│   ├── model_training.py
│   └── api.py
├── tests/
└── requirements.txt

خلاصة

كان هذا المشروع نقطة تحوّل في فهمي لقدرة الذكاء الاصطناعي على حلّ مشكلات أعمال حقيقية. وقد علّمني الجمع بين المعرفة النظرية والتنفيذ العملي أن مشاريع الذكاء الاصطناعي الناجحة تتطلّب:

  1. تعريفًا واضحًا للمشكلة: فهم الحاجة التجارية
  2. بيانات جيدة: فهي أساس أي مشروع تعلّم آلي
  3. تطويرًا تكراريًا: تحسينًا واختبارًا مستمرّين
  4. تصميمًا يتمحور حول المستخدم: بناء حلول يرغب الناس فعلًا في استعمالها

وقد رسّخت تجربة Norsys Afrique شغفي ببناء تطبيقات ذكاء اصطناعي عملية تُحدث فرقًا حقيقيًا في تشغيل الأنشطة.


تدير وكالة جولات أو رياضًا أو دار ضيافة أو مشروعًا محليًا؟ أرسل لي موقعك أو ملفك التجاري على Google، وسأخبرك بلغة واضحة أين يتردّد الزوار وما الذي سأصلحه أولًا. احصل على تدقيق مجاني لموقعك.

للاطّلاع على أعمال عملاء منجزة فعليًا بدل النماذج الأولية، راجع دراسات الحالة. تبني شيئًا مشابهًا؟ اطّلع على الخدمات ذات الصلة.

تقرير نمو مجاني

اكتشف ما يُفقدك العملاء، واحصل على الإصلاحات

الصق عنوان موقعك. في نحو دقيقتين يقرأ التقرير موقعك، ويفهم ما تبيعه ولمن، ثم يعطيك الإصلاحات الدقيقة ومساعدك الذكي وخطة لمدة 90 يومًا.

  • مجاني
  • نحو دقيقتين
  • دون أي مكالمة

يناسب كل أنواع الأنشطة التجارية

  • المطاعم والمقاهي
  • العيادات وأطباء الأسنان
  • المحلات والمتاجر الإلكترونية
  • الفنادق ودور الضيافة
  • الرحلات والأنشطة
  • صالونات التجميل والسبا
  • المحامون والمحاسبون
  • الحرفيون وخدمات المنازل