From 8b8a4e1cbcb69467f567e003d039dd30a815ceec Mon Sep 17 00:00:00 2001 From: motiwari Date: Tue, 31 Aug 2021 23:06:01 -0700 Subject: [PATCH 01/10] Adding ambiguous characters filter --- filters/ambiguousfilter/README.md | 22 ++++++++++++++++++++++ filters/ambiguousfilter/__init__.py | 1 + filters/ambiguousfilter/filter.py | 22 ++++++++++++++++++++++ filters/ambiguousfilter/test.json | 15 +++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 filters/ambiguousfilter/README.md create mode 100644 filters/ambiguousfilter/__init__.py create mode 100644 filters/ambiguousfilter/filter.py create mode 100644 filters/ambiguousfilter/test.json diff --git a/filters/ambiguousfilter/README.md b/filters/ambiguousfilter/README.md new file mode 100644 index 000000000..48c1d1906 --- /dev/null +++ b/filters/ambiguousfilter/README.md @@ -0,0 +1,22 @@ +## Ambiguous Characters Filter + +## What type of a filter is this? + +This filter filters sentences that contain ambiguous characters. + +Author: Mo Tiwari +Author Email: motiwari@stanford.edu +Author Affiliation: Stanford University + +## Why is measuring performance on this split important? +This filter can be used to either a) select text with ambiguous characters, or b) select text that contains only unambiguous characters. +This is of import in domains such as profanity detection and spam, where bad actors may attempt to work around existing filters by using characters that can be easily mistaken for others. + +For example, "Buy some piIIs here" actually contains two capital `I`s for `l`s. + +## Related Work + +N/A + +## What are the limitations of this filter? +- The filter depends on font; fonts may have different sets of ambiguous characters \ No newline at end of file diff --git a/filters/ambiguousfilter/__init__.py b/filters/ambiguousfilter/__init__.py new file mode 100644 index 000000000..1e78c9bed --- /dev/null +++ b/filters/ambiguousfilter/__init__.py @@ -0,0 +1 @@ +from .filter import * diff --git a/filters/ambiguousfilter/filter.py b/filters/ambiguousfilter/filter.py new file mode 100644 index 000000000..a099dd3c6 --- /dev/null +++ b/filters/ambiguousfilter/filter.py @@ -0,0 +1,22 @@ +from interfaces.SentenceOperation import SentenceOperation +from tasks.TaskTypes import TaskType +from initialize import spacy_nlp +import spacy + + +class TextContainsAmbiguousCharactersFilter(SentenceOperation): + tasks = [TaskType.TEXT_CLASSIFICATION, TaskType.TEXT_TO_TEXT_GENERATION] + languages = ["en"] + + def __init__(self, keywords=None): + super().__init__() + if keywords is None: + keywords = ["these", "keywords", "are", "only", "for", "demo"] + self.keywords = keywords + self.nlp = spacy_nlp if spacy_nlp else spacy.load("en_core_web_sm") + + def filter(self, sentence: str = None) -> bool: + tokenized = self.nlp(sentence, disable=["parser", "tagger", "ner"]) + tokenized = [token.text for token in tokenized] + contained_keywords = set(tokenized).intersection(set(self.keywords)) + return bool(contained_keywords) diff --git a/filters/ambiguousfilter/test.json b/filters/ambiguousfilter/test.json new file mode 100644 index 000000000..46e12d6d7 --- /dev/null +++ b/filters/ambiguousfilter/test.json @@ -0,0 +1,15 @@ +{ + "type": "ambiguouscharacters", + "test_cases": [ + { + "class": "TextContainsKeywordsFilter", + "args": { + "keywords": ["in", "at"] + }, + "inputs": { + "sentence": "Andrew played cricket in India" + }, + "outputs": true + } + ] +} \ No newline at end of file From 0cb488aef7ae9eab6ce2876386a7a88689938825 Mon Sep 17 00:00:00 2001 From: motiwari Date: Fri, 17 Sep 2021 15:45:07 -0500 Subject: [PATCH 02/10] Renaming ambiguousfilter folder --- filters/{ambiguousfilter => ambiguouscharacters}/README.md | 0 filters/{ambiguousfilter => ambiguouscharacters}/__init__.py | 0 filters/{ambiguousfilter => ambiguouscharacters}/filter.py | 0 filters/{ambiguousfilter => ambiguouscharacters}/test.json | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename filters/{ambiguousfilter => ambiguouscharacters}/README.md (100%) rename filters/{ambiguousfilter => ambiguouscharacters}/__init__.py (100%) rename filters/{ambiguousfilter => ambiguouscharacters}/filter.py (100%) rename filters/{ambiguousfilter => ambiguouscharacters}/test.json (100%) diff --git a/filters/ambiguousfilter/README.md b/filters/ambiguouscharacters/README.md similarity index 100% rename from filters/ambiguousfilter/README.md rename to filters/ambiguouscharacters/README.md diff --git a/filters/ambiguousfilter/__init__.py b/filters/ambiguouscharacters/__init__.py similarity index 100% rename from filters/ambiguousfilter/__init__.py rename to filters/ambiguouscharacters/__init__.py diff --git a/filters/ambiguousfilter/filter.py b/filters/ambiguouscharacters/filter.py similarity index 100% rename from filters/ambiguousfilter/filter.py rename to filters/ambiguouscharacters/filter.py diff --git a/filters/ambiguousfilter/test.json b/filters/ambiguouscharacters/test.json similarity index 100% rename from filters/ambiguousfilter/test.json rename to filters/ambiguouscharacters/test.json From a69ec1a0dc1ce1c6cb5c67aeebf6029f68596b93 Mon Sep 17 00:00:00 2001 From: motiwari Date: Fri, 17 Sep 2021 16:08:10 -0500 Subject: [PATCH 03/10] Adding alphanumeric characters filter --- filters/alphanumeric/README.md | 26 +++++++++++ filters/alphanumeric/__init__.py | 1 + filters/alphanumeric/alphanumeric_filter.py | 20 +++++++++ filters/alphanumeric/test.json | 50 +++++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 filters/alphanumeric/README.md create mode 100644 filters/alphanumeric/__init__.py create mode 100644 filters/alphanumeric/alphanumeric_filter.py create mode 100644 filters/alphanumeric/test.json diff --git a/filters/alphanumeric/README.md b/filters/alphanumeric/README.md new file mode 100644 index 000000000..428794cce --- /dev/null +++ b/filters/alphanumeric/README.md @@ -0,0 +1,26 @@ +## Alphanumeric Characters Filter + +## What type of filter is this? + +This transformation filters text that contains characters which are non-alphanumeric and not common punctuation. +The alphabetical characters are determined by the 26 letters of the English alphabet. + +Author: Mo Tiwari +Author Email: motiwari@stanford.edu +Author Affiliation: Stanford University + +## Why is measuring performance on this split important? +This filter can be used to a) select text with only characters from a standard alphabet and +b) remove characters that are specifically meant to circumvent filters e.g. text that uses +`buy some pi//s` if the string `buy some pills` triggers spam filters + +This is of import in domains such as profanity detection and spam, where bad actors may attempt to work around existing filters by using characters that can be easily mistaken for others. + +## Related Work + +N/A + +## What are the limitations of this filter? +- Currently, the filter only permits characters as defined by the English alphabet. +The filter could be extended to handle the characters from other alphabets via the `args` +provided. \ No newline at end of file diff --git a/filters/alphanumeric/__init__.py b/filters/alphanumeric/__init__.py new file mode 100644 index 000000000..1e78c9bed --- /dev/null +++ b/filters/alphanumeric/__init__.py @@ -0,0 +1 @@ +from .filter import * diff --git a/filters/alphanumeric/alphanumeric_filter.py b/filters/alphanumeric/alphanumeric_filter.py new file mode 100644 index 000000000..8cdb8689d --- /dev/null +++ b/filters/alphanumeric/alphanumeric_filter.py @@ -0,0 +1,20 @@ +from interfaces.SentenceOperation import SentenceOperation +from tasks.TaskTypes import TaskType +from initialize import spacy_nlp +import spacy + + +class TextContainsKeywordsFilter(SentenceOperation): + tasks = [TaskType.TEXT_CLASSIFICATION, TaskType.TEXT_TO_TEXT_GENERATION] + languages = ["en"] + + def __init__(self, keywords=None): + super().__init__() + self.nlp = spacy_nlp if spacy_nlp else spacy.load("en_core_web_sm") + self.punctuation = ['!', '.', '?', "'", '"', '(', ')', '-', ':', ';', ' '] + + def filter(self, sentence: str = None) -> bool: + for c in sentence: + if not c.isalnum() and c not in self.punctuation: + return False + return True diff --git a/filters/alphanumeric/test.json b/filters/alphanumeric/test.json new file mode 100644 index 000000000..95b80490e --- /dev/null +++ b/filters/alphanumeric/test.json @@ -0,0 +1,50 @@ +{ + "type": "keywords", + "test_cases": [ + { + "class": "AlphanumericCharactersFilter", + "args": { + }, + "inputs": { + "sentence": "Andrew played cricket in India." + }, + "outputs": true + }, + { + "class": "AlphanumericCharactersFilter", + "args": { + }, + "inputs": { + "sentence": "∂ is a Greek letter." + }, + "outputs": false + }, + { + "class": "AlphanumericCharactersFilter", + "args": { + }, + "inputs": { + "sentence": "I love tennis!" + }, + "outputs": true + }, + { + "class": "AlphanumericCharactersFilter", + "args": { + }, + "inputs": { + "sentence": "¿Cómo estás?" + }, + "outputs": false + }, + { + "class": "AlphanumericCharactersFilter", + "args": { + }, + "inputs": { + "sentence": "Some non-alphanumeric characters are ^, *, and ž." + }, + "outputs": false + } + ] +} \ No newline at end of file From ce30eca8328fa519058195cd2097eab2e348ee19 Mon Sep 17 00:00:00 2001 From: motiwari Date: Fri, 17 Sep 2021 16:09:51 -0500 Subject: [PATCH 04/10] Removing unused imports and dead code in alphanumeric filter, renaming class --- filters/alphanumeric/alphanumeric_filter.py | 7 +------ filters/alphanumeric/test.json | 10 +++++----- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/filters/alphanumeric/alphanumeric_filter.py b/filters/alphanumeric/alphanumeric_filter.py index 8cdb8689d..79dc67adb 100644 --- a/filters/alphanumeric/alphanumeric_filter.py +++ b/filters/alphanumeric/alphanumeric_filter.py @@ -1,16 +1,11 @@ -from interfaces.SentenceOperation import SentenceOperation from tasks.TaskTypes import TaskType -from initialize import spacy_nlp -import spacy - -class TextContainsKeywordsFilter(SentenceOperation): +class AlphanumericFilter(SentenceOperation): tasks = [TaskType.TEXT_CLASSIFICATION, TaskType.TEXT_TO_TEXT_GENERATION] languages = ["en"] def __init__(self, keywords=None): super().__init__() - self.nlp = spacy_nlp if spacy_nlp else spacy.load("en_core_web_sm") self.punctuation = ['!', '.', '?', "'", '"', '(', ')', '-', ':', ';', ' '] def filter(self, sentence: str = None) -> bool: diff --git a/filters/alphanumeric/test.json b/filters/alphanumeric/test.json index 95b80490e..ead171421 100644 --- a/filters/alphanumeric/test.json +++ b/filters/alphanumeric/test.json @@ -2,7 +2,7 @@ "type": "keywords", "test_cases": [ { - "class": "AlphanumericCharactersFilter", + "class": "AlphanumericFilter", "args": { }, "inputs": { @@ -11,7 +11,7 @@ "outputs": true }, { - "class": "AlphanumericCharactersFilter", + "class": "AlphanumericFilter", "args": { }, "inputs": { @@ -20,7 +20,7 @@ "outputs": false }, { - "class": "AlphanumericCharactersFilter", + "class": "AlphanumericFilter", "args": { }, "inputs": { @@ -29,7 +29,7 @@ "outputs": true }, { - "class": "AlphanumericCharactersFilter", + "class": "AlphanumericFilter", "args": { }, "inputs": { @@ -38,7 +38,7 @@ "outputs": false }, { - "class": "AlphanumericCharactersFilter", + "class": "AlphanumericFilter", "args": { }, "inputs": { From c62cf5b866a90a8592854ccc3e7b21087f0ffa9f Mon Sep 17 00:00:00 2001 From: motiwari Date: Fri, 17 Sep 2021 16:30:53 -0500 Subject: [PATCH 05/10] Adding ambiguous characters filter --- filters/ambiguouscharacters/README.md | 8 +++++- filters/ambiguouscharacters/filter.py | 25 +++++++++------- filters/ambiguouscharacters/test.json | 41 +++++++++++++++++++++++++-- 3 files changed, 59 insertions(+), 15 deletions(-) diff --git a/filters/ambiguouscharacters/README.md b/filters/ambiguouscharacters/README.md index 48c1d1906..b5f2c4461 100644 --- a/filters/ambiguouscharacters/README.md +++ b/filters/ambiguouscharacters/README.md @@ -3,6 +3,7 @@ ## What type of a filter is this? This filter filters sentences that contain ambiguous characters. +(Aside: `Buffalo buffalo buffalo Buffalo buffalo Buffalo buffalo buffalo --> Filter filters filter filter filters filter filters filter`?) Author: Mo Tiwari Author Email: motiwari@stanford.edu @@ -14,9 +15,14 @@ This is of import in domains such as profanity detection and spam, where bad act For example, "Buy some piIIs here" actually contains two capital `I`s for `l`s. +This feature is also common in password managers, e.g. as a setting to avoid ambiguous characters when generating +passwords. + ## Related Work N/A ## What are the limitations of this filter? -- The filter depends on font; fonts may have different sets of ambiguous characters \ No newline at end of file +- The usefulness of the filter depends on font in which the initial text was rendered; future work could accept the +source font as an argument +- The filter is also primarily useful for the English language. \ No newline at end of file diff --git a/filters/ambiguouscharacters/filter.py b/filters/ambiguouscharacters/filter.py index a099dd3c6..a2b319098 100644 --- a/filters/ambiguouscharacters/filter.py +++ b/filters/ambiguouscharacters/filter.py @@ -1,22 +1,25 @@ from interfaces.SentenceOperation import SentenceOperation from tasks.TaskTypes import TaskType -from initialize import spacy_nlp -import spacy -class TextContainsAmbiguousCharactersFilter(SentenceOperation): +class AmbiguousCharactersFilter(SentenceOperation): tasks = [TaskType.TEXT_CLASSIFICATION, TaskType.TEXT_TO_TEXT_GENERATION] languages = ["en"] def __init__(self, keywords=None): super().__init__() - if keywords is None: - keywords = ["these", "keywords", "are", "only", "for", "demo"] - self.keywords = keywords - self.nlp = spacy_nlp if spacy_nlp else spacy.load("en_core_web_sm") + self.ambiguous_chars = [ + '0', 'O', 'D', 'o', 'Q', + 'l', '1', 'I', 'i', '!', '|', + 'B', '8', + 'Z', '2', + 'S', '5', + 'G', '6', + "'", '`', + ] def filter(self, sentence: str = None) -> bool: - tokenized = self.nlp(sentence, disable=["parser", "tagger", "ner"]) - tokenized = [token.text for token in tokenized] - contained_keywords = set(tokenized).intersection(set(self.keywords)) - return bool(contained_keywords) + for c in sentence: + if c in self.ambiguous_chars: + return False + return True diff --git a/filters/ambiguouscharacters/test.json b/filters/ambiguouscharacters/test.json index 46e12d6d7..c20566329 100644 --- a/filters/ambiguouscharacters/test.json +++ b/filters/ambiguouscharacters/test.json @@ -2,12 +2,47 @@ "type": "ambiguouscharacters", "test_cases": [ { - "class": "TextContainsKeywordsFilter", + "class": "AmbiguousCharactersFilter", "args": { - "keywords": ["in", "at"] }, "inputs": { - "sentence": "Andrew played cricket in India" + "sentence": "Buy some piIIs here." + }, + "outputs": false + }, + { + "class": "AmbiguousCharactersFilter", + "args": { + }, + "inputs": { + "sentence": "0nly one person passed the test." + }, + "outputs": false + }, + { + "class": "AmbiguousCharactersFilter", + "args": { + }, + "inputs": { + "sentence": "A ` can appear as a '" + }, + "outputs": false + }, + { + "class": "AmbiguousCharactersFilter", + "args": { + }, + "inputs": { + "sentence": "She has a cat." + }, + "outputs": true + }, + { + "class": "AmbiguousCharactersFilter", + "args": { + }, + "inputs": { + "sentence": "Characters passes the filter." }, "outputs": true } From 713be42700c4b41f9d4f041437545b65b618d5e4 Mon Sep 17 00:00:00 2001 From: motiwari Date: Sat, 18 Sep 2021 13:49:21 -0700 Subject: [PATCH 06/10] Fixing import error by renaming alphanumeric_filter.py -> filter.py --- filters/alphanumeric/{alphanumeric_filter.py => filter.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename filters/alphanumeric/{alphanumeric_filter.py => filter.py} (100%) diff --git a/filters/alphanumeric/alphanumeric_filter.py b/filters/alphanumeric/filter.py similarity index 100% rename from filters/alphanumeric/alphanumeric_filter.py rename to filters/alphanumeric/filter.py From 0c42053df028a1be5a6637881df105d48d8b327d Mon Sep 17 00:00:00 2001 From: motiwari Date: Sat, 18 Sep 2021 14:30:42 -0700 Subject: [PATCH 07/10] Adding keywords --- filters/ambiguouscharacters/filter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/filters/ambiguouscharacters/filter.py b/filters/ambiguouscharacters/filter.py index a2b319098..e8ce7e11d 100644 --- a/filters/ambiguouscharacters/filter.py +++ b/filters/ambiguouscharacters/filter.py @@ -5,6 +5,7 @@ class AmbiguousCharactersFilter(SentenceOperation): tasks = [TaskType.TEXT_CLASSIFICATION, TaskType.TEXT_TO_TEXT_GENERATION] languages = ["en"] + keywords = ["highly-meaning-preserving", "low-generations", "rule-based"] def __init__(self, keywords=None): super().__init__() From 3646e93f93749000b9f73deca25e06aa24589044 Mon Sep 17 00:00:00 2001 From: motiwari Date: Tue, 2 Nov 2021 15:40:48 -0400 Subject: [PATCH 08/10] Addressing reviewers comments --- filters/alphanumeric/filter.py | 8 +++++++- filters/alphanumeric/test.json | 10 ---------- filters/ambiguouscharacters/filter.py | 7 ++++++- filters/ambiguouscharacters/test.json | 12 +----------- test/mapper.py | 2 ++ 5 files changed, 16 insertions(+), 23 deletions(-) diff --git a/filters/alphanumeric/filter.py b/filters/alphanumeric/filter.py index 79dc67adb..6f5222c06 100644 --- a/filters/alphanumeric/filter.py +++ b/filters/alphanumeric/filter.py @@ -1,10 +1,16 @@ from tasks.TaskTypes import TaskType class AlphanumericFilter(SentenceOperation): + """ + Filters sentence that characters which are a) not alphanumeric and b) not common punctuation. + + Inherits SentenceOperation. + """ tasks = [TaskType.TEXT_CLASSIFICATION, TaskType.TEXT_TO_TEXT_GENERATION] languages = ["en"] + keywords = ["highly-meaning-preserving", "low-generations", "rule-based"] - def __init__(self, keywords=None): + def __init__(self): super().__init__() self.punctuation = ['!', '.', '?', "'", '"', '(', ')', '-', ':', ';', ' '] diff --git a/filters/alphanumeric/test.json b/filters/alphanumeric/test.json index ead171421..42e509320 100644 --- a/filters/alphanumeric/test.json +++ b/filters/alphanumeric/test.json @@ -3,8 +3,6 @@ "test_cases": [ { "class": "AlphanumericFilter", - "args": { - }, "inputs": { "sentence": "Andrew played cricket in India." }, @@ -12,8 +10,6 @@ }, { "class": "AlphanumericFilter", - "args": { - }, "inputs": { "sentence": "∂ is a Greek letter." }, @@ -21,8 +17,6 @@ }, { "class": "AlphanumericFilter", - "args": { - }, "inputs": { "sentence": "I love tennis!" }, @@ -30,8 +24,6 @@ }, { "class": "AlphanumericFilter", - "args": { - }, "inputs": { "sentence": "¿Cómo estás?" }, @@ -39,8 +31,6 @@ }, { "class": "AlphanumericFilter", - "args": { - }, "inputs": { "sentence": "Some non-alphanumeric characters are ^, *, and ž." }, diff --git a/filters/ambiguouscharacters/filter.py b/filters/ambiguouscharacters/filter.py index e8ce7e11d..1cf3d23a2 100644 --- a/filters/ambiguouscharacters/filter.py +++ b/filters/ambiguouscharacters/filter.py @@ -3,11 +3,16 @@ class AmbiguousCharactersFilter(SentenceOperation): + """ + Filters sentence that contain ambiguous characters. The characters that might be ambiguous are defined below. + + Inherits SentenceOperation. + """ tasks = [TaskType.TEXT_CLASSIFICATION, TaskType.TEXT_TO_TEXT_GENERATION] languages = ["en"] keywords = ["highly-meaning-preserving", "low-generations", "rule-based"] - def __init__(self, keywords=None): + def __init__(self): super().__init__() self.ambiguous_chars = [ '0', 'O', 'D', 'o', 'Q', diff --git a/filters/ambiguouscharacters/test.json b/filters/ambiguouscharacters/test.json index c20566329..e45d89684 100644 --- a/filters/ambiguouscharacters/test.json +++ b/filters/ambiguouscharacters/test.json @@ -3,8 +3,6 @@ "test_cases": [ { "class": "AmbiguousCharactersFilter", - "args": { - }, "inputs": { "sentence": "Buy some piIIs here." }, @@ -12,8 +10,6 @@ }, { "class": "AmbiguousCharactersFilter", - "args": { - }, "inputs": { "sentence": "0nly one person passed the test." }, @@ -21,8 +17,6 @@ }, { "class": "AmbiguousCharactersFilter", - "args": { - }, "inputs": { "sentence": "A ` can appear as a '" }, @@ -30,17 +24,13 @@ }, { "class": "AmbiguousCharactersFilter", - "args": { - }, "inputs": { - "sentence": "She has a cat." + "sentence": "He has a cat." }, "outputs": true }, { "class": "AmbiguousCharactersFilter", - "args": { - }, "inputs": { "sentence": "Characters passes the filter." }, diff --git a/test/mapper.py b/test/mapper.py index 1238534cd..1ae73a9a4 100644 --- a/test/mapper.py +++ b/test/mapper.py @@ -85,6 +85,8 @@ # Mapping of light and heavy filters map_filter = { "light": [ + "alphanumeric", + "ambiguouscharacters", "code_mixing", "encoding", "group_inequity", From a7a2639fd879084c4e8c16d69e0e09b4f2e62715 Mon Sep 17 00:00:00 2001 From: motiwari Date: Sun, 14 Nov 2021 17:01:20 -0500 Subject: [PATCH 09/10] Adding necessary import --- filters/alphanumeric/filter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/filters/alphanumeric/filter.py b/filters/alphanumeric/filter.py index 6f5222c06..e98b02033 100644 --- a/filters/alphanumeric/filter.py +++ b/filters/alphanumeric/filter.py @@ -1,4 +1,5 @@ from tasks.TaskTypes import TaskType +from interfaces.SentenceOperation import SentenceOperation class AlphanumericFilter(SentenceOperation): """ From 3b79ce97518580c9725709db6f8bcc9816c3e1f6 Mon Sep 17 00:00:00 2001 From: motiwari Date: Mon, 15 Nov 2021 11:20:24 -0500 Subject: [PATCH 10/10] Making recommended changes --- filters/ambiguouscharacters/test.json | 35 --------------------------- 1 file changed, 35 deletions(-) diff --git a/filters/ambiguouscharacters/test.json b/filters/ambiguouscharacters/test.json index e45d89684..e96b978c1 100644 --- a/filters/ambiguouscharacters/test.json +++ b/filters/ambiguouscharacters/test.json @@ -1,40 +1,5 @@ { "type": "ambiguouscharacters", "test_cases": [ - { - "class": "AmbiguousCharactersFilter", - "inputs": { - "sentence": "Buy some piIIs here." - }, - "outputs": false - }, - { - "class": "AmbiguousCharactersFilter", - "inputs": { - "sentence": "0nly one person passed the test." - }, - "outputs": false - }, - { - "class": "AmbiguousCharactersFilter", - "inputs": { - "sentence": "A ` can appear as a '" - }, - "outputs": false - }, - { - "class": "AmbiguousCharactersFilter", - "inputs": { - "sentence": "He has a cat." - }, - "outputs": true - }, - { - "class": "AmbiguousCharactersFilter", - "inputs": { - "sentence": "Characters passes the filter." - }, - "outputs": true - } ] } \ No newline at end of file