Mungkinkah komputer "mempelajari" ekspresi reguler dengan contoh yang diberikan pengguna?


95

Apakah mungkin komputer "mempelajari" ekspresi reguler dengan contoh yang diberikan pengguna?

Untuk memperjelas:

  • Saya tidak ingin mempelajari ekspresi reguler.
  • Saya ingin membuat program yang "mempelajari" ekspresi reguler dari contoh yang disediakan secara interaktif oleh pengguna, mungkin dengan memilih bagian dari teks atau memilih penanda awal atau akhir.

Apa itu mungkin? Apakah ada algoritme, kata kunci, dll. Yang dapat saya gunakan untuk Google?

EDIT : Terima kasih atas jawabannya, tetapi saya tidak tertarik dengan alat yang menyediakan fitur ini. Saya mencari informasi teoretis, seperti makalah, tutorial, kode sumber, nama algoritme, jadi saya dapat membuat sesuatu untuk diri saya sendiri.


4
Saya terkejut tidak ada yang menyebutkan Regex :: PreSuf
tripleee

Jawaban:


44

Buku An Introduction to Computational Learning Theory berisi algoritme untuk mempelajari robot terbatas. Karena setiap bahasa reguler setara dengan robot terbatas, dimungkinkan untuk mempelajari beberapa ekspresi reguler oleh sebuah program. Kearns dan Valiant menunjukkan beberapa kasus di mana tidak mungkin mempelajari robot yang terbatas. Masalah terkait adalah mempelajari Model Markov tersembunyi , yang merupakan automata probabilistik yang dapat menggambarkan urutan karakter. Perhatikan bahwa sebagian besar "ekspresi reguler" modern yang digunakan dalam bahasa pemrograman sebenarnya lebih kuat daripada bahasa reguler, dan oleh karena itu terkadang lebih sulit untuk dipelajari.


44

Ya, bisa saja, kita bisa membuat regex dari contoh (teks -> ekstraksi yang diinginkan). Ini adalah alat online yang berfungsi yang melakukan pekerjaan: http://regex.inginf.units.it/

Alat online Regex Generator ++ menghasilkan regex dari contoh yang diberikan menggunakan algoritme penelusuran GP. Algoritme GP didorong oleh kesesuaian multi-sasaran yang mengarah pada kinerja yang lebih tinggi dan struktur solusi yang lebih sederhana (Occam's Razor). Alat ini adalah aplikasi demostratif oleh Machine Lerning Lab, Universitas Trieste (Università degli studi di Trieste). Silakan lihat tutorial videonya di sini .

Ini adalah proyek penelitian sehingga Anda dapat membaca tentang algoritme yang digunakan di sini .

Melihat! :-)

Menemukan ekspresi reguler / solusi yang bermakna dari contoh adalah mungkin jika dan hanya jika contoh yang diberikan menjelaskan masalah dengan baik. Pertimbangkan contoh-contoh ini yang menjelaskan tugas ekstraksi, kami mencari kode item tertentu; contohnya pasangan teks / ekstraksi:

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

Seorang pria (manusia), melihat contoh, mungkin berkata: "kode item adalah hal-hal seperti \ d ++ - 345 [AB]"

Ketika kode item lebih permisif tetapi kami belum memberikan contoh lain, kami belum memiliki bukti untuk memahami masalah dengan baik. Saat menerapkan solusi buatan manusia \ d ++ - 345 [AB] ke teks berikut, gagal:

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

Anda harus memberikan contoh lain, untuk lebih menggambarkan apa yang cocok dan apa yang tidak cocok yang diinginkan: - yaitu:

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

Nomor telepon bukanlah id produk, ini mungkin bukti penting.


5
Ini harus menjadi jawaban teratas. Itu mungkin, dan ini menunjukkannya. Sumbernya tersedia di sini: github.com/MaLeLabTs/RegexGenerator
rjurney

Contoh kode produk Anda menggambarkan mengapa kata manusia harus mencari spesifikasi untuk kode produk dan menulis ekspresi reguler berdasarkan spesifikasi, daripada mencoba menyimpulkan regex dari sekumpulan kode produk sampel terbatas (terlepas dari apakah seseorang atau program mencoba menyimpulkan regex).
Jan Goyvaerts

2
Ini adalah cara yang benar untuk melakukan sesuatu. Contoh saya hanyalah sebuah cara untuk, secara konseptual, menjelaskan masalahnya. Kadang-kadang tidak ada spesifikasi, atau pria itu tidak mampu menulis ekspresi reguler (kurangnya pengetahuan) sendiri.
Fabiano Tarlao

Untuk lebih tepatnya dan tidak ambigu :-), "Ini adalah cara yang tepat untuk melakukan sesuatu" -> "Anda benar, Anda adalah cara terbaik untuk melakukan sesuatu, Anda harus selalu memulai dari spesifikasi jika memungkinkan"
Fabiano Tarlao

2
Artikel "Inference dari Regular Expressions untuk Teks Ekstraksi dari Contoh" berisi penjelasan rinci dari algoritma machinelearning.inginf.units.it/publications/...
mimmuz

36

Tidak ada program komputer yang dapat menghasilkan ekspresi reguler yang bermakna hanya berdasarkan daftar pencocokan yang valid. Biar saya tunjukkan alasannya.

Misalkan Anda memberikan contoh 111111 dan 999999, jika komputer menghasilkan:

  1. Ekspresi reguler cocok dengan kedua contoh tersebut: (111111|999999)
  2. Ekspresi reguler yang cocok dengan 6 digit identik (\d)\1{5}
  3. Sebuah regex yang cocok dengan 6 satu dan sembilan [19]{6}
  4. Ekspresi reguler yang cocok dengan 6 digit apa pun \d{6}
  5. Salah satu dari tiga di atas, dengan batas kata, mis \b\d{6}\b
  6. Salah satu dari tiga yang pertama, tidak diawali atau diikuti dengan digit, mis (?<!\d)\d{6}(?!\d)

Seperti yang Anda lihat, ada banyak cara contoh dapat digeneralisasikan menjadi ekspresi reguler. Satu-satunya cara komputer membuat ekspresi reguler yang dapat diprediksi adalah dengan meminta Anda mencantumkan semua kemungkinan kecocokan. Kemudian itu bisa menghasilkan pola pencarian yang sama persis dengan kecocokan tersebut.

Jika Anda tidak ingin mencantumkan semua kemungkinan kecocokan, Anda memerlukan deskripsi tingkat yang lebih tinggi. Untuk itulah ekspresi reguler dirancang untuk disediakan. Alih-alih memberikan daftar panjang 6 digit angka, Anda cukup memberi tahu program untuk mencocokkan "enam digit". Dalam sintaks ekspresi reguler, ini menjadi \ d {6}.

Metode apa pun untuk memberikan deskripsi tingkat yang lebih tinggi yang sefleksibel ekspresi reguler juga akan serumit ekspresi reguler. Semua alat seperti RegexBuddy dapat melakukannya untuk mempermudah pembuatan dan pengujian deskripsi tingkat tinggi. Alih-alih menggunakan sintaks ekspresi reguler singkat secara langsung, RegexBuddy memungkinkan Anda menggunakan blok penyusun bahasa Inggris biasa. Tetapi itu tidak dapat membuat deskripsi tingkat tinggi untuk Anda, karena ia tidak dapat secara ajaib mengetahui kapan harus menggeneralisasi contoh Anda dan kapan seharusnya tidak.

Sangat mungkin untuk membuat alat yang menggunakan teks contoh bersama dengan pedoman yang diberikan oleh pengguna untuk menghasilkan ekspresi reguler. Bagian tersulit dalam mendesain alat semacam itu adalah bagaimana alat tersebut meminta informasi panduan yang dibutuhkan pengguna, tanpa membuat alat tersebut lebih sulit dipelajari daripada ekspresi reguler itu sendiri, dan tanpa membatasi alat tersebut pada pekerjaan regex umum atau ekspresi reguler sederhana.


Anda benar, banyak algoritma pembelajaran yang saya temukan setelah memposting pertanyaan saya membutuhkan informasi positif dan negatif. Sejauh yang saya pahami, "deskripsi tingkat yang lebih tinggi" yang eksplisit tidak diperlukan, karena pengguna menyediakannya dengan menjawab pertanyaan.
Daniel Rikowski

Jika alat mengajukan pertanyaan, maka kombinasi pertanyaan dan jawaban yang diberikan membentuk deskripsi tingkat yang lebih tinggi. Kualitas alat-alat tersebut sangat bergantung pada pertanyaan yang diajukan.
Jan Goyvaerts

Itu bodoh karena jika Anda memberikan contoh lain, Anda dapat menyingkirkan beberapa kemungkinan tersebut. Contoh lebih lanjut menyingkirkan lebih banyak.
Cris

2
@Cris: Prinsipnya tetap, terlepas dari berapa banyak sampel yang Anda berikan. Ini hanya mengubah kemungkinan. Misalnya, menambahkan 123456 perubahan # 2 ke (\ d) \ 1 {5} | 123456 dan # 3 ke [19] {6} | 123456. Atau bisa mengubah # 3 menjadi [1-69] {6}. Bahkan bisa jadi pola yang diinginkan akan cocok dengan 6 digit identik atau 6 digit di mana setiap digit lebih besar dari digit sebelumnya. Bahkan jika Anda memberikan 10.000 sampel nomor 6 digit, program tidak dapat membedakan antara # 1, # 4, # 5, atau # 6 tanpa instruksi tambahan dari pengguna.
Jan Goyvaerts

Saya merasa masalah ini dapat diselesaikan dengan mudah sebagai berikut: Program mencoba untuk menjadi seumum mungkin (dalam alasan) dan kemudian memberi Anda contoh hal-hal lain yang menurutnya akan cocok. Dengan hanya mengatakan 'ya' dan 'tidak' untuk pertandingan yang diusulkan, Anda dapat membantunya memahami batasan dari apa yang sebenarnya Anda coba tangkap. Saya ingin melihat alat di editor teks yang menggunakan konsep ini dan kecocokan yang diusulkan dari file yang saat ini terbuka.
Jon McClung

9

Ya, itu pasti "mungkin"; Inilah pseudo-code-nya:

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

Masalahnya adalah jumlah regex yang tidak terbatas akan cocok dengan daftar contoh. Kode ini menyediakan regex paling sederhana / terbodoh di set, pada dasarnya cocok dengan apa pun yang ada di daftar contoh positif (dan tidak ada yang lain, termasuk contoh negatif apa pun).

Saya rasa tantangan sebenarnya adalah menemukan regex terpendek yang cocok dengan semua contoh, tetapi meskipun demikian, pengguna harus memberikan masukan yang sangat baik untuk memastikan ekspresi yang dihasilkan adalah "yang benar".


3
Ini mulai menjadi menarik ketika pengguna memasukkan sampel positif dan negatif . Regex harus cocok dengan sampel positif dan tidak cocok dengan sampel negatif.
pengguna55400

@blixtor - Sebenarnya, ini cukup mudah. Hanya saja, jangan letakkan contoh negatif apa pun di regex yang dikonstruksi, dan mereka akan ditolak. Ingat, yang dibuat oleh kode hanya cocok dengan contoh positif; contoh negatif (dan lainnya) dikecualikan menurut definisi!
Daniel LeCheminant

Daniel benar. Tanpa deskripsi tingkat yang lebih tinggi, daftar alternatif adalah semua yang dapat disimpulkan secara konsisten dan akurat dari daftar contoh.
Jan Goyvaerts

6

Saya yakin istilahnya adalah "induksi". Anda ingin membuat tata bahasa yang teratur.

Saya tidak berpikir itu mungkin dengan serangkaian contoh yang terbatas (positif atau negatif). Tapi, jika saya ingat dengan benar, itu bisa dilakukan jika ada Oracle yang bisa dikonsultasikan. (Pada dasarnya Anda harus membiarkan program mengajukan pertanyaan ya / tidak kepada pengguna sampai itu menjadi konten.)


Ya, itulah yang ingin saya lakukan, tanyakan kepada pengguna secara interaktif.
Daniel Rikowski

Referensi Yuval F sepertinya adalah yang ada dalam pikiran saya, saya sarankan untuk melihatnya.
Jay Kominek

5

Anda mungkin ingin sedikit bermain-main dengan situs ini, itu cukup keren dan sepertinya itu melakukan sesuatu yang mirip dengan apa yang Anda bicarakan: http://txt2re.com


4

Ada bahasa yang didedikasikan untuk masalah seperti ini, berdasarkan prolog. Ini disebut progol .

Seperti yang telah disebutkan orang lain, ide dasarnya adalah pembelajaran induktif, sering disebut ILP ( pemrograman logika induktif ) di lingkaran AI.

Tautan kedua adalah artikel wiki di ILP, yang berisi banyak materi sumber berguna jika Anda tertarik untuk mempelajari lebih lanjut tentang topik tersebut.


2

@Yuval benar. Anda sedang melihat teori pembelajaran komputasi, atau "kesimpulan induktif".

Pertanyaannya lebih rumit dari yang Anda pikirkan, karena definisi "belajar" tidak sepele. Salah satu definisi umum adalah bahwa pelajar dapat melontarkan jawaban kapan pun ia mau, tetapi pada akhirnya, ia harus berhenti mengeluarkan jawaban, atau selalu melontarkan jawaban yang sama. Ini mengasumsikan jumlah masukan yang tidak terbatas, dan sama sekali tidak memberikan jaminan kapan program akan mencapai keputusannya. Selain itu, Anda tidak dapat mengetahui kapan TELAH mencapai keputusannya karena mungkin masih menampilkan sesuatu yang berbeda nanti.

Dengan definisi ini, saya cukup yakin bahwa bahasa biasa dapat dipelajari. Dengan definisi lain, tidak begitu banyak ...



0

Jika memungkinkan bagi seseorang untuk mempelajari ekspresi reguler, maka secara fundamental dimungkinkan untuk sebuah program. Namun, program itu perlu diprogram dengan benar agar dapat belajar. Untungnya ini adalah ruang logika yang cukup terbatas, jadi tidak akan serumit mengajarkan program untuk dapat melihat objek atau sesuatu seperti itu.


1
Tidak benar, Anda harus mencari masalah yang tidak dapat diputuskan pada mesin Turing.
Stephen Curial

Sejujurnya, saya katakan jika seseorang bisa belajar REGEX, maka mesin bisa. Saya tidak bermaksud itu secara umum.
cjk

@scurial Saya rasa tidak ada masalah yang terbukti dapat diatasi oleh orang-orang tetapi tidak dapat diputuskan pada mesin turing, bukan?
Sunny88
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.