Máy tính có thể “học” một biểu thức chính quy bằng các ví dụ do người dùng cung cấp không?


95

Máy tính có thể "học" một biểu thức chính quy bằng các ví dụ do người dùng cung cấp không?

Làm rõ:

  • Tôi không muốn học biểu thức chính quy.
  • Tôi muốn tạo một chương trình "học" một biểu thức chính quy từ các ví dụ do người dùng cung cấp một cách tương tác, có thể bằng cách chọn các phần từ văn bản hoặc chọn các điểm đánh dấu đầu hoặc cuối.

Có khả thi không? Có thuật toán, từ khóa, v.v. nào mà tôi có thể sử dụng Google không?

CHỈNH SỬA : Cảm ơn bạn đã trả lời, nhưng tôi không quan tâm đến các công cụ cung cấp tính năng này. Tôi đang tìm kiếm thông tin lý thuyết, chẳng hạn như giấy tờ, hướng dẫn, mã nguồn, tên các thuật toán để tôi có thể tạo ra thứ gì đó cho riêng mình.


4
Tôi ngạc nhiên không ai có đề cập Regex :: PreSuf
tripleee

Câu trả lời:


44

Cuốn sách Giới thiệu về Lý thuyết Học tập Tính toán chứa một thuật toán để học một tự động hữu hạn. Vì mọi ngôn ngữ thông thường đều tương đương với một tự động hóa hữu hạn, nên có thể học một số biểu thức chính quy bằng một chương trình. Kearns và Valiant chỉ ra một số trường hợp không thể học một automaton hữu hạn. Một vấn đề liên quan là học Mô hình Markov ẩn , là các tự động dữ liệu xác suất có thể mô tả một chuỗi ký tự. Lưu ý rằng hầu hết các "biểu thức chính quy" hiện đại được sử dụng trong các ngôn ngữ lập trình thực sự mạnh hơn các ngôn ngữ thông thường và do đó đôi khi khó học hơn.


43

Có, hoàn toàn có thể, chúng tôi có thể tạo regex từ các ví dụ (văn bản -> phần trích xuất mong muốn). Đây là một công cụ trực tuyến đang hoạt động thực hiện công việc: http://regex.inginf.units.it/

Công cụ trực tuyến Regex Generator ++ tạo regex từ các ví dụ được cung cấp bằng cách sử dụng thuật toán tìm kiếm GP. Thuật toán GP được thúc đẩy bởi sự phù hợp đa mục tiêu dẫn đến hiệu suất cao hơn và cấu trúc giải pháp đơn giản hơn (Occam's Razor). Công cụ này là một ứng dụng giải mã của Phòng thí nghiệm Máy Lerning, Trieste Univeristy (Università degli studi di Trieste). Vui lòng xem video hướng dẫn tại đây .

Đây là một dự án nghiên cứu nên bạn có thể đọc về các thuật toán đã sử dụng tại đây .

Hãy chứng kiến! :-)

Việc tìm kiếm một giải pháp / regex có ý nghĩa từ các ví dụ là có thể thực hiện được nếu và chỉ khi các ví dụ được cung cấp mô tả tốt vấn đề. Hãy xem xét các ví dụ mô tả một nhiệm vụ trích xuất, chúng tôi đang tìm kiếm các mã hàng cụ thể; các ví dụ là các cặp văn bản / trích xuất:

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

Một anh chàng (con người), khi xem các ví dụ, có thể nói: "mã mặt hàng là những thứ như \ d ++ - 345 [AB]"

Khi mã hàng dễ dãi hơn nhưng chúng tôi không cung cấp các ví dụ khác, chúng tôi không có bằng chứng để hiểu rõ vấn đề. Khi áp dụng giải pháp do con người tạo \ d ++ - 345 [AB] cho văn bản sau, nó không thành công:

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

Bạn phải cung cấp các ví dụ khác để mô tả rõ hơn đâu là đối sánh và đâu là đối sánh không mong muốn: --ie:

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

Số điện thoại không phải là id sản phẩm, đây có thể là một bằng chứng quan trọng.


4
Đây phải là câu trả lời hàng đầu. Nó là có thể, và điều này chứng tỏ điều đó. Nguồn có sẵn tại đây: github.com/MaLeLabTs/RegexGenerator
rjurney

Ví dụ về mã sản phẩm của bạn minh họa lý do tại sao mọi người nên tra cứu thông số kỹ thuật cho mã sản phẩm và viết biểu thức chính quy dựa trên thông số kỹ thuật, thay vì cố gắng suy ra regex từ một tập hợp giới hạn mã sản phẩm mẫu (bất kể là người hay một chương trình đang cố gắng suy ra regex).
Jan Goyvaerts

2
Đây là cách đúng đắn để làm mọi việc. Ví dụ của tôi chỉ là một cách để giải thích vấn đề về mặt khái niệm. Đôi khi không có đặc điểm kỹ thuật, hoặc anh chàng chỉ đơn giản là không thể viết biểu thức chính quy (thiếu kiến ​​thức) của riêng mình.
Fabiano Tarlao

Để được chính xác hơn và rõ ràng :-), "Đây là cách đúng đắn để làm những việc" -> "Bạn là đúng, là bạn theo cách tốt nhất để làm điều này, bạn nên luôn luôn bắt đầu từ thông số kỹ thuật khi có thể"
Fabiano Tarlao

2
Các bài viết "Suy luận của Regular Expressions cho Text Extraction từ ví dụ" chứa một lời giải thích chi tiết về các thuật toán machinelearning.inginf.units.it/publications/...
mimmuz

36

Không chương trình máy tính nào có thể tạo một biểu thức chính quy có nghĩa chỉ dựa trên danh sách các kết quả phù hợp hợp lệ. Để tôi chỉ cho bạn hiểu vì sao.

Giả sử bạn cung cấp các ví dụ 111111 và 999999, máy tính sẽ tạo ra:

  1. Một regex khớp chính xác hai ví dụ đó: (111111|999999)
  2. Một regex khớp với 6 chữ số giống nhau (\d)\1{5}
  3. Một regex phù hợp với 6 cái và 9 cái [19]{6}
  4. Một regex khớp với 6 chữ số bất kỳ \d{6}
  5. Bất kỳ mục nào trong số ba mục trên, với ranh giới từ, ví dụ: \b\d{6}\b
  6. Bất kỳ trong ba chữ số đầu tiên, không đứng trước hoặc theo sau bởi một chữ số, ví dụ: (?<!\d)\d{6}(?!\d)

Như bạn có thể thấy, có nhiều cách để các ví dụ có thể được tổng quát hóa thành một biểu thức chính quy. Cách duy nhất để máy tính xây dựng một biểu thức chính quy có thể dự đoán là yêu cầu bạn liệt kê tất cả các kết quả phù hợp có thể có. Sau đó, nó có thể tạo ra một mẫu tìm kiếm khớp chính xác với những kết quả phù hợp đó.

Nếu bạn không muốn liệt kê tất cả các kết quả phù hợp có thể có, bạn cần mô tả cấp cao hơn. Đó chính xác là những gì biểu thức chính quy được thiết kế để cung cấp. Thay vì cung cấp một danh sách dài các số có 6 chữ số, bạn chỉ cần yêu cầu chương trình khớp với "sáu chữ số bất kỳ". Trong cú pháp biểu thức chính quy, nó trở thành \ d {6}.

Bất kỳ phương pháp nào cung cấp mô tả cấp cao hơn linh hoạt như biểu thức chính quy cũng sẽ phức tạp như biểu thức chính quy. Tất cả các công cụ như RegexBuddy có thể làm là giúp tạo và kiểm tra mô tả cấp cao dễ dàng hơn. Thay vì sử dụng trực tiếp cú pháp biểu thức chính quy ngắn gọn, RegexBuddy cho phép bạn sử dụng các khối xây dựng thuần túy bằng tiếng Anh. Nhưng nó không thể tạo mô tả cấp cao cho bạn, vì nó không thể biết một cách kỳ diệu khi nào nó nên khái quát hóa các ví dụ của bạn và khi nào thì không.

Chắc chắn có thể tạo một công cụ sử dụng văn bản mẫu cùng với các nguyên tắc do người dùng cung cấp để tạo biểu thức chính quy. Điều khó khăn trong việc thiết kế một công cụ như vậy là làm thế nào nó yêu cầu người dùng cung cấp thông tin hướng dẫn mà nó cần, mà không làm cho công cụ khó học hơn chính các biểu thức chính quy và không giới hạn công cụ đối với các công việc regex phổ biến hoặc các biểu thức chính quy đơn giản.


Bạn nói đúng, nhiều thuật toán học tập mà tôi tìm thấy sau khi đăng câu hỏi của mình yêu cầu thông tin tích cực và tiêu cực. Theo tôi hiểu, một "mô tả cấp cao hơn" rõ ràng là không cần thiết, vì người dùng đang cung cấp nó bằng cách trả lời các câu hỏi.
Daniel Rikowski

Nếu một công cụ đặt câu hỏi, thì sự kết hợp của câu hỏi và câu trả lời đã cho tạo thành mô tả cấp cao hơn. Chất lượng của các công cụ này phần lớn phụ thuộc vào các câu hỏi mà nó đặt ra.
Jan Goyvaerts

Điều đó thật ngu ngốc vì nếu bạn cung cấp một ví dụ khác, thì bạn có thể loại bỏ một số khả năng đó. Một ví dụ khác làm cỏ ra nhiều hơn.
Cris

2
@Cris: Nguyên tắc vẫn còn, bất kể bạn cung cấp bao nhiêu mẫu. Nó chỉ đơn giản là thay đổi các khả năng. Ví dụ: thêm 123456 sẽ thay đổi # 2 thành (\ d) \ 1 {5} | 123456 và # 3 thành [19] {6} | 123456. Hoặc nó có thể thay đổi # 3 thành [1-69] {6}. Thậm chí có thể là mẫu mong muốn sẽ khớp với 6 chữ số giống nhau hoặc 6 chữ số trong đó mỗi chữ số lớn hơn chữ số đứng trước một chữ số. Ngay cả khi bạn cung cấp 10.000 mẫu số có 6 chữ số, chương trình không thể phân biệt giữa # 1, # 4, # 5 hoặc # 6 nếu không có hướng dẫn thêm từ người dùng.
Jan Goyvaerts

Tôi cảm thấy như vấn đề này được giải quyết dễ dàng như sau: Chương trình cố gắng tổng quát nhất có thể (trong phạm vi lý do) và sau đó cung cấp cho bạn ví dụ về những thứ khác mà nó cho là phù hợp. Chỉ cần nói với nó 'có' và 'không' với các kết quả được đề xuất, bạn có thể giúp nó hiểu được giới hạn của những gì bạn thực sự đang cố gắng nắm bắt. Tôi rất thích nhìn thấy một công cụ trong trình soạn thảo văn bản sử dụng khái niệm này và các kết quả phù hợp được đề xuất từ ​​tệp hiện đang mở.
Jon McClung

9

Vâng, nó chắc chắn là "có thể"; Đây là mã giả:

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

Vấn đề là có vô số regex sẽ khớp với một danh sách các ví dụ. Mã này cung cấp regex đơn giản nhất / ngu ngốc nhất trong tập hợp, về cơ bản khớp với bất kỳ thứ gì trong danh sách các ví dụ tích cực (và không có gì khác, kể cả bất kỳ ví dụ tiêu cực nào).

Tôi cho rằng thách thức thực sự sẽ là tìm ra regex ngắn nhất phù hợp với tất cả các ví dụ, nhưng ngay cả khi đó, người dùng sẽ phải cung cấp đầu vào rất tốt để đảm bảo biểu thức kết quả là "đúng".


3
Nó bắt đầu trở nên thú vị khi người dùng nhập các mẫu tích cực và tiêu cực . Regex sẽ phải khớp với các mẫu dương tính và không khớp với các mẫu âm tính.
user55400

@blixtor - Thực ra, nó khá dễ dàng. Chỉ cần không đặt bất kỳ ví dụ phủ định nào trong regex đã xây dựng, và chúng sẽ bị từ chối. Hãy nhớ rằng, một trong những mã xây dựng chỉ phù hợp với ví dụ tích cực; các ví dụ tiêu cực (và bất cứ điều gì khác) bị loại trừ theo định nghĩa!
Daniel LeCheminant

Daniel nói đúng. Không có mô tả cấp cao hơn, danh sách các lựa chọn thay thế là tất cả những gì có thể được suy ra một cách nhất quán và chính xác từ danh sách các ví dụ.
Jan Goyvaerts

6

Tôi tin rằng thuật ngữ này là "cảm ứng". Bạn muốn tạo ra một ngữ pháp thông thường.

Tôi không nghĩ là có thể với một tập hợp hữu hạn các ví dụ (tích cực hoặc tiêu cực). Nhưng, nếu tôi nhớ lại chính xác, nó có thể được thực hiện nếu có một Oracle có thể được tư vấn. (Về cơ bản, bạn phải để chương trình hỏi người dùng câu hỏi có / không cho đến khi nó nội dung.)


Vâng, đó là những gì tôi muốn làm, hãy hỏi người dùng một cách tương tác.
Daniel Rikowski

Các tài liệu tham khảo của Yuval F dường như là những gì tôi đã nghĩ đến, tôi khuyên bạn nên xem qua chúng.
Jay Kominek

5

Bạn có thể muốn chơi với trang web này một chút, nó khá tuyệt và có vẻ như nó làm điều gì đó tương tự như những gì bạn đang nói: http://txt2re.com


4

Có một ngôn ngữ dành riêng cho những vấn đề như thế này, dựa trên phần mở đầu. Nó được gọi là progol .

Như những người khác đã đề cập, ý tưởng cơ bản là học quy nạp, thường được gọi là ILP ( lập trình logic quy nạp ) trong giới AI.

Liên kết thứ hai là bài viết wiki trên ILP, chứa rất nhiều tài liệu nguồn hữu ích nếu bạn muốn tìm hiểu thêm về chủ đề này.


2

@Yuval là chính xác. Bạn đang xem lý thuyết học tập tính toán hay "suy luận quy nạp".

Câu hỏi phức tạp hơn bạn nghĩ, vì định nghĩa của "học" là không tầm thường. Một định nghĩa phổ biến là người học có thể phun ra câu trả lời bất cứ khi nào họ muốn, nhưng cuối cùng, họ phải ngừng phun ra câu trả lời, hoặc luôn luôn phun ra cùng một câu trả lời. Điều này giả định số lượng đầu vào vô hạn và hoàn toàn không cung cấp cho garauntee về thời điểm chương trình sẽ đạt được quyết định. Ngoài ra, bạn không thể biết khi nào nó ĐÃ đưa ra quyết định vì nó vẫn có thể xuất ra thứ gì đó khác sau đó.

Theo định nghĩa này, tôi khá chắc chắn rằng các ngôn ngữ thông thường đều có thể học được. Theo các định nghĩa khác, không quá nhiều ...


2

Tôi đã thực hiện một số nghiên cứu trên Google và CiteSeer và tìm thấy các kỹ thuật / giấy tờ sau:

Ngoài ra, "Học các tập hợp thông thường từ truy vấn và phản mẫu" của Dana Angluin có vẻ đầy hứa hẹn, nhưng tôi không thể tìm thấy phiên bản PS hoặc PDF, chỉ trích dẫn và báo cáo hội thảo.

Có vẻ như đây là một bài toán khó ngay cả trên bình diện lý thuyết.


0

Nếu một người có thể học một biểu thức chính quy, thì về cơ bản là có thể đối với một chương trình. Tuy nhiên, chương trình đó sẽ cần được lập trình chính xác để có thể học được. May mắn thay, đây là một không gian logic khá hữu hạn, vì vậy nó sẽ không phức tạp như việc dạy một chương trình để có thể nhìn thấy các vật thể hoặc thứ gì đó tương tự.


1
Không đúng, bạn nên tra cứu những vấn đề không thể giải quyết trên máy Turing.
Stephen Curial

Công bằng mà nói, tôi đã nói nếu một người có thể học một REGEX, thì một cái máy cũng có thể. Tôi không có nghĩa là nó nói chung.
cjk

@scurial Tôi không nghĩ rằng có những vấn đề được mọi người chứng minh là có thể giải quyết được nhưng lại không thể giải quyết được trên các máy turing, phải không?
Sunny88
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.