الأحد، 27 أبريل 2014

خوارزمية تحليلية للنصوص ، و نتيجة جميلة بتطبيقها على نص القرآن




اليوم أكتب في مجال عملي ، فكرت خلال عطلة نهاية الاسبوع بكتابة خوارزمية تحليلية للنصوص.

المدخلات : ملف نصي TXT
المخرجات : ملف اكسل CSV  بعدد تكرار كل كلمة في هذا النص

احتجت هذا لأجل عملي ، المهم بعد ان انهيت كتابة الخوارزمية  .. جربتها على مجموعة من الملفات النصية و مجموعة روايات و سجلات مراسلات .. الخ الخ .. كل نتيجة تحليل تعطيك نتائج مثيرة للاهتمام  تعكس الأفكار الرئيسة للنص.. مثلاً ، تحليل رواية Shattered Faith ينتج التوزيع الآتي  : 


نلاحظ تكرار I  من بعدها الحروف و الاسماء العامة في الانجليزية من ثم اسماء الشخصيات الرئيسية و هكذا ..

في الغالب اكثر الكلمات تكراراً هي نكرات (حروف جر ، أسماء موصولة ، الخ .. ) يليها اسماء محورية للنص .. 


بامكانكم استخدام هذه الأداة لتحليل الملفات النصية المختلفة و هناك موقع مجاني لتحميل الكتب كملفات TEXT  
https://www.free-ebooks.net/
بامكانكم التجربة عليه ، اعتذر فالبرنامج حالياً يقرأ فقط الملفات في صيغة TXT   و ترميز UTF8  . ربما إذا دعت الحاجة لتطويره في المستقبل ، ساقوم بذلك .. 



النتيجة الجميلة هي اني حاولت قراءة ملف نصي للقرآن الكريم من دون حركات ، حيث اردت ان أرى ما هي اكثر الكلمات تكراراً .. كانت كلمة الله ثاني اكثر كلمة تكراراً ... سبقتها كلمة .. هي كلمة من .. فكانت اكثر كلمتين تكراراً هما : من الله :) ..


ربما هي محض صدفة ، لكن النتيجة كانت جميلة و ذات معنى لدي .. 
و تبقى القاعدة ان القرآن كتاب سبق زمنه (العصر الجاهلي) بعصور و أتى بأفكار معجزة و دعوات للتأمل في بيئة راكدة ، و لكن هو ليس كتاب فيزياء و ليس كتاب رياضيات .. جميل ان كلمة الله هي ثاني اكثر الكلمات تكراراً و جميلة ان "من" ثم "الله" هما اكثر كلمتان تكراراً .. 

في النتائج التي تلى الاسماء الموصولة و حروف الجر تأتي كلمة "الأرض" و "آمنو" و "الرحمن" و "عذاب" و "الرحيم" .. الخ .. 

حتى لو كانت كل هذه النتائج هراء .. فترتيب هذا التكرار حتماً يلخص كيف ان القرآن في اكثر الكلمات تكراراً لا يحتوي على كلمات الحرب و لا الإرهاب و لا العداء مما يُرسم في الوعي العالمي عن الدين و الإسلام  .. إنما يتحدث عن الله و تصور الحياة الآخرة و الاستخلاف في هذه الحياة الدنيا .. 

أسعد كثيراً بتعليقاتكم لإثراء الموضوع من ناحية تطبيقات ممكنة للفكرة أو انتقادات لتطبيقها على النص القرآني . :) 




المراجع و الملحقات : 
  • https://www.free-ebooks.net/ يحتوي على مجموعة كبيرة من الكتب بصيغة TXT
  • القرآن كملف نصي يمكن تحمليه من : http://tanzil.net/download/  و اختيار النص كنمط Simple Clean 
  • النتيجة كملف اكسل لتحليل نص القرآن : http://moatazelgamal.com/?attachment_id=197
  • المشروع كمشروع C#  يمكنكم تحميله و تجهيزه (Compile) من هنا : http://moatazelgamal.com/?attachment_id=193
  • شكراً للصديق محمود مسعد لتحسينه أداء البرنامج  ..   
  • إذا أردت تجربة البرنامج مباشرة ، يمكنك ذلك من خلال تحميل هذا الملف :  http://moatazelgamal.com/?attachment_id=196 

  • الخوارزمية ب #C:
     StreamWriter output = new StreamWriter(new FileStream("output.csv", FileMode.Create), Encoding.UTF8);
     StreamReader reader = new StreamReader(new FileStream(args[0], FileMode.Open), Encoding.UTF8);
     Char thischar;
     string thisWord = "";
     Dictionary<String, int> freqs = new Dictionary<string, int>();
            while (!reader.EndOfStream)
            {
                foreach (string word in reader.ReadLine().ToLower().Replace('.', ' ').Replace('"', ' ').Replace('\'', ' ').Replace(',', ' ').Replace(':', ' ').Replace(';', ' ').Replace('(', ' ').Replace(')', ' ').Replace('?', ' ').Replace('/', ' ').Replace('\\', ' ').Split(' '))
                {
                    if (word.Length > 0)
                        if (freqs.ContainsKey(word))
                            freqs[word]++;
                            else
                            freqs[word] = 1;                    
                }
            }
            foreach (KeyValuePair<String, int> freq in freqs)
            {
                output.WriteLine(freq.Key + "," + freq.Value.ToString());
            }
        
            output.WriteLine("");
            output.WriteLine("Processing Time: " + (DateTime.Now.Ticks - startTick) + " 100 nano seconds");
            output.Close();            
            Console.WriteLine("Completed processing the file .. loading it in excel");
            System.Diagnostics.Process.Start("output.csv");                       
            
        }








ليست هناك تعليقات:

إرسال تعليق