سؤال

أنا أعمل على مشروع يتطلب تحليل ملفات السجل.أنا أبحث عن خوارزمية سريعة يمكنها استقبال رسائل جماعية مثل هذه:

درجة الحرارة عند P1 هي 35 درجة فهرنهايت.

درجة الحرارة عند P1 هي 40 درجة فهرنهايت.

درجة الحرارة عند P3 هي 35 درجة فهرنهايت.

توقف المسجل.

بدأ المسجل.

درجة الحرارة عند P1 هي 40 درجة فهرنهايت.

ويضع شيئًا على شكل printf():

"The temperature at P%d is %dF.", Int1, Int2" 
{(1,35), (1, 40), (3, 35), (1,40)}

يجب أن تكون الخوارزمية عامة بما يكفي للتعرف على أي تحميل للبيانات تقريبًا في مجموعات الرسائل.

لقد حاولت البحث عن هذا النوع من التكنولوجيا، لكني لا أعرف حتى المصطلحات الصحيحة للبحث عنها.

هل كانت مفيدة؟

المحلول

ملخص:

أ ساذج!! تقوم الخوارزمية بتتبع تكرار الكلمات بطريقة لكل عمود، حيث يمكن للمرء أن يفترض أنه يمكن فصل كل سطر إلى أعمدة بمحدد.

إدخال المثال:

قفز الكلب فوق القمر
قفزت القطة فوق القمر
قفز القمر فوق القمر
قفزت السيارة فوق القمر

الترددات:

Column 1: {The: 4}
Column 2: {car: 1, cat: 1, dog: 1, moon: 1}
Column 3: {jumped: 4}
Column 4: {over: 4}
Column 5: {the: 4}
Column 6: {moon: 4}

يمكننا تقسيم قوائم التكرار هذه بشكل أكبر من خلال التجميع بناءً على العدد الإجمالي للحقول، ولكن في هذا المثال البسيط والمريح، نحن نعمل فقط مع عدد ثابت من الحقول (6).

والخطوة التالية هي التكرار عبر الأسطر التي أنشأت قوائم التكرار هذه، لذلك دعونا نأخذ المثال الأول.

  1. ال:يلبي بعض معايير التموج اليدوي وتقرر الخوارزمية أنه يجب أن يكون ثابتًا.
  2. كلب:لا يبدو ثابتًا استنادًا إلى بقية قائمة الترددات، وبالتالي يجب أن يكون ديناميكيًا بدلاً من النص الثابت.نحن نمر عبر عدد قليل من التعبيرات العادية المحددة مسبقًا ونتوصل إليها /[a-z]+/i.
  3. زيادة:نفس الصفقة رقم 1؛إنها ثابتة، لذا اتركها كما هي.
  4. ال:نفس الصفقة رقم 1؛إنها ثابتة، لذا اتركها كما هي.
  5. قمر:نفس الصفقة رقم 1؛إنها ثابتة، لذا اتركها كما هي.

وبالتالي، بمجرد المرور على السطر الأول، يمكننا تجميع التعبير النمطي التالي:

/The ([a-z]+?) jumps over the moon/

الاعتبارات:

  • من الواضح أنه يمكن للمرء أن يختار مسح جزء من المستند ضوئيًا أو مسحه بالكامل للمرور الأول، طالما كان الشخص واثقًا من أن قوائم التكرار ستكون عينة كافية من البيانات بأكملها.

  • وقد تتسلل النتائج الإيجابية الكاذبة إلى النتائج، وسيكون الأمر متروكًا لخوارزمية التصفية (التلويح باليد) لتوفير أفضل عتبة بين الحقول الثابتة والديناميكية، أو بعض المعالجة اللاحقة البشرية.

  • من المحتمل أن تكون الفكرة العامة فكرة جيدة، لكن التنفيذ الفعلي سيؤثر بالتأكيد على سرعة وكفاءة هذه الخوارزمية.

نصائح أخرى

أعتقد أنك ربما تتجاهل وتفتقد fscanf() وsscanf().وهما عكس fprintf() وsprintf().

شكرا لجميع الاقتراحات العظيمة.كريس، على حق.أنا أبحث عن حل عام لتطبيع أي نوع من النص.يتلخص حل المشكلة في العثور ديناميكيًا على الأنماط في سلسلتين متشابهتين أو أكثر.يشبه تقريبًا التنبؤ بالعنصر التالي في المجموعة، استنادًا إلى العنصرين السابقين:

1:يبلغ ارتفاع جبل إيفرست 30000 قدم

2:يبلغ ارتفاع K2 28000 قدم

=> ما هو النمط؟=> الجواب:

[الاسم] هو [الرقم] ارتفاعه قدم

الآن يمكن أن يحتوي الملف النصي على ملايين الأسطر وآلاف الأنماط.أرغب في تحليل الملفات بسرعة كبيرة جدًا والعثور على الأنماط وجمع مجموعات البيانات المرتبطة بكل نمط.

فكرت في إنشاء بعض التجزئات الدلالية عالية المستوى لتمثيل الأنماط الموجودة في سلاسل الرسائل.سأستخدم رمزًا مميزًا وأعطي كل نوع من أنواع الرموز المميزة "وزنًا" محددًا.ثم أقوم بتجميع التجزئات وتقييم مدى تشابهها.بمجرد الانتهاء من التجميع، سأقوم بجمع مجموعات البيانات.

كنت آمل ألا أضطر إلى إعادة اختراع العجلة وأن أتمكن من إعادة استخدام شيء موجود بالفعل.

كلاوس

يعتمد ذلك على ما تحاول القيام به، إذا كان هدفك هو إنشاء مدخلات sprintf() بسرعة، فسيعمل هذا.إذا كنت تحاول تحليل البيانات، فربما تفعل التعبيرات العادية ذلك أيضًا.

لن تجد أداة يمكنها ببساطة تلقي مدخلات عشوائية، وتخمين البيانات التي تريدها منها، وإنتاج المخرجات التي تريدها.هذا يبدو وكأنه ذكاء اصطناعي قوي بالنسبة لي.

إن إنتاج شيء مثل هذا، حتى لمجرد التعرف على الأرقام، يصبح أمراً صعباً للغاية.على سبيل المثال هل "123.456" رقم واحد أم رقمين؟ماذا عن هذا "123,456"؟هل "35F" رقم عشري و"F" أم أنها القيمة السداسية 0x35F؟سيتعين عليك بناء شيء سيتم تحليله بالطريقة التي تحتاجها.يمكنك القيام بذلك باستخدام التعبيرات العادية، أو يمكنك القيام بذلك باستخدام sscanf, ، أو يمكنك القيام بذلك بطريقة أخرى، ولكن سيتعين عليك كتابة شيء مخصص.

ومع ذلك، باستخدام التعبيرات العادية الأساسية، يمكنك القيام بذلك بنفسك.لن يكون الأمر سحريًا، لكنه ليس بهذا القدر من العمل.شيء من هذا القبيل سوف يقوم بتحليل الأسطر التي تهتم بها ودمجها (Perl):

my @vals = ();
while (defined(my $line = <>))
{
    if ($line =~ /The temperature at P(\d*) is (\d*)F./)
    {
        push(@vals, "($1,$2)");
    }
}
print "The temperature at P%d is %dF. {";
for (my $i = 0; $i < @vals; $i++)
{
    print $vals[$i];
    if ($i < @vals - 1)
    {
        print ",";
    }
}
print "}\n";

الناتج من هذا هوL

The temperature at P%d is %dF. {(1,35),(1,40),(3,35),(1,40)}

يمكنك القيام بشيء مماثل لكل نوع من الخطوط التي تحتاج إلى تحليلها.يمكنك أيضًا قراءة هذه التعبيرات العادية من ملف، بدلاً من الترميز المخصص لكل منها.

لا أعرف أي أداة محددة للقيام بذلك.ما فعلته عندما واجهت مشكلة مماثلة وكان علي حلها هو محاولة تخمين التعبيرات العادية لمطابقة الأسطر.

ثم قمت بمعالجة الملفات وعرضت فقط الخطوط غير المتطابقة.إذا كان الخط غير متطابق، فهذا يعني أن النمط خاطئ ويجب تعديله أو إضافة نمط آخر.

وبعد حوالي ساعة من العمل، نجحت في العثور على ~20 نمطًا لمطابقة أكثر من 10000 سطر.

في حالتك، يمكنك أولاً "تخمين" وجود نمط واحد "The temperature at P[1-3] is [0-9]{2}F.".إذا قمت بإعادة معالجة الملف وإزالة أي سطر مطابق، فسيترك "فقط":

توقف المسجل.

بدأ المسجل.

والتي يمكنك بعد ذلك أن تتطابق معها "Logger (.+).".

يمكنك بعد ذلك تحسين الأنماط والعثور على أنماط جديدة لتتناسب مع سجلك بالكامل.

@جون:أعتقد أن السؤال يتعلق بخوارزمية تتعرف فعليًا على الأنماط الموجودة في ملفات السجل و"تخمن" تلقائيًا سلاسل التنسيق والبيانات المناسبة لها.ال *scanf لا يمكن للعائلة أن تفعل ذلك بمفردها، ولا يمكنها تقديم المساعدة إلا بعد التعرف على الأنماط في المقام الأول.

@ديريك بارك:حسنًا، حتى الذكاء الاصطناعي القوي لا يمكنه التأكد من حصوله على الإجابة الصحيحة.

ربما يمكن استخدام بعض الآليات المشابهة للضغط:

  1. ابحث عن سلاسل فرعية كبيرة ومتكررة
  2. ابحث عن أنماط سلسلة فرعية كبيرة ومتكررة.(أي.[النمط: 1] [غير المرغوب فيه] [النمط: 2])

هناك عنصر آخر يجب مراعاته وهو تجميع الخطوط حسب تحرير المسافة.يجب أن يؤدي تجميع الخطوط المتشابهة إلى تقسيم المشكلة إلى أجزاء ذات نمط واحد لكل مجموعة.

في الواقع، إذا تمكنت من كتابة هذا، دع العالم كله يعرف, أعتقد أن الكثير منا يرغب في هذه الأداة!

@ أندرس

حسنًا، حتى الذكاء الاصطناعي القوي لا يمكنه التأكد من حصوله على الإجابة الصحيحة.

كنت أفكر أن الذكاء الاصطناعي القوي بما فيه الكفاية يمكنه ذلك عادة اكتشف الإجابة الصحيحة من السياق.على سبيل المثاليمكن للذكاء الاصطناعي القوي أن يدرك أن "35F" في هذا السياق هي درجة حرارة وليست رقمًا سداسيًا عشريًا.هناك بالتأكيد حالات لن يتمكن فيها حتى الذكاء الاصطناعي القوي من الإجابة.هذه هي نفس الحالات التي لن يتمكن فيها الإنسان من الإجابة (على افتراض جداً منظمة العفو الدولية القوية).

بالطبع، هذا لا يهم حقًا، لأننا لا نملك ذكاءً اصطناعيًا قويًا.:)

http://www.logparser.com يعيد التوجيه إلى منتدى IIS الذي يبدو نشطًا إلى حد ما.هذا هو الموقع الرسمي لـ "مجموعة أدوات محلل السجل" الخاصة بـ Gabriele Giuseppini.على الرغم من أنني لم أستخدم هذه الأداة مطلقًا، فقد التقطت نسخة رخيصة من الكتاب من Amazon Marketplace - اليوم يصل سعر النسخة إلى 16 دولارًا.لا شيء يتفوق على واجهة الشجرة الميتة بمجرد تقليب الصفحات.

بإلقاء نظرة سريعة على هذا المنتدى، لم أسمع من قبل عن "أداة واجهة المستخدم الرسومية الجديدة لـ MS Log Parser، Log Parser Lizard" على http://www.lizardl.com/.

القضية الرئيسية بالطبع هي مدى تعقيد القواعد النحوية الخاصة بك.لاستخدام أي نوع من محللي السجلات كما هو شائع الاستخدام، عليك أن تعرف بالضبط ما الذي تبحث عنه، ويمكنك كتابة BNF له.منذ سنوات عديدة، أخذت دورة تدريبية تعتمد على "كتاب التنين" الخاص بـ Aho-and-Ullman، ويمكن لتقنية LALR المفهومة تمامًا أن تمنحك السرعة المثلى، بشرط بالطبع أن يكون لديك CFG.

من ناحية أخرى، يبدو أنك ربما تسعى إلى شيء يشبه الذكاء الاصطناعي، وهو ترتيب مختلف تمامًا من التعقيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top