تطبيقات

تصنيف التغريدات

لدينا ثلاثة ملفات:

  1. الأول يحوي تغريدات
  2. الثاني يحوي كلمات إيجابية
  3. الثالث يحوي كلمات سلبية

نريد تصنيف التغريدات بناءً على عدد الكلمات الإيجابية والسلبية فيها.

from pathlib import Path

data_dir = Path('../../datasets/tweets')

بعد النظر في شكل الملفات. يتبين لنا أن السطر الواحد يحتوي على “شيء” واحد. وبالتالي سنقسم البيانات على كل سطر.

ونلاحظ أيضًا وجود أسطر خاوية، يجب التخلص منها.

def read_lines(file_path: Path) -> list[str]:
    """skips empty lines and converts to lowercase"""
    result = []
    with open(file_path, 'r') as file:
        for line in file:
            x = line.strip()
            if len(x) > 0:
                x = x.lower()
                result.append(x)
    return result

نستدعي الإجراء لقراءة الملفات الثلاث:

tweets = read_lines(data_dir / 'tweets.txt')
positive_words = read_lines(data_dir / 'words_positive.txt')
negative_words = read_lines(data_dir / 'words_negative.txt') 
for i, tweet in enumerate(tweets):
    print(i, tweet)
0 أشعر بامتنان عميق للأشخاص الرائعين في حياتي! كل يوم معهم هو هدية جميلة
1 الزهور المتفتحة تملأ المكان بألوانها الزاهية وعطرها الفواح! والعصافير تغرد بأجمل الألحان تحت أشعة الشمس الدافئة! يوم مثالي بكل تفاصيله
2 الرجل العجوز قدوة في العطاء والكرم! يسعد دائماً بمساعدة الآخرين ويترك أثراً طيباً في كل من حوله! محبوب من الجميع لطيبة قلبه
3 أتمنى لكم جميعاً يوماً مشرقاً مليئاً بالإنجازات والنجاحات! متحمس جداً لرؤية ابتساماتكم السعيدة!
4 متحمس جداً للتحديات الجديدة! كل يوم فرصة للتعلم والنمو والتطور!
5 تعذبت اليوم برحلة مزعجة في طريقي، رأيت مناظر مقرفة من حولي وأنا أتحمل ضجيج الطبيعة المزعجة
6 صباح سيئ! استيقظت متأخراً وشربت فنجان قهوة مر. متوتر وقلق من لقاء زملائي المزعجين في العمل!
7 أصوات الحياة من حولي تملأني إرهاقاً! أتعذب بالعمل من المنزل وأشعر بالملل والإحباط!
8 قضيت أمسية متعبة مع أصدقائي المزعجين! تشاجرنا كثيراً وتذكرنا أسوأ الذكريات! أشعر بالحزن والضيق من وجودهم في حياتي!
for p in positive_words:
    print(p)
ممتن
امتنان
رائع
جميل
هدية
زاهية
فواح
أجمل
دافئة
مثالي
قدوة
عطاء
كرم
يسعد
مساعدة
طيب
محبوب
مشرق
إنجازات
نجاحات
متحمس
ابتسامات
سعيدة
تعلم
نمو
تطور
فرصة
سعيد
for n in negative_words:
    print(n)
تعذب
مزعج
مقرف
ضجيج
سيئ
متأخر
مر
متوتر
قلق
إرهاق
أتعذب
ملل
إحباط
متعب
تشاجر
أسوأ
حزن
ضيق
مزعجين
متضايق
مرهق
فائت
غير مرتاح
وحيد
حزين

الآن نقوم بتصنيف التغريدات:

def classify(text: str) -> (int, int):
    """Returns the number of positive and negative words in the text"""
    
    positive_count = 0
    for word in positive_words:
        if word in text:
            positive_count += 1
    
    negative_count = 0
    for word in negative_words:
        if word in text:
            negative_count += 1
    
    return positive_count, negative_count

assert classify('أنا سعيد') == (1, 0)
assert classify('أنا حزين') == (0, 1)
assert classify('سعيد حزين اليوم') == (1, 1)
assert classify('اذهب إلى الدكان') == (0, 0)

نستدعي الإجراء على التغريدات، ونفرز النتائج في ثلاثة قوائم:

positive_tweets = []
negative_tweets = []
neutral_tweets = []
for tweet in tweets:
    pos, neg = classify(tweet)
    score = pos - neg
    print(f'-{neg} +{pos} = {score:+}')
    if score > 0:
        positive_tweets.append((tweet, score))
    elif score < 0:
        negative_tweets.append((tweet, score))
    else:
        neutral_tweets.append((tweet, score))
-0 +4 = +4
-0 +5 = +5
-0 +7 = +7
-0 +7 = +7
-0 +5 = +5
-4 +0 = -4
-7 +0 = -7
-5 +0 = -5
-7 +0 = -7

نعرض التغريدات بحسب التصنيف مرتبة بقوة التصنيف من الأعلى إلى الأسفل:

print('positive_tweets:')
for tweet, score in sorted(positive_tweets, key=lambda x: x[1], reverse=True):
    print(f'{score:+} {tweet}')
positive_tweets:
+7 الرجل العجوز قدوة في العطاء والكرم! يسعد دائماً بمساعدة الآخرين ويترك أثراً طيباً في كل من حوله! محبوب من الجميع لطيبة قلبه
+7 أتمنى لكم جميعاً يوماً مشرقاً مليئاً بالإنجازات والنجاحات! متحمس جداً لرؤية ابتساماتكم السعيدة!
+5 الزهور المتفتحة تملأ المكان بألوانها الزاهية وعطرها الفواح! والعصافير تغرد بأجمل الألحان تحت أشعة الشمس الدافئة! يوم مثالي بكل تفاصيله
+5 متحمس جداً للتحديات الجديدة! كل يوم فرصة للتعلم والنمو والتطور!
+4 أشعر بامتنان عميق للأشخاص الرائعين في حياتي! كل يوم معهم هو هدية جميلة
print('negative_tweets:')
for tweet, score in sorted(negative_tweets, key=lambda x: x[1]):
    print(f'{score:+} {tweet}')
negative_tweets:
-7 صباح سيئ! استيقظت متأخراً وشربت فنجان قهوة مر. متوتر وقلق من لقاء زملائي المزعجين في العمل!
-7 قضيت أمسية متعبة مع أصدقائي المزعجين! تشاجرنا كثيراً وتذكرنا أسوأ الذكريات! أشعر بالحزن والضيق من وجودهم في حياتي!
-5 أصوات الحياة من حولي تملأني إرهاقاً! أتعذب بالعمل من المنزل وأشعر بالملل والإحباط!
-4 تعذبت اليوم برحلة مزعجة في طريقي، رأيت مناظر مقرفة من حولي وأنا أتحمل ضجيج الطبيعة المزعجة
print('neutral_tweets:')
for tweet, score in neutral_tweets:
    print(f'{score} {tweet}')
neutral_tweets: