क्या उपयोगकर्ता द्वारा प्रदान किए गए उदाहरणों के द्वारा कंप्यूटर के लिए "नियमित रूप से अभिव्यक्ति" सीखना संभव है?


94

क्या उपयोगकर्ता द्वारा प्रदान किए गए उदाहरणों के द्वारा कंप्यूटर के लिए "नियमित रूप से अभिव्यक्ति" सीखना संभव है?

स्पष्टीकरण देना:

  • मैं नियमित अभिव्यक्ति नहीं सीखना चाहता हूं ।
  • मैं एक ऐसा कार्यक्रम बनाना चाहता हूं जो उदाहरणों से एक नियमित अभिव्यक्ति "सीखता है" जो एक उपयोगकर्ता द्वारा अंतःक्रियात्मक रूप से प्रदान की जाती है, शायद किसी पाठ से भागों का चयन करके या शुरुआत या अंत मार्करों का चयन करके।

क्या यह संभव है? क्या ऐसे एल्गोरिदम, कीवर्ड आदि हैं, जिनके लिए मैं Google कर सकता हूं?

संपादित करें : उत्तर के लिए धन्यवाद, लेकिन मैं उन उपकरणों में दिलचस्पी नहीं रखता जो यह सुविधा प्रदान करते हैं। मैं कागजात, ट्यूटोरियल, स्रोत कोड, एल्गोरिदम के नाम जैसी सैद्धांतिक जानकारी की तलाश कर रहा हूं, इसलिए मैं अपने लिए कुछ बना सकता हूं।


4
मुझे आश्चर्य है कि किसी ने Regex :: PreSuf
tripleee

जवाबों:


44

एक परिचय कम्प्यूटेशनल लर्निंग थ्योरी की पुस्तक में एक परिमित ऑटोमोटन सीखने के लिए एक एल्गोरिथ्म शामिल है। के रूप में हर नियमित भाषा एक परिमित ऑटोमेटन के बराबर है, एक कार्यक्रम के द्वारा कुछ नियमित अभिव्यक्ति सीखना संभव है। किर्न्स और वैलिएंट कुछ मामलों को दिखाते हैं जहां एक परिमित ऑटोमेटन सीखना संभव नहीं है। एक संबंधित समस्या छिपी हुई मार्कोव मॉडल सीख रही है , जो कि संभाव्य ऑटोमेटा हैं जो एक चरित्र अनुक्रम का वर्णन कर सकते हैं। ध्यान दें कि प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले अधिकांश आधुनिक "नियमित अभिव्यक्ति" वास्तव में नियमित भाषाओं की तुलना में अधिक मजबूत होते हैं, और इसलिए कभी-कभी सीखना कठिन होता है।


43

हां, यह संभव है, हम उदाहरणों से पाठ उत्पन्न कर सकते हैं (पाठ -> वांछित अर्क)। यह एक काम करने वाला ऑनलाइन टूल है जो काम करता है: http://regex.inginf.units.it/

रेगेक्स जनरेटर ++ ऑनलाइन टूल जीपी खोज एल्गोरिथ्म का उपयोग करके प्रदान किए गए उदाहरणों से एक रेगेक्स उत्पन्न करता है। GP एल्गोरिथ्म एक मल्टीबोजिव फिटनेस द्वारा संचालित होता है जो उच्च प्रदर्शन और सरल समाधान संरचना (ओकोम के रेजर) की ओर जाता है। यह उपकरण मशीन लाइनिंग लैब, ट्राइस्टे यूनीवेरिस्टी (यूनिवर्सिटि डिली स्टडी डि ट्रिएस्ट) द्वारा एक डेमोस्ट्रेटिव एप्लिकेशन है। कृपया यहां वीडियो ट्यूटोरियल देखें ।

यह एक शोध परियोजना है, इसलिए आप यहां उपयोग किए गए एल्गोरिदम के बारे में पढ़ सकते हैं ।

देखो! :-)

उदाहरणों से एक सार्थक रेगेक्स / समाधान खोजना संभव है यदि और केवल प्रदान किए गए उदाहरण समस्या का अच्छी तरह से वर्णन करते हैं। इन उदाहरणों पर विचार करें जो एक निष्कर्षण कार्य का वर्णन करते हैं, हम विशेष आइटम कोड की तलाश कर रहे हैं; उदाहरण पाठ / निष्कर्षण जोड़े हैं:

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

एक (मानव) आदमी, उदाहरणों को देखते हुए, कह सकता है: "आइटम कोड \ d ++ - 345 [AB] जैसी चीजें हैं"

जब आइटम कोड अधिक अनुमेय है, लेकिन हमने अन्य उदाहरण नहीं दिए हैं, तो समस्या को अच्छी तरह से समझने के लिए हमारे पास सबूत नहीं हैं। निम्नलिखित पाठ में मानव जनित समाधान \ d ++ - 345 [AB] को लागू करते समय, यह विफल हो जाता है:

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

एक मैच क्या है और एक वांछित मैच क्या नहीं है, इसका बेहतर वर्णन करने के लिए आपको अन्य उदाहरण प्रदान करने होंगे: --ie:

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

फोन नंबर एक उत्पाद आईडी नहीं है, यह एक महत्वपूर्ण प्रमाण हो सकता है।


4
यह शीर्ष उत्तर होना चाहिए। यह संभव है, और यह इसे प्रदर्शित करता है। स्रोत यहां उपलब्ध है: github.com/MaLeLabTs/RegexGenerator
rjurney

उत्पाद कोड का आपका उदाहरण बताता है कि मानव को उत्पाद कोड के लिए विनिर्देश क्यों देखना चाहिए और नमूना उत्पाद कोड के एक सीमित सेट से regex को जानने की कोशिश करने के बजाय विनिर्देश पर आधारित नियमित अभिव्यक्ति लिखना चाहिए (चाहे व्यक्ति हो या नहीं) एक कार्यक्रम regex अनुमान लगाने की कोशिश कर रहा है)।
जन गोयवर्ट्स

2
यह चीजों को करने का सही तरीका है। मेरा उदाहरण केवल एक तरीका है, वैचारिक रूप से, समस्या की व्याख्या करना। कभी-कभी कोई विनिर्देश नहीं होता है, या लड़का अपने स्वयं के द्वारा नियमित अभिव्यक्ति (ज्ञान की कमी) को लिखने में सक्षम नहीं होता है।
फाबियानो तारलो

2
लेख "उदाहरण से पाठ निष्कर्षण के लिए रेगुलर एक्सप्रेशन का निष्कर्ष" एल्गोरिथ्म के एक विस्तृत विवरण शामिल machinelearning.inginf.units.it/publications/...
mimmuz

3
यह एक उत्कृष्ट परियोजना और आनुवंशिक प्रोग्रामिंग की शक्ति का एक शानदार प्रदर्शन है, अच्छी तरह से किया गया!
rcgeorge23

36

कोई भी कंप्यूटर प्रोग्राम कभी भी एक सार्थक नियमित अभिव्यक्ति उत्पन्न करने में सक्षम नहीं होगा पूरी तरह से वैध मैचों की सूची के पर एक । मैं आपको दिखाता हूं क्यों।

मान लीजिए कि आप उदाहरण 111111 और 999999 प्रदान करते हैं, तो क्या कंप्यूटर उत्पन्न होना चाहिए:

  1. रेगेक्स उन दो उदाहरणों से बिल्कुल मेल खाता है: (111111|999999)
  2. 6 समान अंकों के मिलान वाला एक रेगीक्स (\d)\1{5}
  3. एक रेगीक्स 6 लोगों और नाइनों से मेल खाता है [19]{6}
  4. किसी भी 6 अंक से मेल खाने वाला एक रेगीक्स \d{6}
  5. उपरोक्त तीनों में से कोई भी, शब्द सीमा के साथ, उदाहरण के लिए \b\d{6}\b
  6. पहले तीन में से कोई भी, एक अंक से पहले या उसके बाद नहीं, जैसे (?<!\d)\d{6}(?!\d)

जैसा कि आप देख सकते हैं, ऐसे कई तरीके हैं जिनमें उदाहरणों को नियमित अभिव्यक्ति में सामान्यीकृत किया जा सकता है। कंप्यूटर के लिए एक ही तरीका है कि आप नियमित रूप से एक प्रेडिक्टेबल रेग्युलर एक्सप्रेशन बना सकते हैं संभावित मैचों । फिर यह एक खोज पैटर्न उत्पन्न कर सकता है जो बिल्कुल उन मैचों से मेल खाता है।

यदि आप सभी संभावित मैचों को सूचीबद्ध नहीं करना चाहते हैं, तो आपको एक उच्च-स्तरीय विवरण की आवश्यकता है। यह वही है जो नियमित अभिव्यक्ति प्रदान करने के लिए डिज़ाइन किया गया है। 6-अंकीय संख्याओं की एक लंबी सूची प्रदान करने के बजाय, आप बस "किसी भी छः अंक" से मिलान करने का कार्यक्रम बताएं। नियमित अभिव्यक्ति सिंटैक्स में, यह \ d {6} बन जाता है।

उच्च-स्तरीय विवरण प्रदान करने की कोई भी विधि जो उतनी ही लचीली होती है, उतनी ही नियमित अभिव्यक्ति भी उतनी ही जटिल होगी जितनी कि नियमित अभिव्यक्तियाँ। RegexBuddy जैसे सभी उपकरण उच्च-स्तरीय विवरण बनाने और परीक्षण करने में आसान बनाते हैं। सीधे रेगुलर एक्सप्रेशन सिंटैक्स का उपयोग करने के बजाय, रेगेक्सबुडी आपको सादे अंग्रेजी बिल्डिंग ब्लॉकों का उपयोग करने में सक्षम बनाता है। लेकिन यह आपके लिए उच्च-स्तरीय विवरण नहीं बना सकता है, क्योंकि यह जादुई रूप से नहीं जान सकता है कि कब यह आपके उदाहरणों को सामान्य करना चाहिए और कब नहीं।

नियमित अभिव्यक्ति उत्पन्न करने के लिए उपयोगकर्ता द्वारा दिए गए दिशा-निर्देशों के साथ नमूना पाठ का उपयोग करने वाला उपकरण बनाना निश्चित रूप से संभव है। इस तरह के एक उपकरण को डिजाइन करने में कठिन हिस्सा यह है कि यह उपयोगकर्ता को मार्गदर्शक जानकारी के लिए कैसे पूछता है, जिसे इसकी आवश्यकता होती है, उपकरण को नियमित अभिव्यक्ति की तुलना में सीखने के लिए कठिन बनाने के बिना, और सामान्य रेगेक्स नौकरियों या सरल नियमित अभिव्यक्तियों के लिए टूल को प्रतिबंधित किए बिना।


आप सही हैं, मेरे प्रश्न को पोस्ट करने के बाद मुझे मिले कई लर्निंग एल्गोरिदम को सकारात्मक और नकारात्मक जानकारी की आवश्यकता है। जहां तक ​​मैं समझता हूं, एक स्पष्ट "उच्च-स्तरीय विवरण" आवश्यक नहीं है, क्योंकि उपयोगकर्ता सवालों के जवाब देकर इसे प्रदान कर रहा है।
डैनियल रिकोव्स्की

यदि कोई उपकरण प्रश्न पूछता है, तो दिए गए प्रश्नों और उत्तरों के संयोजन से उच्च-स्तरीय विवरण बनता है। इस तरह के औजारों की गुणवत्ता काफी हद तक पूछे जाने वाले प्रश्नों पर निर्भर करती है।
जन गोयवर्ट्स

यह बेवकूफी है क्योंकि अगर आपने एक और उदाहरण दिया है, तो आप उनमें से कुछ संभावनाओं पर ध्यान दे सकते हैं। एक और उदाहरण अधिक मातम करता है।
क्राइस

2
@ क्रिस: सिद्धांत रहता है, चाहे आप कितने भी नमूने प्रदान करें। यह बस संभावनाओं को बदलता है। उदाहरण के लिए, 123456 परिवर्तन # 2 से (\ d) \ 1 {5} | 123456 और # 3 से [19] {6} | 123456 में जोड़ना। या यह # 3 से [1-69] {6} तक बदल सकता है। यह भी हो सकता है कि वांछित पैटर्न 6 समान अंकों या 6 अंकों से मेल खाएगा जहां प्रत्येक अंक पूर्ववर्ती अंक से अधिक है। यहां तक ​​कि अगर आप 6-अंकीय संख्याओं के 10,000 नमूने प्रदान करते हैं, तो भी प्रोग्राम उपयोगकर्ता से अतिरिक्त निर्देशों के बिना # 1, # 4, # 5, या # 6 के बीच अंतर नहीं कर सकता है।
जन गोयवर्ट्स

मुझे लगता है कि यह समस्या इस प्रकार आसानी से हल हो गई है: कार्यक्रम यथासंभव सामान्य (कारण के भीतर) होने की कोशिश करता है और फिर आपको अन्य चीजों के उदाहरण देता है जो यह सोचता है कि यह मेल खाएगा। बस इसे प्रस्तावित मैचों के लिए 'हां' और 'नहीं' बताकर, आप वास्तव में जिसे पकड़ने की कोशिश कर रहे हैं उसकी सीमा को समझने में मदद कर सकते हैं। मैं एक टेक्स्ट एडिटर में एक टूल देखना पसंद करूंगा, जिसने इस कॉन्सेप्ट का इस्तेमाल किया है और वर्तमान में खुली फाइल से मैचों का प्रस्ताव दिया है।
जॉन मैकक्लब

9

हां, यह निश्चित रूप से "संभव" है; यहाँ छद्म कोड है:

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;
}

समस्या यह है कि अनंत संख्या में रेगीज़ हैं जो उदाहरणों की सूची से मेल खाएंगे। यह कोड सेट में सबसे सरल / बेवकूफ़ रीगेक्स प्रदान करता है, जो मूल रूप से सकारात्मक उदाहरणों की सूची में कुछ भी मिलान करता है (और कुछ भी नहीं, नकारात्मक उदाहरणों सहित)।

मुझे लगता है कि असली चुनौती सबसे छोटे रेगेक्स को ढूंढना होगा जो सभी उदाहरणों से मेल खाता है, लेकिन फिर भी, उपयोगकर्ता को यह सुनिश्चित करने के लिए बहुत अच्छे इनपुट प्रदान करने होंगे कि परिणामस्वरूप अभिव्यक्ति "सही एक" थी।


3
जब उपयोगकर्ता सकारात्मक और नकारात्मक नमूनों में प्रवेश करता है तो यह दिलचस्प होने लगता है । रेगेक्स को सकारात्मक नमूनों का मिलान करना होगा और नकारात्मक लोगों पर मिलान नहीं करना होगा।
user55400

1
@ थोमस: खदान सभी उदाहरणों से मेल खाता है, और कुछ नहीं!
डैनियल लेचेमिनेंट

@blixtor - वास्तव में, यह काफी आसान है। केवल निर्मित रेगेक्स में कोई नकारात्मक उदाहरण न डालें, और उन्हें अस्वीकार कर दिया जाएगा। याद रखें, जो कोड बनाता है वह केवल सकारात्मक उदाहरण से मेल खाता है; नकारात्मक उदाहरण (और कुछ भी) परिभाषा द्वारा बाहर रखा गया है!
डैनियल लेचेमिनेंट

डैनियल सही है। उच्च-स्तरीय विवरण के बिना, विकल्पों की एक सूची सभी उदाहरणों की सूची से लगातार और सटीक रूप से अनुमान लगाया जा सकता है।
जन गोयवर्ट्स

6

मेरा मानना ​​है कि शब्द "इंडक्शन" है। आप एक नियमित व्याकरण प्रेरित करना चाहते हैं।

मुझे नहीं लगता कि यह उदाहरणों (सकारात्मक या नकारात्मक) के एक सीमित सेट के साथ संभव है। लेकिन, अगर मैं सही ढंग से याद करता हूं, तो यह किया जा सकता है यदि कोई ओरेकल है जिसे परामर्श दिया जा सकता है। (मूल रूप से आपको इस कार्यक्रम को उपयोगकर्ता को हां / नहीं में कोई प्रश्न पूछने देना होगा जब तक कि वह संतुष्ट न हो।)


हां, यही मैं करना चाहता हूं, उपयोगकर्ता से अंतःक्रियात्मक रूप से पूछें।
डैनियल रिकोस्की

युवल एफ के संदर्भों से लगता है कि मेरे मन में क्या था, मैं उन पर एक नज़र डालने का सुझाव दूंगा।
जे कोमिनेक

5

आप इस साइट के साथ थोड़ा खेलना चाहते हैं, यह काफी अच्छा है और लगता है कि यह कुछ वैसा ही है जैसा आप इसके बारे में बात कर रहे हैं: http://tv2n.com


4

प्रोलॉग पर आधारित इस तरह की समस्याओं के लिए समर्पित भाषा है। इसे प्रोलोल कहा जाता है ।

जैसा कि दूसरों ने उल्लेख किया है, मूल विचार आगमनात्मक शिक्षा है, जिसे अक्सर AI हलकों में ILP ( प्रेरक तर्क प्रोग्रामिंग ) कहा जाता है ।

दूसरा लिंक ILP पर विकि लेख है, जिसमें यदि आप विषय के बारे में अधिक जानने में रुचि रखते हैं तो बहुत सारे उपयोगी स्रोत सामग्री शामिल हैं।


2

@ युवल सही है। आप कम्प्यूटेशनल सीखने के सिद्धांत को देख रहे हैं, या "आगमनात्मक निष्कर्ष।"

आपके विचार से प्रश्न अधिक जटिल है, क्योंकि "सीखना" की परिभाषा गैर-तुच्छ है। एक सामान्य परिभाषा यह है कि शिक्षार्थी जब चाहे तब उत्तरों को थूक सकता है, लेकिन अंततः उसे या तो उत्तर देना छोड़ देना चाहिए, या हमेशा उसी उत्तर को छोड़ देना चाहिए। यह एक अनंत संख्या में इनपुट्स को मानता है, और इस बात पर पूरी तरह से कोई सरगर्मी नहीं देता है कि कार्यक्रम कब अपने निर्णय पर पहुंचेगा। इसके अलावा, आप यह नहीं बता सकते हैं कि यह कब अपने निर्णय पर पहुँच गया क्योंकि यह अभी भी बाद में कुछ अलग उत्पादन कर सकता है।

इस परिभाषा से, मुझे पूरा यकीन है कि नियमित भाषा सीखने योग्य है। अन्य परिभाषाओं के अनुसार, इतना नहीं ...


2

मैंने Google और CiteSeer पर कुछ शोध किए हैं और इन तकनीकों / पत्रों को पाया है:

इसके अलावा दाना एंग्लुइन के "क्वेश्चन और काउंटरटेक्मेंस से नियमित सेट सीखना" आशाजनक लगता है, लेकिन मैं एक पीएस या पीडीएफ संस्करण नहीं खोज सका, केवल सेमिनार और सेमिनार पेपर।

ऐसा लगता है कि सैद्धांतिक स्तर पर भी यह एक कठिन समस्या है।


0

यदि किसी व्यक्ति के लिए एक नियमित अभिव्यक्ति सीखना संभव है, तो यह एक कार्यक्रम के लिए मौलिक रूप से संभव है। हालांकि, उस कार्यक्रम को सीखने में सक्षम होने के लिए सही ढंग से प्रोग्राम करने की आवश्यकता होगी। सौभाग्य से यह तर्क का एक काफी परिमित स्थान है, इसलिए यह वस्तुओं को देखने में सक्षम होने के लिए एक कार्यक्रम को पढ़ाने के समान जटिल नहीं होगा।


1
सच नहीं है, आपको उन समस्याओं को देखना चाहिए जो ट्यूरिंग मशीनों पर अनुचित हैं।
स्टीफन क्यूरियल

निष्पक्ष होने के लिए, मैंने कहा कि अगर कोई व्यक्ति एक रेजेक्स सीख सकता है, तो एक मशीन कर सकती है। मैं इसे आम तौर पर अर्थ नहीं था।
cjk

@ मुझे लगता है कि ऐसी समस्याएं नहीं हैं जो लोगों द्वारा हल करने योग्य साबित हो रही हैं, लेकिन ट्यूरिंग मशीनों पर अयोग्य हैं, क्या वहाँ हैं?
1488 पर सनी88
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.