เป็นไปได้หรือไม่ที่คอมพิวเตอร์จะ "เรียนรู้" นิพจน์ทั่วไปตามตัวอย่างที่ผู้ใช้ให้มา


95

เป็นไปได้หรือไม่ที่คอมพิวเตอร์จะ "เรียนรู้" นิพจน์ทั่วไปตามตัวอย่างที่ผู้ใช้ให้มา

ชี้แจง:

  • ฉันไม่ต้องการเรียนรู้นิพจน์ทั่วไป
  • ฉันต้องการสร้างโปรแกรมที่ "เรียนรู้" นิพจน์ทั่วไปจากตัวอย่างที่ผู้ใช้จัดเตรียมไว้แบบโต้ตอบบางทีโดยการเลือกส่วนจากข้อความหรือเลือกเครื่องหมายเริ่มต้นหรือสิ้นสุด

เป็นไปได้ไหม? มีอัลกอริทึมคีย์เวิร์ด ฯลฯ ที่ Google ให้ฉันได้ไหม

แก้ไข : ขอบคุณสำหรับคำตอบ แต่ผมไม่ได้สนใจในเครื่องมือที่ให้คุณลักษณะนี้ ฉันกำลังมองหาข้อมูลเชิงทฤษฎีเช่นเอกสารแบบฝึกหัดซอร์สโค้ดชื่อของอัลกอริทึมดังนั้นฉันจึงสามารถสร้างบางอย่างสำหรับตัวเองได้


4
ฉันแปลกใจที่ไม่มีใครพูดถึงRegex :: PreSuf
tripleee

คำตอบ:


44

หนังสือAn Introduction to Computational Learning Theoryมีอัลกอริทึมสำหรับการเรียนรู้เกี่ยวกับหุ่นยนต์ที่ จำกัด เนื่องจากภาษาปกติทุกภาษาเทียบเท่ากับหุ่นยนต์ จำกัด จึงเป็นไปได้ที่จะเรียนรู้นิพจน์ทั่วไปโดยโปรแกรม Kearns และ Valiantแสดงให้เห็นบางกรณีที่ไม่สามารถเรียนรู้หุ่นยนต์ที่ จำกัด ได้ ปัญหาที่เกี่ยวข้องคือการเรียนรู้โมเดล Markov ที่ซ่อนอยู่ซึ่งเป็นออโตมาตาที่น่าจะเป็นที่สามารถอธิบายลำดับอักขระได้ โปรดทราบว่า "นิพจน์ทั่วไป" ที่ทันสมัยส่วนใหญ่ที่ใช้ในภาษาโปรแกรมนั้นแข็งแกร่งกว่าภาษาทั่วไปดังนั้นบางครั้งจึงเรียนรู้ได้ยากกว่า


44

ใช่เป็นไปได้เราสามารถสร้างนิพจน์ทั่วไปจากตัวอย่าง (ข้อความ -> การแยกที่ต้องการ) นี่คือเครื่องมือออนไลน์ที่ใช้งานได้ซึ่งทำงาน: http://regex.inginf.units.it/

เครื่องมือออนไลน์ Regex Generator ++ สร้าง regex จากตัวอย่างที่ให้มาโดยใช้อัลกอริทึมการค้นหา GP อัลกอริทึม GP ถูกขับเคลื่อนโดยสมรรถภาพหลายวัตถุประสงค์ซึ่งนำไปสู่ประสิทธิภาพที่สูงขึ้นและโครงสร้างการแก้ปัญหาที่ง่ายขึ้น (Occam's Razor) เครื่องมือนี้เป็นแอปพลิเคชั่นสาธิตโดย Machine Lning Lab, Trieste Univeristy (Università degli studi di Trieste) กรุณาดูที่วิดีโอสอนที่นี่

นี้เป็นโครงการวิจัยเพื่อให้คุณสามารถอ่านเกี่ยวกับขั้นตอนวิธีการที่ใช้ที่นี่

นี่แน่ะ! :-)

การค้นหา regex / วิธีแก้ปัญหาที่มีความหมายจากตัวอย่างจะทำได้ก็ต่อเมื่อตัวอย่างที่ให้มานั้นอธิบายปัญหาได้ดี ลองพิจารณาตัวอย่างเหล่านี้ที่อธิบายถึงภารกิจการสกัดเรากำลังมองหารหัสรายการเฉพาะ ตัวอย่างคือคู่ข้อความ / การแยก:

"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"

หมายเลขโทรศัพท์ไม่ใช่รหัสผลิตภัณฑ์ซึ่งอาจเป็นหลักฐานสำคัญ


5
นี่น่าจะเป็นคำตอบอันดับต้น ๆ เป็นไปได้และสิ่งนี้แสดงให้เห็น แหล่งที่มามีอยู่ที่นี่: github.com/MaLeLabTs/RegexGenerator
rjurney

ตัวอย่างรหัสผลิตภัณฑ์ของคุณแสดงให้เห็นว่าเหตุใดมนุษย์จึงควรค้นหาข้อกำหนดสำหรับรหัสผลิตภัณฑ์และเขียนนิพจน์ทั่วไปตามข้อกำหนดแทนที่จะพยายามอนุมานนิพจน์จากชุดรหัสผลิตภัณฑ์ตัวอย่างที่ จำกัด (ไม่ว่าจะเป็นบุคคลหรือ โปรแกรมพยายามอนุมานนิพจน์ทั่วไป)
Jan Goyvaerts

2
นี่เป็นวิธีที่ถูกต้องในการทำสิ่งต่างๆ ตัวอย่างของฉันเป็นเพียงวิธีการอธิบายปัญหาในเชิงแนวคิดเท่านั้น บางครั้งไม่มีข้อกำหนดหรือผู้ชายก็ไม่สามารถเขียนนิพจน์ทั่วไป (ขาดความรู้) ได้ด้วยตัวเอง
Fabiano Tarlao

เพื่อให้แม่นยำและชัดเจนยิ่งขึ้น :-), "นี่คือวิธีที่ถูกต้องในการทำสิ่งต่างๆ" -> "คุณพูดถูกของคุณคือวิธีที่ดีที่สุดในการทำสิ่งต่างๆคุณควรเริ่มจากข้อกำหนดเมื่อทำได้"
Fabiano Tarlao

2
บทความ "การอนุมานนิพจน์ทั่วไปสำหรับการแยกข้อความจากตัวอย่าง" มีคำอธิบายโดยละเอียดเกี่ยวกับอัลกอริทึมmachinelearning.inginf.units.it/publications/…
mimmuz

36

ไม่มีโปรแกรมคอมพิวเตอร์ที่เคยจะสามารถที่จะสร้างการแสดงออกปกติที่มีความหมายตามแต่เพียงผู้เดียวในรายการของการแข่งขันที่ถูกต้อง ให้ฉันแสดงเหตุผล

สมมติว่าคุณให้ตัวอย่าง 111111 และ 999999 คอมพิวเตอร์ควรสร้าง:

  1. นิพจน์ทั่วไปที่ตรงกับสองตัวอย่างนี้: (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ทำได้คือทำให้ง่ายต่อการสร้างและทดสอบคำอธิบายระดับสูง แทนที่จะใช้ไวยากรณ์นิพจน์ทั่วไป terse โดยตรง RegexBuddy ช่วยให้คุณสามารถใช้ Building Block ภาษาอังกฤษธรรมดาได้ แต่ไม่สามารถสร้างคำอธิบายระดับสูงให้คุณได้เนื่องจากไม่สามารถรู้ได้อย่างน่าอัศจรรย์ว่าเมื่อใดควรสรุปตัวอย่างของคุณและเมื่อใดที่ไม่ควร

เป็นไปได้อย่างแน่นอนที่จะสร้างเครื่องมือที่ใช้ข้อความตัวอย่างพร้อมกับแนวทางที่ผู้ใช้ให้ไว้เพื่อสร้างนิพจน์ทั่วไป ส่วนที่ยากในการออกแบบเครื่องมือดังกล่าวคือการขอข้อมูลแนวทางที่ผู้ใช้ต้องการโดยไม่ทำให้เครื่องมือเรียนรู้ยากกว่านิพจน์ทั่วไปด้วยตนเองและไม่ จำกัด เครื่องมือไว้ที่งาน regex ทั่วไปหรือนิพจน์ทั่วไปทั่วไป


คุณพูดถูกแล้วอัลกอริทึมการเรียนรู้จำนวนมากที่ฉันพบหลังจากโพสต์คำถามของฉันต้องการข้อมูลเชิงบวกและเชิงลบ เท่าที่ฉันเข้าใจไม่จำเป็นต้องมี "คำอธิบายระดับสูงกว่า" ที่ชัดเจนเนื่องจากผู้ใช้ให้ข้อมูลโดยการตอบคำถาม
Daniel Rikowski

หากเครื่องมือถามคำถามการรวมกันของคำถามและคำตอบที่ได้รับจะเป็นคำอธิบายระดับที่สูงขึ้น คุณภาพของเครื่องมือดังกล่าวส่วนใหญ่ขึ้นอยู่กับคำถามที่ถาม
Jan Goyvaerts

นั่นเป็นเรื่องโง่เพราะถ้าคุณให้ตัวอย่างอื่นคุณก็สามารถกำจัดความเป็นไปได้เหล่านั้นออกไปได้ ตัวอย่างเพิ่มเติมกำจัดวัชพืชเพิ่มเติม
คริส

2
@ คริส: หลักการยังคงอยู่ไม่ว่าคุณจะให้ตัวอย่างกี่ชิ้น เพียงแค่เปลี่ยนความเป็นไปได้ ตัวอย่างเช่นการเพิ่ม 123456 การเปลี่ยนแปลง # 2 เป็น (\ d) \ 1 {5} | 123456 และ # 3 เป็น [19] {6} | 123456 หรืออาจเปลี่ยน # 3 เป็น [1-69] {6} อาจเป็นไปได้ว่ารูปแบบที่ต้องการจะจับคู่ 6 หลักที่เหมือนกันหรือ 6 หลักโดยที่แต่ละหลักมีค่ามากกว่าตัวเลขก่อนหน้า แม้ว่าคุณจะให้ตัวอย่างตัวเลข 6 หลัก 10,000 ตัวอย่างโปรแกรมก็ไม่สามารถแยกความแตกต่างระหว่าง # 1, # 4, # 5 หรือ # 6 โดยไม่มีคำแนะนำเพิ่มเติมจากผู้ใช้
Jan Goyvaerts

ฉันรู้สึกว่าปัญหานี้สามารถแก้ไขได้อย่างง่ายดายดังนี้: โปรแกรมพยายามทำให้กว้างที่สุดเท่าที่จะเป็นไปได้ (ภายในเหตุผล) จากนั้นให้ตัวอย่างของสิ่งอื่น ๆ ที่คิดว่าตรงกัน เพียงแค่บอกว่า 'ใช่' และ 'ไม่' ในการจับคู่ที่เสนอคุณจะช่วยให้เข้าใจขอบเขตของสิ่งที่คุณพยายามจับภาพได้ ฉันชอบที่จะเห็นเครื่องมือในโปรแกรมแก้ไขข้อความซึ่งใช้แนวคิดนี้และเสนอการจับคู่จากไฟล์ที่เปิดอยู่ในปัจจุบัน
Jon McClung

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

ปัญหาคือมี regex จำนวนไม่ จำกัด ซึ่งจะตรงกับรายการตัวอย่าง โค้ดนี้ให้ regex ที่ง่ายที่สุด / โง่ที่สุดในชุดโดยทั่วไปจะจับคู่อะไรก็ได้ในรายการตัวอย่างเชิงบวก (และไม่มีอะไรอื่นรวมถึงตัวอย่างเชิงลบ)

ฉันคิดว่าความท้าทายที่แท้จริงคือการค้นหา regex ที่สั้นที่สุดที่ตรงกับตัวอย่างทั้งหมด แต่ถึงอย่างนั้นผู้ใช้จะต้องให้ข้อมูลที่ดีมากเพื่อให้แน่ใจว่านิพจน์ที่ได้นั้น "ถูกต้อง"


3
เริ่มน่าสนใจเมื่อผู้ใช้ป้อนตัวอย่างเชิงบวกและเชิงลบ นิพจน์ทั่วไปจะต้องตรงกับตัวอย่างที่เป็นบวกและไม่ตรงกับตัวอย่างเชิงลบ
user55400

@blixtor - จริงๆแล้วมันค่อนข้างง่าย อย่าใส่ตัวอย่างเชิงลบใด ๆ ใน regex ที่สร้างขึ้นและจะถูกปฏิเสธ โปรดจำไว้ว่ารหัสที่สร้างขึ้นนั้นตรงกับตัวอย่างที่เป็นบวกเท่านั้น ตัวอย่างเชิงลบ (และสิ่งอื่น ๆ ) ไม่รวมอยู่ในคำจำกัดความ!
Daniel LeCheminant

แดเนียลพูดถูก หากไม่มีคำอธิบายระดับสูงรายการทางเลือกคือสิ่งที่สามารถอนุมานได้อย่างสม่ำเสมอและถูกต้องจากรายการตัวอย่าง
Jan Goyvaerts

6

ฉันเชื่อว่าคำนี้คือ "การเหนี่ยวนำ" คุณต้องการกระตุ้นให้เกิดไวยากรณ์ปกติ

ฉันไม่คิดว่าจะเป็นไปได้ด้วยชุดตัวอย่างที่ จำกัด (เชิงบวกหรือเชิงลบ) แต่ถ้าจำไม่ผิดก็สามารถทำได้ถ้ามี Oracle ที่สามารถปรึกษาได้ (โดยทั่วไปคุณจะต้องปล่อยให้โปรแกรมถามผู้ใช้ใช่ / ไม่ใช่คำถามจนกว่าจะเป็นเนื้อหา)


ใช่นั่นคือสิ่งที่ฉันต้องการทำถามผู้ใช้แบบโต้ตอบ
Daniel Rikowski

การอ้างอิงของ Yuval F ดูเหมือนจะเป็นสิ่งที่ฉันคิดไว้ฉันขอแนะนำให้ลองดูสิ่งเหล่านี้
Jay Kominek


4

มีภาษาเฉพาะสำหรับปัญหาเช่นนี้โดยอ้างอิงจาก prolog เรียกว่าโปรโก

ดังที่คนอื่น ๆ ได้กล่าวถึงแนวคิดพื้นฐานคือการเรียนรู้แบบอุปนัยซึ่งมักเรียกว่า ILP ( การเขียนโปรแกรมลอจิกอุปนัย ) ในแวดวง AI

ลิงค์ที่สองคือบทความวิกิเกี่ยวกับ ILP ซึ่งมีแหล่งข้อมูลที่เป็นประโยชน์มากมายหากคุณสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับหัวข้อนี้


2

@ ยูวัลถูกต้อง. คุณกำลังดูทฤษฎีการเรียนรู้เชิงคำนวณหรือ "การอนุมานแบบอุปนัย"

คำถามนี้ซับซ้อนกว่าที่คุณคิดเนื่องจากคำจำกัดความของ "เรียนรู้" นั้นไม่สำคัญ คำจำกัดความทั่วไปอย่างหนึ่งคือผู้เรียนสามารถคายคำตอบออกมาได้ทุกเมื่อที่ต้องการ แต่ในที่สุดผู้เรียนจะต้องหยุดคายคำตอบออกหรือมักจะคายคำตอบเดิม สิ่งนี้ถือว่าอินพุตเป็นจำนวนไม่ จำกัด และไม่มีการรับประกันอย่างแน่นอนว่าโปรแกรมจะถึงการตัดสินใจเมื่อใด นอกจากนี้คุณไม่สามารถบอกได้ว่าเมื่อถึงเวลาตัดสินใจเพราะอาจมีบางอย่างที่แตกต่างออกไปในภายหลัง

ตามคำจำกัดความนี้ฉันค่อนข้างมั่นใจว่าภาษาปกติสามารถเรียนรู้ได้ ตามคำจำกัดความอื่น ๆ ไม่มาก ...


2

ฉันได้ทำการค้นคว้าเกี่ยวกับ Google และCiteSeerและพบเทคนิค / เอกสารเหล่านี้:

นอกจากนี้ "การเรียนรู้ชุดปกติจากแบบสอบถามและตัวอย่างการตอบโต้" ของ Dana Angluin ก็ดูดี แต่ฉันไม่พบเวอร์ชัน PS หรือ PDF มีเพียงการอ้างอิงและเอกสารการสัมมนาเท่านั้น

ดูเหมือนว่านี่จะเป็นปัญหาที่ยุ่งยากแม้ในระดับทฤษฎี


0

หากเป็นไปได้ที่บุคคลจะเรียนรู้นิพจน์ทั่วไปก็เป็นไปได้โดยพื้นฐานสำหรับโปรแกรม อย่างไรก็ตามโปรแกรมนั้นจะต้องได้รับการตั้งโปรแกรมอย่างถูกต้องเพื่อให้สามารถเรียนรู้ได้ โชคดีที่นี่เป็นตรรกะที่ค่อนข้าง จำกัด ดังนั้นมันจึงไม่ซับซ้อนเท่ากับการสอนโปรแกรมให้สามารถมองเห็นวัตถุหรืออะไรทำนองนั้นได้


1
ไม่เป็นความจริงคุณควรค้นหาปัญหาที่ไม่สามารถยืนยันได้ในเครื่องทัวริง
Stephen Curial

เพื่อความเป็นธรรมฉันบอกว่าถ้าคนสามารถเรียนรู้ REGEX เครื่องก็ทำได้ ฉันไม่ได้หมายถึงมันโดยทั่วไป
cjk

@scurial ฉันไม่คิดว่าจะมีปัญหาที่พิสูจน์ได้ว่าผู้คนสามารถแก้ไขได้ แต่ไม่สามารถยืนยันได้ในเครื่องทัวริงมีไหม?
Sunny88
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.