الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تحويل الأسماء الثلاثية و المركبة و تفصيلها إلى حقول مفصلة

بدأه eiado في 27 أكتوبر 2013 · 2 رد · 847 مشاهدة · في الرياضيات والخوارزميات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الموضوع ليس مسألة أو وظيفة أو تمرين في جامعة أو أي شيء من هذا القبيل إنما للنقاش البناء وإيجاد أفضل مقاربة ممكنة


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

 

طبعا الكود أو الخوارزمية المستخلصة ممكن تستخدم في كثير من البرمجيات وفوائدها كالتالي:

1- نقل البيانات من قاعدة بيانات تستخدم الاسم الثلاثي للعميل إلى قاعدة بيانات مفصلة الاسم الثلاثي

2- التسهيل على المستخدم بالادخال

3- إدارة إمكانية التعلم الذاتي للبرنامج
يمكن استخدام السيناريوم التالي كأحد الأمثلة:
يدخل المستخدم الاسم الثلاثي ثم يضغط زر enter أو زر نفذ فيقوم البرنامج بشكل تلقائي بتقسيم الاسم سواء كان ثلاثيا أو ثنئيا أو رباعيا لاسم و اسم أب وكنية كما في الشكل التالي :

7EotlAm.png
يجب أن يتحرى المستخدم أكبر دقة ممكنة ويعالج حالات الاسماء المركبة في بداية ونهاية الأسماء بأكبر دقة ممكنة.
النقاش مفتوح لمعالجة الحالات..
أسئلة ممكن الاعتماد عليها:

  • كيف سيعالج البرنامج الأسماء الثلاثية
  • كيف سيعالج الأسماء المركبة (الأكثر شيوعا")
  • كيف سيعالج الاسماء المركبة مع الاسماء المكونة من أكثر من اربع مقاطع

في المثال التالي: الاسم: "محمد   محي الدين الشيخ صبري"
لاحظ النمط التالي :
عبدو كلمة وحيدة , بينما عبد الرحمن هي كلمة وحيدة.
عبد الرحمن يمكن دمج الكلمتين بكلمة واحدة لتصبح عبدالرحمن
الشيخ صبري كلمة واحدة
محي الدين كلمة واحدة
هذه الأنماط يجب معالجتها وهي ليست بالكثيرة فالافضل بناء قاموس بها مارأيكم.

 

خلونا نكون واضحين أكتر وصريحين أكتر :

لا يمكن تحري الدقة التامة ,لكن يمكن إعطاء نتائج بدقة تصل إلى 70-75% في حال معالجة بعض الأمور.
1- هناك بعض الكلمات التي دائماً (أو في حالات شاذة فقط لايحصل هذا) ما تلحق بكلمات أخرى كمثال :
أ- "عبد" لوحدها ليست إسما وغالبا ما يأتي بعدها ال التعريف "عبد الـ"
ب- محي لا تأتي لوحدها ودائما تلحقها كلمة الدين مثل "محي الدين" أما كلمة "محي" لوحدها تلحق بياء أخرى لتصبح "محيي"
2- في حالة كان الاسم يحتوي على ال التعريف في بداية الكلمة فلا يلحق بكلمة أخرى مثل "المثنى" , "الصادق"
3- هناك بعض الكلمات التي احتمال أن تلحق بكلمة أخرى كبيرا (خاصة في نهايات الجملة ) مثل "الشيخ" ,لكن فرصة وجودها بدون كلمة أخرى أيضا كبيرا.
4- بعض الألقاب التي تعود للفترة العثمانية غالبا ما تكون بوزن "الفًعًل في" كمثال "الكبك جي","القفه في", "الطرق جي" ...

طيب كبداية ما رأيكم بهذا الكود:

   string fulln=dr["FullName"].ToString();                    string FirstName,LastName,FatherName;                    string[] FullName = fulln.Split();                    if ((fulln.Contains("عبد") && !fulln.Contains("عبدو")) || fulln.Contains("أبو")                        || fulln.Contains("محي") || fulln.Contains("ابو")                        || fulln.Contains("الشيخ"))                    {                        int indx = -1;                        if (fulln.Contains("عبد ا"))                        {                            indx = fulln.IndexOf("عبد ا");                            fulln = fulln.Remove(indx + 3, 1);                        }                        if (fulln.Contains("محي"))                        {                            indx = fulln.IndexOf("محي");                            fulln = fulln.Remove(indx + 3, 1);                        }                        if (fulln.Contains("الشيخ "))                        {                            indx = fulln.IndexOf("الشيخ ");                            fulln = fulln.Remove(indx + 5, 1);                        }                        FullName = fulln.Split();                        for (int i = 0; i < FullName.Count(); i++)                        {                            if (FullName.Contains("محي"))                            {                                FullName = FullName.Insert(FullName.IndexOf("محي") + 3, " ");                            }                            if (FullName.Contains("الشيخ"))                            {                                FullName = FullName.Insert(FullName.IndexOf("الشيخ ") + 6, " ");                            }                        }                    }                    int size = FullName.Count();                    if ((FullName[0].Contains("عبد") && !FullName[0].Contains("عبدو"))                         || FullName[0].Contains("ابو")                         || FullName[0].Contains("أبو")                        || FullName[0].Contains("محي"))                    {                        if (size < 3)                        {                            FirstName = FullName[0];                            LastName = FullName[1];                            FatherName = "";                        }                        else if (size < 4)                        {                            FirstName = FullName[0] + " " + FullName[1];                            LastName = FullName[2];                        }                        else if (size < 5)                        {                            FirstName = FullName[0] + " " + FullName[1];                            FatherName = FullName[2];                            LastName = FullName[3];                        }                        else                        {                            FirstName = FullName[0];                            FatherName = FullName[1];                            string str = string.Empty;                            for (int i = 2; i <= size; i++)                            {                                str += FullName + " ";                                LastName = str.Trim();                            }                        }                    }                    else                    {                        if (size < 3)                        {                            FirstName = FullName[0];                            LastName = FullName[1];                            FatherName = "";                        }                        else if (size < 4)                        {                            FirstName = FullName[0];                            FatherName = FullName[1];                            LastName = FullName[2];                        }                        else if (size < 5)                        {                            FirstName = FullName[0];                            FatherName = FullName[1];                            LastName = FullName[2] + " " + FullName[3];                        }                        else                         {                            FirstName = FullName[0];                            FatherName = FullName[1];                            string str = string.Empty;                            for (int i = 2 ; i <= size; i++)                            {                                                                str += FullName + " " ;                                LastName = str.Trim();                            }                        }                    }

فما رأيكم دام فضلكم ؟

1

||***************************************************||


 ||بسم الله الذي لا يعلو على اسمه شيء في الارض ولا في السماء وهو العلي العظيم ||


||***************************************************||


 ||                             اللهم إن لم يكن بك غضب علي فلا ابالي                       ||


||***************************************************||


في المنتديات العلمية استخدام التقييم rep_up.png  rep_down.png  يرفع من قيمة الموضوع واهمية الرد

#2

يمكن توفي كود في هذه السطور

sString= sString.Replace( 'عبد ال', 'عبدال');
sString= sString.Replace( 'ابو ', 'ابو');
sString= sString.Replace( ' و ', 'و ');
sString= sString.Replace( ' الدين', 'الدين');

تم تعديل هذه المشاركة بواسطة KARIMSOFT في 27 أكتوبر 2013 في 20:27

#3

الشكر الجزيل على ردك, وفكرة ممتازة..

مارأيك بموضوع الخوارزمية ؟ هل لديك أفكار بناءة حولها؟

||***************************************************||


 ||بسم الله الذي لا يعلو على اسمه شيء في الارض ولا في السماء وهو العلي العظيم ||


||***************************************************||


 ||                             اللهم إن لم يكن بك غضب علي فلا ابالي                       ||


||***************************************************||


في المنتديات العلمية استخدام التقييم rep_up.png  rep_down.png  يرفع من قيمة الموضوع واهمية الرد

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…