باسم الله والحمد لله والصلاة والسلام على رسول الله
أهلاً وسهلاً بكم في المحاضرة التالية في مساق تنقيب
البيانات، نتكلم على الـ Clustering، كنا غطينا في
chapter الـ Clustering، مفهوم الـ Clustering أنه
عبارة عن تقسيم الـ Data set اللي موجودة عندي
لمجموعات بناءً على الـ Similarities أو التشابه ما
بين الـ Instances اللي موجودة فيها، وذكرنا أن الـ
Clustering يأخذ واحدة من نوعين: إما Partitional
Clustering، وهي عبارة عن مجموعة من الـ Clusters أو
نعم، مجموعة من الـ Clusters اللي بيكون الـ Disjoint
أو التقاطعات بينهم صفر، ما فيش نقاط مشتركة ما بينهم،
وبالتالي كل Element موجود في Cluster واحد فقط، وفي
عندنا، حكينا أنه في عندنا... وشوفنا على المثال هذا
على مثل Partitional K-means، واتكلمنا عليه بالتفصيل
في المحاضرة إن شاء الله تعالى، سنتكلم على
النوع الثاني من الـ Clustering اللي هو الـ
Hierarchical Clustering، إن شاء الله تعالى، عندما
نتكلم عن Hierarchical Clustering، يعني أننا نتكلم
عن Clustering تجميعي، الفكرة فيه أنه عندما نتكلم عن
Agglomerative، الـ Hierarchical أو الـ Agglomerative
مترادفان، لأن كل Hierarchical يتعلق بـ Agglomerative
يعني تجميعي، Agglomerative Clustering عادةً
نُشير لكل الـ Clustering Algorithms التي تبني على نفس
المبدأ، وهو تجميع البيانات اللي موجودة عندنا، فكرة
الـ Agglomerative Clustering بشكل عام، بتتركز أنه
يبدأ، بيعرف أن كل نقطة كـ Cluster مستقل، وبعد ذلك
يعمل Merge أو Combine لكل Two Similar Clusters بناءً
على ايش؟ الـ Similarity، Cluster معناته في عندي
Similarity Distance أو Similarity Function زي ما
شوفناها في الـ Partitional، لازم تُطبق عندنا، وهذا
الـ Similarity Function هي اللي هتكون معيار دمج أو
قبول، دمج أو رفض دمج الـ Two Clusters اللي
موجودين عندي، طبعاً، وهذا الكلام بيستمر لحد ما يتوصل
يتحقق عندي شرط توقف معين، شرط التوقف يكون عبارة عن
عدد الـ Clusters اللي اتكلمت عليه، أنا بدي أعمل دمج
دمج دمج لحد ما أوصل لـ 3 Clusters، فعلياً الـ Data اللي
عندي هتبدأ من واحد واحد واحد واحد، بعد هيك هيبدأ
يتجمعوا، آخر تجميع اللي ممكن أوصل إليه، هذا مفهوم
أن يكون عندي 3 Clusters أو 4 Clusters أو 10
Clusters حسب الحاجة، وبهيك أنا فعلياً هذا شرطي
التوقف اللي موجود عندي، أو فعلياً أنا ما ضلّ عندي
شيء أدمجه، اندمجت كل البيانات لحد ما
صارت Only One Cluster بيحتوي كل الـ Sub Clusters
اللي جاية بعد هيك، طبعاً أنا في عندي Linkage
Criteria أو شرط الدمج، أو سمّيناها Linkage، دلالة على
أنه أنا فعلياً عندي Clusterين وبدي أربطهم مع بعض، بدي
أحطهم في قالب أو عفواً في ضمن Boundary واحدة، طبعاً
عندما أتكلم عن الـ Linkage Criteria أو الـ Linkage
Function، نفس المصطلح، الـ Similarity Function للـ
Clusters، بس دائماً عندما أتكلم عن الـ Similarity
بتكلم عن الـ Distance، عفواً، بتكلم عن الـ Distance
لكن عندما أتكلم عن الـ Linkage Criteria، بتكلم عن أن
أنا فعلياً بتكلم عن الـ Clustering، بتكلم عن Linkage
أو ربط ما بين الـ Clusters، فعلياً أنا بتكلم برضه عن
الـ Distance، والـ Distance هذه تُقاس مع كل الـ
Observations أو كل الـ Instances اللي موجودة عندنا،
وين؟ في داخل الـ Cluster اللي موجود عندنا، فعلياً أنا
في عندي مجموعة من الـ Linkage Criteria، وهذه الـ
Linkage Criteria بتحدد فعلياً هل هدول الـ Clusters
Similar أم لا، وبالتالي، يعني بالخلاصة، فكرة الـ
Agglomerative أو الـ Hierarchical Clustering بتبدأ
بأن كل نقطة عبارة عن Cluster مستقل، وبعد هيك بيصير
ادمج ما بين كل Two Clusters، الشرط للدمج أنه في عندي
شيء بنسميه الـ Linkage Criteria أو الـ Linkage
Distance أو الـ Linkage Function اللي هي شرط الدمج
هنا، وهي عبارة عن Distance Measure، لكن مش مع نقطة، مع
Cluster، وبالتالي ممكن أنا آخذ نقطة، نُطبق على
Cluster، ممكن آخذ كل Cluster، وحنشوف الـ Different
Linkage Criteria اللي موجودة عندنا، نبدأ مع أول الـ
Linkage Criteria، الـ Criteria اللي هي الـ Criterion
اللي هي الـ Single، ولما أنا بتكلم على Single
Linkage، بتكلم أنه أنا فعلياً بدور على أقصر Pair
يعني بين جُثتين، بأحسن الـ Point اللي أنا فيه،
عندي Two Clusters، زي... زي ما ال... أوكي، خليني مش
مشكلة، برجع فيه، عندي أنا هنا Two Clusters، Two
Clusters، وفي الـ Two Clusters هدول أنا بروح بدور
على كل النقاط، يعني بحسب النقطة هاي مع كل الـ
Distances الموجودة، في كل الأحوال يا جماعة الخير الـ
Distances هتنحسب ما بين كل عناصر الـ Cluster، وكذلك
High، يعني أنت تخيلها Fully Connected Distances أو
تخيلوها معايا Fully Connected Area، فبتحسب كل الـ
Distances اللي موجودة عندنا، الآن الـ Pair، Pair of
Clusters اللي بيحقق أقصر مسافة بين أي Two Pairs من
النقاط اللي موجودة عندنا، بأخذه على أنه اللي هو الـ
يعني عمل Home Dungeon، يعني لو أنا بدي أُعيد تاني،
لو أنا افترضت أن أنا في عندي Three Different
Clusters، لو
كان أنا في عندي Another Cluster، والـ Cluster ده
فيه مجموعة من النقاط، تبدأ
المسافات تُحسب ما بين كل النقاط اللي موجودة في كل
اتجاه، من كل نقطة، الـ Pair of Clusters اللي بتحقق
أقصر مسافة بين أي نقطتين موجودتين فيهم، بنعتمد أن
هدول الـ Clusters، في حين أن أنا في عندي هنا في
Pair بعيد جداً، وأنا ما بدور هون، بدور على أقصر
المسافات، يعني الآن هدول أقرب نقطتين لبعض، هيهم
بأقارن المسافة هذه ومسافة هذين، من أقصر المسافة هذه،
أقصر، معناته هذين الاثنين بنعمل لهم دمج مع بعضهم،
على أنهم هدول ايش؟ بيصيروا الـ Next Level أو الـ
Next Cluster، هذه فكرة، كمان مرة، الـ Single Linkage،
طبعاً احنا ليش بحاول أوضحها هون أكثر لأن فعلياً احنا
محتاجين نفهمها كويس، لأن أنا فعلياً بدي كل النقاط
اللي موجودة تكون داخلة في الحسبة، بنرجع كمان مرة في
عندي أنا Single Linkage، و Single Linkage بعمل
Combine لـ Two Clusters لما بيكون فيهم الـ Shortest
Pair، لما يكون في عندي أنا فعلياً ال... هذه البيانات
تبعتي، أصغر
ما بين الـ Minimum Distance Between Any Pair، بشرط
أن هدول الـ Pair ما يكونوش تمدمجهم مسبقاً، طبعاً،
كمان مرة، لو أنا افترضت أن هنا في عندي Another
Cluster، و
الـ Cluster هي وهي النقاط اللي موجودة، دائماً
دائماً في عملية، وهنا في كمان واحد، دائماً في عملية
الدمج، بروح
بدور، لما بتكلم عن الـ Single Linkage، بروح بدور على
أقصر مسافة، هدول أقرب نقطتين، بحسب الـ Distance بينهم
هو كيف بده يدور على أنه أقرب نقطتين؟ هو فعلياً بتم
حسب الـ Distance ما بين كل العناصر اللي في الـ
Clusters، يعني النقطة هذه مع كل العناصر اللي موجودة
هنا، وبيعتمد أقصر مسافة، النقطة مع كل العناصر، كل النقاط
اللي هنا مع كل النقاط اللي هنا، وبيعتمد أقصر مسافة،
وبالتالي، لو أنا هذه النقطة هيروح يحسبها مع هذول
كمان، وبيعتمد هذه أقصر مسافة، الآن هي مسافة هذين،
ثلاثة، هدول أقصر، أقصر واحدة فيهم، هذه، بيروح
بعمل دمج لمين؟ لهذول، اصحاب Single Linkage، بتمنى
تكون الفكرة وصلت
الـ Criterion الثاني اللي موجودة عندي أنا اللي هي
الـ Average، والـ Average هنا بتتكلم على أنه أنا
بيعمل Merge لـ Two Clusters، اللي بيكون Shortest
Average Distance، Shortest Average Distance، يعني
ايش اللي حيصير؟ بعد ما راح حسب كل الـ Distances بين
كل النقاط،
بين كل النقاط، ايش بروح بيساوي؟ بياخد الـ Average
تبعت الـ Distance، لاحظوا أنا في كل مرة بيعمل
Marriage لـ Two Clusters فقط، تمام؟ بيعمل Marriage لـ
Two Clusters فقط، فهو بيروح بيحسب كل الـ Averages أو
بيحسب كل الـ Distances وبياخد الـ Average في الـ
Simple Linkage، أو عفواً في الـ Single، أنا غلطان هنا
في الكتابة، طبعاً Simple Linkage
Single، Single Linkage، سامحوني،
هذه أسهل حاجة أعملها الآن، لأن أنا حولت لصورة، و
ما بدي أرجع أُعيد نفس ال... Okay، Shift
F5، بنتكلم هنا إنه أنا بتكلم على الـ Single Linkage،
أخذت أقصر، لكن هون حسبت كل النقاط، وبالتالي أخذت الـ
Average، عشان إذا حاولت أرسم السهم هون، يمثل للـ
Center تبع الـ Clusters اللي موجودين عندنا، هذه
الـ Average، بالنسبة للـ... للـ Complete، بياخد الـ
Maximum Linkage، بياخد... بيعتمد... من وين؟ أطول...
أبعد نقطتين، أقصر مسافة بين أبعد نقطتين، بروح، بروح
مالهم، جنب
يعني لو أنا أجيت هنا، هذه العناصر اللي موجودة عندنا،
بحسب كل الـ Distances اللي موجودة عندنا، بكل
الاتجاهات، مع كل الـ Clusters، هذه أقصر... يعني هدول
أبعد نقطتين، نعم، لكن هذه الـ Distance اللي بين الـ Two
Clusters هدول، هي عبارة عن أقصر مسافة، مماثلة مع
Different Clusters، فبقرر أنه يعمل Merge للـ
Clusters اللي موجودين عندنا، النوع الثالث اللي هو الـ
Ward، الـ Ward، الـ Ward، أو الـ Ward، لما أنا
بتكلم هنا، بتكلم عن الـ Ward، القسم هنا، بدور، النوبة هو
يعمل Merge لـ Two Clusters، لما يقلل
الـ Variance بين الـ Clusters الموجودة، يقلل
الاختلافات بين الـ Clusters، يعني هو الآن بيحسب كل
النقاط، كل الـ Distances اللي موجودة عنده، بيحسب كل
الـ Distances وبيحسب كل الـ Distances وبيحاول يشوف
مين أقرب Cluster في الاختلافات، في الـ Elements اللي
موجود عنده هون، وبيروح بدمجهم، يعني هو ايش بيروح
بساوي؟ بكل بساطة،
بعد ما بيروح بيحسب، بيحسب كل الـ Areas، بيحسب الـ Variance
هنا، الاختلاف، والـ Variance اللي هنا مع الـ Cluster
الثالث، الـ Variance وأقل Clusters في اختلاف الـ
Variance اللي بينهم، بيروح بدمجهم، ليش؟ عشان يحافظ على
التشابه ما بين الـ Two Different Clusters، يعني أنت
تخيل أن في عندك Cluster كبير جداً وعندك Cluster
صغير جداً، هدول الـ Two Clusters صعب أنهم يدمجوا، ليش؟
مع الـ Ward، لأنهم فعلياً الـ Variance تبعتهم عالية
جداً، فهو بيروح بدور على الـ Clusters المشابهة بداخله،
By Default، بالمناسبة الـ Ward هي الـ Default Linkage
Hierarchical Clustering نفس.. نفس الكلام، يعني أنه
يحتاج كل point أن تدخل برحلة أن تصبح cluster مستقلة
ذاتها، وستنتمي إلى آخر cluster، يعني هذا الفرق الأساسي
ما بين الـ agglomerative و الـ hierarchical.
الـ agglomerative فعلياً سيُدمجها لي، لكن في المحصلة
الأخيرة يا جماعة الخير، أنا حصلت على partitional
clustering. ملاحظين هنا، الرسمة الأخيرة في step 9 هي
عبارة عن partitional لأن ليس لديّ عناصر
لكن في الـ hierarchical، لا، أنا أستطيع أن أحافظ على أن
العناصر التابعة تكون disjoint حتى مستوى معين. طيب،
الآن، كما قلنا، هذه هي الرسمة التي يمكنني الاعتماد عليها.
هو أن أقول أن، والله، هذا ما أفهمه من هذه، أن كل
واحدة من هذه كانت بهذا الشكل: 1 و 4 اندمجت معهما 2 و
8، اندمجت معهما 3 و 5 مستقلة، 0 و 1 و 2 اندمجت معهما 5
و 6 و 9، اندمجت معهما 7 و 10، اندمجت معهما 7 و 10
اندماجت معهما 7 و 10 اندمجت معهما 7 و 10 اندمجت
معهما 7 و 10 اندمجت معهما 7 و 10 اندمجت معهما 7 و
10 اندمجت معهما 7 و 10 اندمجت معهما 7 و 10 اندمجت
معهما 7 و 10 اندمجت معهما 7 و 10 اندمجت معهما 7 و
10 اندمجت معهما 7 و 10. ولكن لو أخذت نظرة
جانبية، يعني أنني أتعرف على شئ اسمه الـ
Dendrogram. الـ Dendrogram عبارة عن رسم تخطيطي يخدمني
في فهمي للبيانات الموجودة. الـ visualization
مهم جداً، لكي أستطيع أن أرى وأفهم العناصر التي
موجودة في موضوع الـ hierarchical clustering، والـ
dendrogram التي أرغب في تمثيلها، وبالتالي، ولما الـ
visualization يعطيني detailed view للـ hierarchical
clustering، فهذا يعني أنها ما زالت في البعدين
الأساسيين الموجودة، وبالتالي، أنا سأبقى أشتغل، و
سأبقى أسأل، وسنبقى نحاول أن نرسم الـ Dendrogram. أنتَ
تخيل الرسمة معي، لو ظهرت معي بهذا الشكل، طبعاً
هذان الرسمتان للـ Dendrogram هما الأساس الموجود
عندي هنا. الأولى، كما قلت لك، هي عبارة عن
الصورة العمودية من فوق، للـ clusters، ورأيت التجميعات
بينما هنا، أنا أتحدث عن أنني أرى البيانات كلها في
الـ 2D، أراها من نظرة جانبية، وهذه الرسمة هي عبارة
عن الـ Dendrogram. الآن، فكرة الـ Dendrogram أو الـ
Hierarchical Clustering الأساسية هي أنني أستطيع أن أحصي
على أي عدد من الـ clusters التي أحتاجها، يعني تخيل أنا
أحتاج three clusters، وسيبقى كل خط عمودي في الرسمة
يمثل cluster. أريد three clusters، ها هي. أريد اثنين،
ها هما. لاحظ؟ لماذا؟ لأنها فعلياً هذه كلها مع بعضها
عبارة عن cluster، وهذه مع بعضها عبارة عن cluster.
ثانياً، رسمت العمود مع العناصر الموجودة. أريد
ثلاثة. هذه الثلاثة ستصبح مع بعضها. إذا
أنا أريد أن أتحدث عن three clusters، يعني هذا واحد،
العشرة معها طبعاً، اثنان،
و هذا ثلاثة. هل أريد أكثر؟ نعم، لكن ماذا أريد؟ أن أزال
الـ scale الخاص بعدد الـ clusters إلى الأسفل، إلى أين؟
أريد أن يكون مثلاً، لو أنزلت عدد الـ clusters إلى هنا،
يعني أنا أتحدث عن single cluster واحد.
لا، ليس واحداً. الآن، هذا عندك واحد، هذا
اثنان، هذا ثلاثة، عشرة على حالها، هذا أربعة. أنا هنا
أتحدث عن four clusters، بناءً على النقطة التي
اخترتها. أهم شيء في الموضوع أنه أنا فعلياً لما أحصل
على الـ dendrogram، أستطيع أن أحصل على أي عدد من الـ
clusters التي أريده. أريد أن أعود مرة أخرى لأقول والله
أنا هنا أريد.. لو افترضت أنني هنا، هذا الخط
الخاص بي، عفواً،
رسمتي غير دقيقة بعض الشيء.
لو مشيت هنا، وقلت هذا مع الاثنين هنا، أريد
أن أمشي، okay.
أفضل من الأول. لو سألتك عند هذا الخط، كم cluster
أحصل عليه؟ أستطيع أن أقول أنني أتحدث عن four clusters.
four clusters: هذا واحد، يجمع واحد وأربعة. ثانياً، ايوه،
الثالث، العشرة وحدها، والرابع، هذه. عفواً، ليس أربعة،
هذه خمسة، five clusters، خمسة
clusters. طبعاً، هناك فائدة أخرى من الـ dendrogram، أنا
أستطيع أن أفهم أنه على الرغم من أن الـ cluster
الأخير هذا، الذي فيه 7 و 6 و 9، هذه الـ elements
في نفس الـ cluster، إلا أنه من خلال الـ
dendrogram، أستطيع أن أفهم أن 6 و 9 instances أقرب
لبعض من 7. كذلك، 0 و 11 في الـ cluster
الثالث، و 2 و 8 في الـ cluster الثاني. لكي نستطيع
أن نطبق هذا المثال، في مثال مشهور جداً أخذته سابقاً من
الـ slide الخاصة بالدكتور علاء، جزاه الله خيراً،
المثال
المشهور أيضاً. أنا لديّ خريطة إيطاليا، وأريد
أن أعتبر أن المدن هذه بمثابة Clustering، هو أنا الـ
clusters، وأريد أن أذهب لأعمل بينها merge، لأرى
أقرب المدن لبعضها، باعتماد على الـ single linkage
criterion. single linkage criterion. الآن، عفواً، لما
أنا أتحدث، هذه رموز للولايات أو المدن في إيطاليا.
طبعاً، من ذهب إلى إيطاليا من بينكم؟ لأن أنتم
فرحانين. لكن، بالطبع، بارما
ليست من ضمنها، أو موجودة. هي بارما. طيب، الآن فعلياً، الـ
contingency matrix، النتيجة التي ستحصل عليها عبارة عن
Symmetric Matrix، وفيها كل العناصر الموجودة
عندي هنا. وبناءً عليها، أنا أريد أن أقرر. الآن، بارما، بارما،
أقصر distance، أين؟ مع من؟ فأنا فعلياً أذهب لأبحث عن
الـ shortest distance. أنا الآن هنا، okay، 250، وأبدأ
أن أبحث. لكن، عندما وجدنا أن هناك مسافة أقصر منها موجودة،
أين؟
تربط Milano و TMI و TO، وبالتالي، هذه أقصر
ملاحظين يا جماعة الخير، أنا رأيت الـ distance مع
الكل، بين الكل. لم أعتمد السفر، لأنها مدينة مع
نفسها. لا أريدها cluster مع نفسها، أو الـ
instance مع نفسها. لكن هنا، ذهبت لأبحث حتى وصلت إلى
مسافة أصغر، مسافة في كل المسافات الموجودة لديّ
هنا، وبالتالي، فعلياً هذه المسافة هنا، و
نفس الكلام، mi مع كل المدن، و fi مع كل المدن، كل الـ
possible distances حسبتها. يعني، إذا تكلمت من mi
إلى ba، mi إلى ba، هي ثمانمائة وسبعة وسبعون كيلومتراً. ففي النهاية
أنا أعتمد فقط على مسافة واحدة فقط، التي هي
shortest، لأن هذه الـ minimum distance، حسب الـ
linkage criteria. معناته، أنا سأدمج الـ mi و الـ
to، تمام.
وهذا أول cluster حصلت عليه، سأسميه marriage رقم
1. ممتاز. فلما أنا أدمج MIT و MIT، MIT MIT MIT MIT MIT
MIT MIT MIT MIT MIT MIT MIT MIT MIT MIT MIT MIT
MIT MIT MIT
ماذا عن علاقة الـ cluster الجديد هذا مع الـ
elements الأخرى؟
إن هذا هو الـ cluster. متفقون؟ الآن، الـ cluster الجديد
هذا، أنا سأتعامل معه، سأضع له قيمة تمثله،
تمثل علاقته، لأنه هذا عبارة عن cluster جديد. ما
هو الـ distance بين هذا الـ cluster وباقي الـ clusters
الأخرى؟ سآخذ الـ minimum distance ما بين كل
العناصر الموجودة. بمعنى، أقول كالتالي في السطر
الأول هنا، لما أريد أن أدمج أي و تي أو مع
الـ بي إي، هذه التي ستصبح one cluster. يعني هنا
هذا العمود سيبقى فارغاً مثلاً، وسأضع هنا تي أو و
مأي. بغض النظر عن من دمجت مع من، ليست قضية كبيرة.
تمام. الآن، الـ بي إي، لديّ مسافة، لديّ مسافتان،
أي منهما سآخذ؟ بما أنني ما زلت أعتمد على الـ
single linkage، معناته أنا سآخذ الـ shortest
distance. أي منهما أقصر؟ 877 أم 996؟ لا، 877 مع الـ FI. الآن
الـ FI، لديّ 295 و 400، سأعتمد 295. هذه ستبقى
صفر، لن تتغير. وحتى التي هي الأقصر. الآن، لديّ 457،
طبعاً هذا الخام أيضاً، أنا أحتاج أن أنهي منه. جامعة الخير،
لا تنسوا 754، ولدي 869،
سأعتمد هذه. ولدي 564،
سأعتمدها. وبالتالي، الجدول الجديد سيكون بهذا الشكل.
هذا، باقي الأرقام لم تتغير. أنا أنهيت من الصف والعمود
الذي كان يمثل الـ TO، واعتمدت على الـ shortest
distance الموجودة. إن شاء الله لم أخطئ الحساب.
ثمانمائة وسبعة وسبعون، ثنين، تسعة، خمسة، صفر.
أول عملية تمت، موجودة عندي، باعتماد على single
linkage.
أريد أن أكرر نفس العملية، لأعمل دمج، سأبدأ بالبحث عن
shortest distance. أي 255 في الصف الأول، هي أقصر
مسافة حتى اللحظة. 255،
هي الأقصر. 255، 255، 255 هي الأقصر. معناته، الآن أريد
أن نعمل دمج ما بين الـ NA و الـ BA. بنفس الكلام
السابق، سأنتهي من عمود الـ Na وصف الـ Na. تمام، علاقتهما
ستكون، سنضعهما في عمود واحد، أي distance التي احتفظت
بهما. الآن، هذه لن تتغير، لأنها ستأتي من العمود الذي
عندها بـ A، Na.
صفر. تمام، هذه عندها ستمائة واثنين وستين، ولديّ
أربعمائة وثمانية وستين. لا، سأعتمد المسافة الأقصر.
أربعمائة وثمانية وستين، عندها
ثمانمائة وسبعة وسبعون، وعندها سبعمائة وأربعة وخمسون،
سأعتمد السبعمائة وأربعة وخمسون. طبعاً، صفها سيلغى عند
هنا، أربعمائة واثنا عشر، ولدي اثنين وتسعون، سأعتمد
الاثنين وتسعون. لماذا؟ لأنني مرة أخرى أبحث عن
الـ single linkage، وبالتالي أنا أخطأت.
عفواً، أنا أخطأت هنا عند 219، لأنها أقصر. أنا آسف، ليس
كثيراً، يعني أقول أن الخطأ مردود، إن شاء الله، سأصحح. أقصر
مسافة لديّ فعلياً هي هذه،