هل من الممكن الكمبيوتر إلى "تعلم" العادية التعبير المستخدم المقدمة الأمثلة ؟

StackOverflow https://stackoverflow.com/questions/616292

سؤال

هل من الممكن الكمبيوتر إلى "تعلم" العادية التعبير المستخدم المقدمة الأمثلة ؟

توضيح:

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

هل من الممكن ؟ هناك خوارزميات, الكلمات الرئيسية, الخ.والتي لا يمكن أن جوجل ؟

تحرير:شكرا لك على الأجوبة, ولكن أنا غير مهتم في الأدوات التي توفر هذه الميزة.أنا أبحث عن المعلومات النظرية ، مثل الصحف, دروس, كود, أسماء من الخوارزميات ، لذلك أنا يمكن أن تخلق شيئا لنفسي.

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

المحلول

الكتاب مقدمة لنظرية التعلم الحسابي يحتوي على خوارزمية لتعلم إنسان آلي محدود.وبما أن كل لغة عادية تعادل آلة أوتوماتيكية محدودة، فمن الممكن تعلم بعض التعبيرات النمطية عن طريق البرنامج. كيرنز والشجاعة أظهر بعض الحالات التي لا يمكن فيها تعلم إنسان آلي محدود.مشكلة ذات صلة هي تعلم نماذج ماركوف المخفية, ، وهي آلات آلية احتمالية يمكنها وصف تسلسل الأحرف.لاحظ أن معظم "التعبيرات العادية" الحديثة المستخدمة في لغات البرمجة هي في الواقع أقوى من اللغات العادية، وبالتالي يصعب تعلمها في بعض الأحيان.

نصائح أخرى

نعم ، فمن الممكن ، ونحن يمكن أن تولد regexes من الأمثلة (النص -> المطلوب الاستخراج).هذا هو أداة على الانترنت التي لا وظيفة: http://regex.inginf.units.it/

Regex مولد++ شبكة الإنترنت أداة يولد regex من أمثلة باستخدام GP خوارزمية البحث.GP خوارزمية تحركها multiobjective اللياقة البدنية مما يؤدي إلى أداء أعلى و أبسط حل هيكل (أوكام).هذا هو أداة demostrative التطبيق من قبل الجهاز التلقي مختبر جامعة تريست (Università degli studi di Trieste).يرجى إلقاء نظرة على البرنامج التعليمي الفيديو هنا.

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

ها! :-)

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

"The product code il 467-345A" -> "467-345A"
"The item 789-345B is broken"  -> "789-345B"

وهو (الإنسان) الرجل يبحث في الأمثلة ، قد يقول:"البند رموز أشياء مثل \د++-345[AB]"

عندما رمز العنصر هو أكثر تساهلا لكننا لم تقدم أمثلة أخرى ، ليس لدينا البراهين على فهم المشكلة جيدا.عند تطبيق الإنسان ولدت الحل \د++-345[AB] إلى النص التالي فشل:

"On the back of the item there is a code: 966-347Z"

يجب عليك تقديم أمثلة أخرى ، من أجل وصف ما هي المباراة وليس ما هو المطلوب المباراة:--أنا.هـ:

"My phone is +39-128-3905 , and the phone product id is 966-347Z" -> "966-347Z"

الهاتف عدد غير معرف المنتج ، قد يكون هذا دليل مهم.

لن يتمكن أي برنامج كمبيوتر على الإطلاق من إنشاء تعبير عادي ذو معنى يعتمد على ذلك بِمُفرَدِه في قائمة التطابقات الصالحة.دعني أريك لماذا.

لنفترض أنك قدمت الأمثلة 111111 و999999، في حالة قيام الكمبيوتر بإنشاء:

  1. regex يتطابق تمامًا مع هذين المثالين: (111111|999999)
  2. regex يطابق 6 أرقام متطابقة (\d)\1{5}
  3. regex يطابق 6 من الآحاد والتسعة [19]{6}
  4. regex يطابق أي 6 أرقام \d{6}
  5. أي من الثلاثة المذكورة أعلاه، مع حدود الكلمات، على سبيل المثال: \b\d{6}\b
  6. أي من الثلاثة الأولى، غير مسبوقة أو متبوعة برقم، على سبيل المثال:(?<!\d)\d{6}(?!\d)

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

إذا كنت لا تريد سرد كافة التطابقات المحتملة، فأنت بحاجة إلى وصف على مستوى أعلى.هذا هو بالضبط ما تم تصميم التعبيرات العادية لتوفيره.بدلاً من تقديم قائمة طويلة من الأرقام المكونة من 6 أرقام، ما عليك سوى إخبار البرنامج بمطابقة "أي ستة أرقام".في بناء جملة التعبير العادي، يصبح هذا \d{6}.

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

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

نعم، بالتأكيد "ممكن"؛إليك الكود الزائف:

string MakeRegexFromExamples(<listOfPosExamples>, <listOfNegExamples>)
{
   if HasIntersection(<listOfPosExamples>, <listOfNegExamples>)
     return <IntersectionError>

   string regex = "";
   foreach(string example in <listOfPosExamples>)
   {
      if(regex != "")
      {
         regex += "|";
      }
      regex += DoRegexEscaping(example);
   }
   regex = "^(" + regex + ")$";

   // Ignore <listOfNegExamples>; they're excluded by definition

   return regex;
}

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

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

أعتقد أن المصطلح هو "التحريض".تريد إحداث قواعد نحوية منتظمة.

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

قد ترغب في اللعب بهذا الموقع قليلاً، فهو رائع جدًا ويبدو أنه يفعل شيئًا مشابهًا لما تتحدث عنه: http://txt2re.com

هناك لغة مخصصة لمشاكل مثل هذه، بناءً على البرولوج.تسمى com.progol.

كما ذكر آخرون، الفكرة الأساسية هي التعلم الاستقرائي، وغالبًا ما يسمى ILP (البرمجة المنطقية الاستقرائية) في دوائر الذكاء الاصطناعي.

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

@ يوفال صحيح.أنت تنظر إلى نظرية التعلم الحسابي، أو "الاستدلال الاستقرائي"."

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

وبهذا التعريف، أنا متأكد تمامًا من أن اللغات العادية قابلة للتعلم.وبتعريفات أخرى، ليس كثيرًا...

لقد أجريت بعض الأبحاث على Google و سيتيسير ووجدت هذه التقنيات/الأوراق:

يبدو أيضًا "تعلم المجموعات المنتظمة من الاستعلامات والأمثلة المضادة" لـ Dana Angluin واعدًا، لكنني لم أتمكن من العثور على نسخة PS أو PDF، فقط الاستشهادات وأوراق الندوات.

ويبدو أن هذه مشكلة صعبة حتى على المستوى النظري.

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

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