معظم خوارزميات تعلم الالة لا يمكنها التعامل مع البيانات النصية. لذا يحب تحويل البيانات النصية الي بيانات رقمية وهو ما يعرف باستخراج الخصائص من النصوص (Feature extraction from text) حيث يتم تحويل النص الى مصفوفة من البيانات الرقمية. في هذا المقال سوف نستخدم دالتين من مكتبة scikit-learn وهي:
- CountVectorizer
- TfidfVectorizer
في البداية سوف نفرض أن لدينا البيانات التالية:
In:
text = ["الفندق جميل",
"عند وصولي الى الفندق لم اجد الغرفة مرتبة",
"كان الفندق رائع وكذلك الغرفة نظيفة"]
اولاً: CountVectorizer
في البداية يتم عمل قاموس بكل كلمات الموجودة في البيانات النصية. بحيث لا تكون الكلمات متكررة ولو تكررت بعض الكلمات اكثر من مرة في البيانات تكون موجودة مرة واحدة في القاموس. يتم التعبير عن كل صف في البيانات بـ vector بحيث تكون جميع قيمة اصفار ما عدا الكلمات الموجودة في الصف تاخذ قيمة رقمية تمثل عدد مرات تكرارها. ويمكن أن يتم ذلك من خلال الخطوات التالية:
1. بناء قاموس الكلمات كما يلي:
In: from sklearn.feature_extraction.text import CountVectorizer vectorizer = CountVectorizer() vectorizer.fit(text) print(sorted(vectorizer.vocabulary_.items())) Out: [('اجد', 0), ('الغرفة', 1), ('الفندق', 2), ('الى', 3), ('جميل', 4), ('رائع', 5), ('عند', 6), ('كان', 7), ('لم', 8), ('مرتبة', 9), ('نظيفة', 10), ('وصولي', 11), ('وكذلك', 12)]
2. بناء المصفوفة الرقمية
In: vector = vectorizer.transform(text) print(vector.toarray()) Out: [[0 0 1 0 1 0 0 0 0 0 0 0 0] [1 1 1 1 0 0 1 0 1 1 0 1 0] [0 1 1 0 0 1 0 1 0 0 1 0 1]]
ثانياً: TfidfVectorizer
تقوم هذه الدلة بتحويل النص الى مصوفة رقمية تحوي أوزان (weights) باستخدام TFIDF وهو مقياس رقمي يعكس مدى أهمية كلمة لصف في البيانات من خلال اعطائها وزن يحسب من خلال الصيغة التالية:
\[TFIDF=TF(w,r)\times IDF(w)\]
حيث أن: $TF(w,r)$: عدد مرات تكرار الكلمة $w$ في الصف $r$.
كذلك:
\[IDF(w)=\log\left(\frac{1+n}{1+DF(w)}\right )+1\]
حيث أن: $DF(w)$: عدد الصفوف التي تحوي الكلمة $w$ و $n$ عدد الصفوف في البيانات. ويمكن أن يتم ذلك من خلال الخطوات التالية:
1. بناء قاموس الكلمات كما يلي:
In: from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer() vectorizer.fit(text) print(sorted(vectorizer.vocabulary_.items())) Out: [('اجد', 0), ('الغرفة', 1), ('الفندق', 2), ('الى', 3), ('جميل', 4), ('رائع', 5), ('عند', 6), ('كان', 7), ('لم', 8), ('مرتبة', 9), ('نظيفة', 10), ('وصولي', 11), ('وكذلك', 12)]
2. بناء مصفوفة الأوزان
In: vector = vectorizer.transform(text) print(vector.toarray()) Out: [[0. 0. 0.50854232 0. 0.861037 0. 0. 0. 0. 0. 0. 0. 0. ] [0.37994462 0.28895767 0.22440141 0.37994462 0. 0. 0.37994462 0. 0.37994462 0.37994462 0. 0.37994462 0. ] [0. 0.34261996 0.26607496 0. 0. 0.45050407 0. 0.45050407 0. 0. 0.45050407 0. 0.45050407]]