سنقوم بكتابة مجموعة من أدوات سطر الأوامر البسيطة لعرض الإحصائيات الأساسية حول ملف نصي أو مجموعة من الملفات النصية. بعض الإحصاءات الأساسية تشمل ...
سنعمل أيضًا على إضافة القدرة على ...
فيما يلي لقطة شاشة لبرنامج يقوم بتنزيل النص الكامل لـ Moby Dick من Project Gutenberg ويطبع رسمًا بيانيًا لترددات الرسالة.
اتضح أن الرسالة "T" تشكل 9.25 ٪ من جميع الرسائل في Moby Dick.
للبدء ، ستحتاج إلى ...
npm install لتثبيت الحزم المطلوبة.textalyze.js هو الرمز المصدر لهذا المشروعsample_data هو دليل يحتوي على عينة من الملفات النصية للتحليل ، معظمها من Project Gutenberg. تمتلئ ملف textalyze.js الذي يأتي مع هذا المستودع بالتعليقات المصممة لمساعدتك على البدء. يجب أن تتردد في حذفها من أجل تسهيل قراءة البرنامج.
فكر في الأسئلة التي تحتاج إلى أن تكون قادرًا على الإجابة عليها لجعلها تعمل ، على الرغم من:
تدير هذه الأسئلة السلسلة من Ruby-Gritty Ruby إلى تجربة المستخدم ، مع بدء تشغيلنا أيضًا في طريق أن نرتاح لكيفية عمل الويب.
لطلب ملاحظات على الرمز الخاص بك ، استخدم عملية تدفق GitHub القياسية.
تم تنظيم هذا المشروع كتسلسل من التكرارات ، كل منها يعتمد على التكرارات السابقة. تخدم التكرارات ثلاثة أدوار مهمة:
باستخدام أمثلة مرمّزة ، اكتب وظيفة تأخذ Array يحتوي على عناصر تعسفية وربما مكررة كإدخال وإرجاع Object يحتوي على أزواج العنصر/العد. لقد كتبنا بعض
هذا التكرار لديه اختبارات مكتوبة لك. يجري
npm test لرؤية الاختبارات الفاشلة. تذكر تشغيل npm install أولا!
أي إذا كان للإدخال 100 إدخالات و 20 منهم هي الحرف "A" ثم يجب أن يحتوي Object الناتج
{ 'a' : 20 } "معقول" متروك لك لتعريفه ، ولكن إليك تنسيق مقترح ، متظاهرًا بأننا نشهد المدخلات ["a", "a", "a", "b", "b", "c"] .
user@host project-js-textalyze $ node textalyze.js
The counts for ["a", "a", "a", "b", "b", "c"] are...
a 3
b 2
c 1
user@host project-js-textalyze $
باستخدام أمثلة مرمزة ، اكتب وظيفة تأخذ String تعسفية كمدخلات وإرجاع Array من جميع الأحرف في السلسلة ، بما في ذلك المسافات وعلامات الترقيم.
قم بتغذية هذا في دالة التخصيص من التكرار السابق للحصول على Object يحتوي على أزواج الحروف/العد. اطبع تلك الأزواج بطريقة معقولة.
قم بإنشاء ملف lib/sanitize.js وتحديد وظيفة تسمى sanitize في الداخل. كما هو الحال في lib/itemCounts.js ، يجب أن يكون السطر الأخير
module . exports = sanitize يجب أن تأخذ وظيفة sanitize String تعسفية-ربما تحتوي على مساحات ، علامات الترقيم ، فواصل الخط ، وما إلى ذلك-وإرجاع سلسلة "معقدة" تحل محل جميع الأحرف العلوية مع ما يعادلها في الحالة المنخفضة. سيضمن هذا عدم معاملة الحروف 'A' و 'a' كحرفتين متميزتين عندما نحلل نصنا. سنتعامل مع علامات الترقيم وغيرها من البتات في التكرار اللاحق.
يجب أن تعمل مثل هذا
sanitize ( 'This is a sentence.' ) // => 'this is a sentence.'
sanitize ( 'WHY AM I YELLING?' ) // => 'why am i yelling?'
sanitize ( 'HEY: ThIs Is hArD tO rEaD!' ) // => 'hey: this is hard to read!'Lucky for us, JavaScript comes with a built-in function to help us: String.prototype.toLowerCase.
دمج هذه الوظيفة في البرنامج الحالي بحيث يحتوي Object النتائج ، على سبيل المثال ،
{ 'a' : 25 }بدلاً من
{ 'a' : 19 , 'A' : 6 } في كثير من الأحيان البيانات التي نريدها ليست بتنسيق يجعل من السهل التحليل. تسمى عملية أخذ بيانات سيئة التنسيق وتحويلها إلى شيء يمكننا الاستفادة منه تعقيم بياناتنا.
ما يعتبر "تعقيم" يختلف اعتمادًا على البيانات الأساسية واحتياجاتنا. على سبيل المثال ، إذا أردنا أن ننظر إلى جميع النصوص في مستند HTML ، فلن نرغب في حساب جميع علامات HTML. على العكس من ذلك ، إذا أردنا تقريرًا عن العلامات الأكثر استخدامًا في مستند HTML ، فسنريد الاحتفاظ بالعلامات ولكن إزالة النص.
في حالتنا ، قمنا بتصميم برنامجنا بحيث يتعامل مع الحروف العلوية والحروف السفلية كحروف متميزة ، أي قد يحتوي Object النتائج على نتائجنا
{ 'a' : 20 , 'A' : 5 }لكننا على الأرجح أن نحتوي فقط
{ 'a' : 25 }وبالمثل ، ربما لا نهتم بترقيم الترقيم (الفترات ، الفواصل ، الواصلة ، الكولون ، وما إلى ذلك) ، على الرغم من أن هذا يصعب التعامل معه من الاختلافات بين الحروف العلوية والمساحات المنخفضة.
يحتوي المستودع الأساسي على دليل يسمى sample_data يحتوي على حفنة من الملفات النصية. قم برمز HARD اسم أحد هذه الملفات في برنامجك وقراءة محتويات هذا الملف في سلسلة. قم بتمرير هذه السلسلة إلى برنامجك الحالي ، بحيث تقوم الآن بطباعة إحصائيات لعرض الحروف لهذا الملف المحدد بدلاً من الأوتار المرمزة التي كانت لديك في التكرار السابق.
لقراءة محتويات ملف في سلسلة ، راجع Fs.ReadFile و Fs.ReadFilesync.
لا نريد تحرير رمز JavaScript الخاص بنا في كل مرة نحتاج إلى تغيير الملف الذي نقرأ منه البيانات. دعنا نغيره بحيث يمكن للمستخدم الذي يقوم بتشغيل البرنامج أن يمر باسم الملف الذي يمكن للقراءة منه. سنفعل ذلك باستخدام وسيطات سطر الأوامر.
هذا التكرار علامات v1.0 من برنامجنا. كما هو الحال ، فإن برنامجنا-على الرغم من محدودية-مكتفية بدرجة كافية بحيث يمكنك إعطائه لشخص آخر ويمكنهم استخدامه كما تنوي دون الحاجة إلى معرفة كيفية تحرير رمز JavaScript.
تهاني!
النظر في الأمر التالي الذي يتم تشغيله من المحطة:
node some-program.js first_argument second_argument banana
وسيطات سطر الأوامر هي first_argument و second_argument و banana ، مع مساحة تدل على الفصل بين كل وسيطة. first_argument هي وسيطة سطر الأوامر الأولى banana هي وسيطة سطر الأوامر الثالثة .
باستخدام أمثلة مرمّزة ، اكتب وظيفة تأخذ Array يحتوي على إدخالات تعسفية وربما مكررة كإدخال وإرجاع Object يحتوي على أزواج العنصر/التردد. اطبع تلك الأزواج بطريقة معقولة.
هذا هو ، إذا كان للإدخال 100 إدخال و 20 من الحرف "A" ثم يجب أن يكون Object الذي تم إرجاعه
{ 'a' : 0.20 } لقد كتبت بالفعل وظيفة تأخذ Array وتُرجع Object يحتوي على أزواج إدخال/عدد وستحتاج إلى هذه التهم (بطريقة أو بأخرى) لحساب التردد الكلي. إذا كنت ترغب في تمديد نفسك ، فحاول كتابة وظيفة "إحصائيات التردد" بطريقة تستفيد من وظيفة "إحصائيات العد" الخاصة بك ، بحيث لا تضطر إلى تكرار الكثير من التعليمات البرمجية أو العمل في برنامجك.
هذا هو "نهج التمدد" ، مما يعني أنه ليس من الضروري لك أن تكتب برنامجك بهذه الطريقة. كما كنا نقول ، من الأفضل أن تكتب شيئًا ما والحصول على تعليقات عليه بدلاً من التعثر أثناء محاولة التخلص من "أفضل" ، "أسرع" ، "أكثر أناقة" ، إلخ.
اطبع رسمًا بيريًا لترددات الحروف التي تشبه ما يلي:
الهدف هو إنتاج مخرج مفيد ومصمم جيدًا. لا يجب أن تبدو متطابقة مع الإخراج أعلاه.
تلميح: يمكنك استخدام التردد لكل عنصر كوسيلة لتوسيع طول الرسم البياني.
فيما يلي بعض الميزات الإضافية التي قد تضيفها:
قم بتثبيت وحدة الطلب واستخدامها لإضافة دعم لتمرير عناوين URL وكذلك أسماء الملفات. على سبيل المثال ، بدلاً من الاضطرار إلى تنزيل Moby Dick أولاً ، يمكنك التشغيل
node textalyze.js http://www.gutenberg.org/cache/epub/2701/pg2701.txt أضف دعمًا لعرض الكلمات 5 (أو N ) الأكثر شيوعًا بدلاً من ترددات الحروف فقط.
أضف دعمًا لتصدير البيانات بتنسيق يمكنك تحميله في Excel ، مثل ملف CSV. يمكنك تثبيت وحدة CSV للكتابة واستخدامها للقيام بذلك.
ابحث عن نصوص من لغات متعددة وقارن تردد الرسالة بين اللغات. يعمل تردد خطاب اللغة كنوع من بصمات الأصابع ، وفاجأت أن تكون القليل من النص الذي يتطلبه تحديد اللغة بمجرد معرفة ترددات الرسالة.
استخدم مكتبة مخططات مثل anychart لتصدير رسم بياني.
لتثبيت وحدة نمطية ، قم بتشغيل الأمر التالي (استبدال nameOfModule باسم الوحدة النمطية المطلوبة):
npm install --save nameOfModule سيؤدي ذلك إلى تحديث package.json وإضافة الوحدة النمطية كاعتماد. اقرأ وثائق كل وحدة لمعرفة كيفية require واستخدامها.