Match known patterns.

ssn = r"\b\d{3}-\d{2}-\d{4}\b"

card = r"\b(?:\d[ -]?){16}\b"

if (re.search(ssn, doc)

or re.search(card, doc)

or "passport" in doc.lower()):

block(doc)

else:

publish(doc)These checks miss the name and address.

Document: Maya Chen lives at 14 Cedar Lane.. The shown regexes find neither a name nor an address.

ssn = r"\b\d{3}-\d{2}-\d{4}\b"

card = r"\b(?:\d[ -]?){16}\b"

if (re.search(ssn, doc)

or re.search(card, doc)

or "passport" in doc.lower()):

block(doc)

else:

publish(doc)private = decide(

doc, yesno("Contains personal information?")

)

match private["answer"]:

case "yes": block(doc)

case "no": publish(doc)

case None: review(doc)Sage returns yes, so the application blocks the document. No publishes it; null sends it for review.

01 / Inside the machine

Maya Chen lives at 14 Cedar Lane.

ssn = r"\b\d{3}-\d{2}-\d{4}\b"

card = r"\b(?:\d[ -]?){16}\b"

if (re.search(ssn, doc)

or re.search(card, doc)

or "passport" in doc.lower()):

block(doc)

else:

publish(doc)These checks miss the name and address.

private = decide(

doc, yesno("Contains personal information?")

)

match private["answer"]:

case "yes": block(doc)

case "no": publish(doc)

case None: review(doc)The same document. A semantic decision.

The question and the document go to Sage while the program runs.

{

"answer": "yes",

"probability": 0.99

}The application blocks publication. An uncertain answer goes to a person.