مستوى المقال: مبتدئ. يكفي أن تعرف إن "المتجه" مجرد قائمة أرقام. لا تحتاج أي رياضيات متقدمة، هنشرح كل حاجة بمثال أول.
التضمين (Embeddings): تحويل الكلمات لأرقام لها معنى
بعد المقال ده هتعرف إزاي الكمبيوتر يقيس إن كلمة "قط" أقرب لـ"قطة" منها لـ"سيارة"، وتقدر تبني بحث بيفهم المعنى مش بس الحروف المتطابقة.
المشكلة باختصار
الكمبيوتر مبيفهمش كلام. بيفهم أرقام بس. لو خزّنت كلمة "قط" كنص، الكمبيوتر يقدر يقارنها حرفيًا بكلمة تانية: متطابقة ولا لأ. خلاص. مفيش عنده فكرة إن "قط" و"قطة" معناهم قريب، وإن "سيارة" بعيدة عنهم. المشكلة دي بتظهر بوضوح لما تبني بحث. لو المستخدم كتب "موبايل" وانت مخزّن "هاتف محمول"، البحث الحرفي هيرجّع صفر نتائج رغم إنهم نفس الحاجة.
مثال يقرّب الفكرة: خريطة المعاني
تخيّل إن عندك خريطة، لكن بدل ما تحط عليها مدن، بتحط عليها كلمات. كل كلمة ليها إحداثيات (زي خطوط الطول والعرض). القاعدة الوحيدة في الخريطة دي: الكلمات اللي معناها قريب، بتتحط قريّبة من بعض في المكان.
يبقى "قط" و"قطة" هيبقوا جنب بعض في ركن الحيوانات. و"تفاحة" و"موزة" في ركن تاني بعيد، ركن الفاكهة. لو سألت "إيه أقرب كلمة لـقط؟"، بترد بأقرب نقطة على الخريطة. الصورة اللي فوق دي بالظبط خريطة زي كده: شوف "king" و"queen" و"prince" متجمّعين، و"dog" و"cat" في ناحية، والفاكهة في ناحية تالتة.
الإحداثيات دي هي الـ Embedding. الفرق الوحيد إن الخريطة الحقيقية مش بُعدين (طول وعرض) بس، دي مئات الأبعاد. بس الفكرة واحدة: مكان = معنى.
يعني إيه Embedding بالظبط؟
الـ Embedding هو قائمة أرقام (متجه) بتمثّل كلمة أو جملة. نموذج مدرّب على كميات ضخمة من النصوص بيتعلّم يدّي كل كلمة متجه، بحيث الكلمات اللي بتظهر في سياقات متشابهة تاخد متجهات متقاربة. مثلًا نموذج زي paraphrase-multilingual-MiniLM-L12-v2 بيطلع لكل جملة متجه فيه 384 رقم. النموذج مشافش تعريف "قط" في قاموس؛ اتعلّم معناها من إنها بتيجي جنب كلمات زي "مواء" و"حيوان" و"ذيل" في ملايين الجمل.
الافتراض المهم هنا: الكلمات اللي بتشترك في السياق، بتشترك في المعنى. ده مبدأ لغوي قديم اسمه "الدلالة التوزيعية"، والنماذج الحديثة بتطبّقه بالأرقام.
إزاي نقيس التشابه؟ التشابه بالكوني
بعد ما بقى كل كلمة متجه، التشابه بقى مسألة هندسية بسيطة. بنقيس الزاوية بين المتجهين. زاوية صغيرة معناها اتجاه متقارب، يعني معنى متقارب. المقياس ده اسمه Cosine Similarity، وبيطلع رقم بين 1 (نفس الاتجاه، تشابه تام) و0 (مالهمش علاقة).
ركز في الصورة: "قط" و"قطة" الزاوية بينهم صغيرة، فالتشابه عالي. "سيارة" اتجاهها بعيد، فالتشابه واطي. الكود ده بيعمل نفس الحساب فعليًا:
# pip install sentence-transformers
from sentence_transformers import SentenceTransformer, util
# نموذج بيدعم العربي، ويطلع متجه فيه 384 رقم لكل جملة
model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
words = ["قط", "قطة", "سيارة"]
emb = model.encode(words)
print(util.cos_sim(emb[0], emb[1]).item()) # قط vs قطة ≈ 0.82
print(util.cos_sim(emb[0], emb[2]).item()) # قط vs سيارة ≈ 0.18