From f3fa937f2451082be39a37dcec13542875045f57 Mon Sep 17 00:00:00 2001 From: lerow Date: Tue, 1 Aug 2023 13:34:40 -0700 Subject: [PATCH 1/6] added quant understand --- .../quantifier_understanding/__init__.py | 0 .../quantifier_understanding/config.jsonnet | 49 +++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/genbench/tasks/quantifier_understanding/__init__.py create mode 100644 src/genbench/tasks/quantifier_understanding/config.jsonnet diff --git a/src/genbench/tasks/quantifier_understanding/__init__.py b/src/genbench/tasks/quantifier_understanding/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/genbench/tasks/quantifier_understanding/config.jsonnet b/src/genbench/tasks/quantifier_understanding/config.jsonnet new file mode 100644 index 0000000..c634dde --- /dev/null +++ b/src/genbench/tasks/quantifier_understanding/config.jsonnet @@ -0,0 +1,49 @@ +{ + name: 'Quantifier Understanding', + description: 'The task evaluates generalization in the understanding of quantifiers. It aims to measure + how well can language models capture the semantics of logical quantifiers in language. + ', + keywords: [ + 'quantifiers', + 'LLM', + 'prompting', + 'semantics' + ], + + authors: [ + 'Leroy Wang', + ], + + data_source: { + type: 'manual', + test: 'https://raw.githubusercontent.com/dieuwkehupkes/genbench_cbt_sample_submission/frequency_math/src/genbench/tasks/frequency_based_mathematics/test_data.jsonl', + }, + + has_validation_set: false, + has_train_set: false, + + task_type: 'free_form', + + evaluation_metrics: [ + { + hf_id: 'exact_match', + git_commit_sha: "758135da6a37ce962b7bc38c6dd5eab672d2b742", + best_score: 1.0, + } + ], + + preparation_strategies: { + // A recipe for preparing the model to perform the task by configuring its prompt. + // This recipe is suitable for generative LMs such as GPT-3, OPT, T5, etc. + // We provide a few options for configuring the prompt. But, the task creator can + // also provide a custom prompt preparation in the task's Python class. + prompt_based_testing: { + prompt_builder: { + instruction_zero_shot: '', // Left empty because the prompt is in the data + instruction_few_shot: '', // Left empty because the prompt is in the data + input_prefix: 'Q: ', + output_prefix: '\nA: ', + } + }, + }, +} From 6b5ef0acf6487f384dc73634175d1804d2a32a9c Mon Sep 17 00:00:00 2001 From: lerow Date: Tue, 1 Aug 2023 13:39:08 -0700 Subject: [PATCH 2/6] added data --- .../quantifier_understanding/test_data.jsonl | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 src/genbench/tasks/quantifier_understanding/test_data.jsonl diff --git a/src/genbench/tasks/quantifier_understanding/test_data.jsonl b/src/genbench/tasks/quantifier_understanding/test_data.jsonl new file mode 100644 index 0000000..b6e961f --- /dev/null +++ b/src/genbench/tasks/quantifier_understanding/test_data.jsonl @@ -0,0 +1,100 @@ +{'input': 'There are 10 tables. 7 of the tables are blue. 3 of the tables are red. Are less than half of the tables red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 tables. 6 of the tables are blue. 4 of the tables are red. Are less than half of the tables red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 tables. 5 of the tables are blue. 5 of the tables are red. Are less than half of the tables red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 tables. 4 of the tables are blue. 6 of the tables are red. Are less than half of the tables red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 tables. 3 of the tables are blue. 7 of the tables are red. Are less than half of the tables red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 chairs. 7 of the chairs are blue. 3 of the chairs are red. Are less than half of the chairs red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 chairs. 6 of the chairs are blue. 4 of the chairs are red. Are less than half of the chairs red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 chairs. 5 of the chairs are blue. 5 of the chairs are red. Are less than half of the chairs red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 chairs. 4 of the chairs are blue. 6 of the chairs are red. Are less than half of the chairs red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 chairs. 3 of the chairs are blue. 7 of the chairs are red. Are less than half of the chairs red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 circles. 7 of the circles are blue. 3 of the circles are red. Are less than half of the circles red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 circles. 6 of the circles are blue. 4 of the circles are red. Are less than half of the circles red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 circles. 5 of the circles are blue. 5 of the circles are red. Are less than half of the circles red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 circles. 4 of the circles are blue. 6 of the circles are red. Are less than half of the circles red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 circles. 3 of the circles are blue. 7 of the circles are red. Are less than half of the circles red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 squares. 7 of the squares are blue. 3 of the squares are red. Are less than half of the squares red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 squares. 6 of the squares are blue. 4 of the squares are red. Are less than half of the squares red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 squares. 5 of the squares are blue. 5 of the squares are red. Are less than half of the squares red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 squares. 4 of the squares are blue. 6 of the squares are red. Are less than half of the squares red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 squares. 3 of the squares are blue. 7 of the squares are red. Are less than half of the squares red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 apples. 7 of the apples are blue. 3 of the apples are red. Are less than half of the apples red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 apples. 6 of the apples are blue. 4 of the apples are red. Are less than half of the apples red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 apples. 5 of the apples are blue. 5 of the apples are red. Are less than half of the apples red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 apples. 4 of the apples are blue. 6 of the apples are red. Are less than half of the apples red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 apples. 3 of the apples are blue. 7 of the apples are red. Are less than half of the apples red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 tables. 7 of the tables are blue. 3 of the tables are red. Are more than half of the tables red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 tables. 6 of the tables are blue. 4 of the tables are red. Are more than half of the tables red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 tables. 5 of the tables are blue. 5 of the tables are red. Are more than half of the tables red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 tables. 4 of the tables are blue. 6 of the tables are red. Are more than half of the tables red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 tables. 3 of the tables are blue. 7 of the tables are red. Are more than half of the tables red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 chairs. 7 of the chairs are blue. 3 of the chairs are red. Are more than half of the chairs red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 chairs. 6 of the chairs are blue. 4 of the chairs are red. Are more than half of the chairs red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 chairs. 5 of the chairs are blue. 5 of the chairs are red. Are more than half of the chairs red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 chairs. 4 of the chairs are blue. 6 of the chairs are red. Are more than half of the chairs red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 chairs. 3 of the chairs are blue. 7 of the chairs are red. Are more than half of the chairs red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 circles. 7 of the circles are blue. 3 of the circles are red. Are more than half of the circles red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 circles. 6 of the circles are blue. 4 of the circles are red. Are more than half of the circles red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 circles. 5 of the circles are blue. 5 of the circles are red. Are more than half of the circles red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 circles. 4 of the circles are blue. 6 of the circles are red. Are more than half of the circles red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 circles. 3 of the circles are blue. 7 of the circles are red. Are more than half of the circles red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 squares. 7 of the squares are blue. 3 of the squares are red. Are more than half of the squares red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 squares. 6 of the squares are blue. 4 of the squares are red. Are more than half of the squares red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 squares. 5 of the squares are blue. 5 of the squares are red. Are more than half of the squares red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 squares. 4 of the squares are blue. 6 of the squares are red. Are more than half of the squares red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 squares. 3 of the squares are blue. 7 of the squares are red. Are more than half of the squares red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 apples. 7 of the apples are blue. 3 of the apples are red. Are more than half of the apples red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 apples. 6 of the apples are blue. 4 of the apples are red. Are more than half of the apples red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 apples. 5 of the apples are blue. 5 of the apples are red. Are more than half of the apples red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 apples. 4 of the apples are blue. 6 of the apples are red. Are more than half of the apples red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 apples. 3 of the apples are blue. 7 of the apples are red. Are more than half of the apples red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 tables. 7 of the tables are blue. 3 of the tables are red. Are at least 4 of the tables red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 tables. 6 of the tables are blue. 4 of the tables are red. Are at least 4 of the tables red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 tables. 5 of the tables are blue. 5 of the tables are red. Are at least 4 of the tables red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 tables. 4 of the tables are blue. 6 of the tables are red. Are at least 4 of the tables red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 tables. 3 of the tables are blue. 7 of the tables are red. Are at least 4 of the tables red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 chairs. 7 of the chairs are blue. 3 of the chairs are red. Are at least 4 of the chairs red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 chairs. 6 of the chairs are blue. 4 of the chairs are red. Are at least 4 of the chairs red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 chairs. 5 of the chairs are blue. 5 of the chairs are red. Are at least 4 of the chairs red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 chairs. 4 of the chairs are blue. 6 of the chairs are red. Are at least 4 of the chairs red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 chairs. 3 of the chairs are blue. 7 of the chairs are red. Are at least 4 of the chairs red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 circles. 7 of the circles are blue. 3 of the circles are red. Are at least 4 of the circles red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 circles. 6 of the circles are blue. 4 of the circles are red. Are at least 4 of the circles red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 circles. 5 of the circles are blue. 5 of the circles are red. Are at least 4 of the circles red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 circles. 4 of the circles are blue. 6 of the circles are red. Are at least 4 of the circles red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 circles. 3 of the circles are blue. 7 of the circles are red. Are at least 4 of the circles red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 squares. 7 of the squares are blue. 3 of the squares are red. Are at least 4 of the squares red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 squares. 6 of the squares are blue. 4 of the squares are red. Are at least 4 of the squares red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 squares. 5 of the squares are blue. 5 of the squares are red. Are at least 4 of the squares red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 squares. 4 of the squares are blue. 6 of the squares are red. Are at least 4 of the squares red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 squares. 3 of the squares are blue. 7 of the squares are red. Are at least 4 of the squares red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 apples. 7 of the apples are blue. 3 of the apples are red. Are at least 4 of the apples red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 apples. 6 of the apples are blue. 4 of the apples are red. Are at least 4 of the apples red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 apples. 5 of the apples are blue. 5 of the apples are red. Are at least 4 of the apples red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 apples. 4 of the apples are blue. 6 of the apples are red. Are at least 4 of the apples red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 apples. 3 of the apples are blue. 7 of the apples are red. Are at least 4 of the apples red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 tables. 7 of the tables are blue. 3 of the tables are red. Are at most 4 of the tables red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 tables. 6 of the tables are blue. 4 of the tables are red. Are at most 4 of the tables red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 tables. 5 of the tables are blue. 5 of the tables are red. Are at most 4 of the tables red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 tables. 4 of the tables are blue. 6 of the tables are red. Are at most 4 of the tables red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 tables. 3 of the tables are blue. 7 of the tables are red. Are at most 4 of the tables red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 chairs. 7 of the chairs are blue. 3 of the chairs are red. Are at most 4 of the chairs red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 chairs. 6 of the chairs are blue. 4 of the chairs are red. Are at most 4 of the chairs red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 chairs. 5 of the chairs are blue. 5 of the chairs are red. Are at most 4 of the chairs red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 chairs. 4 of the chairs are blue. 6 of the chairs are red. Are at most 4 of the chairs red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 chairs. 3 of the chairs are blue. 7 of the chairs are red. Are at most 4 of the chairs red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 circles. 7 of the circles are blue. 3 of the circles are red. Are at most 4 of the circles red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 circles. 6 of the circles are blue. 4 of the circles are red. Are at most 4 of the circles red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 circles. 5 of the circles are blue. 5 of the circles are red. Are at most 4 of the circles red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 circles. 4 of the circles are blue. 6 of the circles are red. Are at most 4 of the circles red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 circles. 3 of the circles are blue. 7 of the circles are red. Are at most 4 of the circles red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 squares. 7 of the squares are blue. 3 of the squares are red. Are at most 4 of the squares red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 squares. 6 of the squares are blue. 4 of the squares are red. Are at most 4 of the squares red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 squares. 5 of the squares are blue. 5 of the squares are red. Are at most 4 of the squares red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 squares. 4 of the squares are blue. 6 of the squares are red. Are at most 4 of the squares red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 squares. 3 of the squares are blue. 7 of the squares are red. Are at most 4 of the squares red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 apples. 7 of the apples are blue. 3 of the apples are red. Are at most 4 of the apples red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 apples. 6 of the apples are blue. 4 of the apples are red. Are at most 4 of the apples red? Answer with only one word, true or false.', 'target': 'true'} +{'input': 'There are 10 apples. 5 of the apples are blue. 5 of the apples are red. Are at most 4 of the apples red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 apples. 4 of the apples are blue. 6 of the apples are red. Are at most 4 of the apples red? Answer with only one word, true or false.', 'target': 'false'} +{'input': 'There are 10 apples. 3 of the apples are blue. 7 of the apples are red. Are at most 4 of the apples red? Answer with only one word, true or false.', 'target': 'false'} From 10179449de05ea5e19ce7f8a413d495ada12e806 Mon Sep 17 00:00:00 2001 From: lerow Date: Tue, 1 Aug 2023 13:40:37 -0700 Subject: [PATCH 3/6] added url --- src/genbench/tasks/quantifier_understanding/config.jsonnet | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/genbench/tasks/quantifier_understanding/config.jsonnet b/src/genbench/tasks/quantifier_understanding/config.jsonnet index c634dde..fa4313d 100644 --- a/src/genbench/tasks/quantifier_understanding/config.jsonnet +++ b/src/genbench/tasks/quantifier_understanding/config.jsonnet @@ -16,7 +16,7 @@ data_source: { type: 'manual', - test: 'https://raw.githubusercontent.com/dieuwkehupkes/genbench_cbt_sample_submission/frequency_math/src/genbench/tasks/frequency_based_mathematics/test_data.jsonl', + test: 'https://github.com/lerow/genbench_cbt/blob/quantifier_understanding/src/genbench/tasks/quantifier_understanding/test_data.jsonl', }, has_validation_set: false, From 210f8100b76d90f4c57e6d2570aee0039dd2d526 Mon Sep 17 00:00:00 2001 From: lerow Date: Tue, 1 Aug 2023 16:46:17 -0700 Subject: [PATCH 4/6] added doc --- .../tasks/quantifier_understanding/doc.md | 24 ++++++++ .../quantifier_understanding/eval_card.png | Bin 0 -> 44649 bytes .../tasks/quantifier_understanding/task.py | 55 ++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 src/genbench/tasks/quantifier_understanding/doc.md create mode 100644 src/genbench/tasks/quantifier_understanding/eval_card.png create mode 100644 src/genbench/tasks/quantifier_understanding/task.py diff --git a/src/genbench/tasks/quantifier_understanding/doc.md b/src/genbench/tasks/quantifier_understanding/doc.md new file mode 100644 index 0000000..f9c36dd --- /dev/null +++ b/src/genbench/tasks/quantifier_understanding/doc.md @@ -0,0 +1,24 @@ +# Quantifier Understanding + +The task evaluates generalization in the understanding of quantifiers. It aims to measure +how well can language models capture the semantics of logical quantifiers in natural language. It tests compositional and robustness generalisation. + + +## Examples + +Given a question about a quantifier, determine if the answer is true or false. + +``` +There are 10 tables. 7 of the tables are blue. 3 of the tables are red. Are less than half of the tables red? Answer with only one word, true or false. +``` + +## Data Source + +The test data is fully generated using rule-based methods. + +The data is hosted here [https://github.com/lerow/genbench_cbt/blob/quantifier_understanding/src/genbench/tasks/quantifier_understanding/test_data.jsonl]. + + +## GenBench eval card + +![GenBench Eval Card](eval_card.png) diff --git a/src/genbench/tasks/quantifier_understanding/eval_card.png b/src/genbench/tasks/quantifier_understanding/eval_card.png new file mode 100644 index 0000000000000000000000000000000000000000..6d0adc2dfff7dd8e84f00ae5eca44ad3c7b55c99 GIT binary patch literal 44649 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 literal 0 HcmV?d00001 diff --git a/src/genbench/tasks/quantifier_understanding/task.py b/src/genbench/tasks/quantifier_understanding/task.py new file mode 100644 index 0000000..ba9e574 --- /dev/null +++ b/src/genbench/tasks/quantifier_understanding/task.py @@ -0,0 +1,55 @@ +from typing import Any, Dict, List + +import datasets + +from genbench import Task +from genbench.utils.logging import get_logger + + +logger = get_logger(__name__) + + +class QuantifierUnderstandingTask(Task): + + + def evaluate_predictions( + self, + *, + predictions: List[Dict[str, Any]] = None, + gold: datasets.Dataset = None + ) -> float: + + + preds= [pred["target"] for pred in predictions] + gold_labels = [g["target"] for g in gold] + + count = 0 + total = len(preds) + + for n in range(total): + label = parse_output(preds[n]) + if label == gold_labels[n]: + count += 1 + + + return count / total + + + def remove_non_letter(s: str) -> str: + return re.sub(r'[^a-zA-Z]', '', s) + + + def parse_output(s: str) -> str: + # if true return 1 else return 0 + + s = s.strip().split() + + for token in s: + if len(token) < 7: + token = remove_non_letter(token).lower() + if token == "true": + return "true" + if token == "false": + return "false" + + return "false" From 16f34a45b8be656a7fe4f35a52c46b665b38eea1 Mon Sep 17 00:00:00 2001 From: lerow Date: Thu, 3 Aug 2023 02:57:34 -0700 Subject: [PATCH 5/6] fixed style --- .../tasks/quantifier_understanding/task.py | 46 +++++++------------ 1 file changed, 17 insertions(+), 29 deletions(-) diff --git a/src/genbench/tasks/quantifier_understanding/task.py b/src/genbench/tasks/quantifier_understanding/task.py index ba9e574..fd2d825 100644 --- a/src/genbench/tasks/quantifier_understanding/task.py +++ b/src/genbench/tasks/quantifier_understanding/task.py @@ -1,3 +1,4 @@ +import re from typing import Any, Dict, List import datasets @@ -10,46 +11,33 @@ class QuantifierUnderstandingTask(Task): + def parse_output(s: str) -> str: + # if true return 1 else return 0 + s = s.strip().split() - def evaluate_predictions( - self, - *, - predictions: List[Dict[str, Any]] = None, - gold: datasets.Dataset = None - ) -> float: + for token in s: + if len(token) < 7: + token = re.sub(r"[^a-zA-Z]", "", token).lower() + if token == "true": + return "true" + if token == "false": + return "false" + return "false" - preds= [pred["target"] for pred in predictions] + def evaluate_predictions( + self, *, predictions: List[Dict[str, Any]] = None, gold: datasets.Dataset = None + ) -> float: + preds = [pred["target"] for pred in predictions] gold_labels = [g["target"] for g in gold] count = 0 total = len(preds) for n in range(total): - label = parse_output(preds[n]) + label = self.parse_output(preds[n]) if label == gold_labels[n]: count += 1 - return count / total - - - def remove_non_letter(s: str) -> str: - return re.sub(r'[^a-zA-Z]', '', s) - - - def parse_output(s: str) -> str: - # if true return 1 else return 0 - - s = s.strip().split() - - for token in s: - if len(token) < 7: - token = remove_non_letter(token).lower() - if token == "true": - return "true" - if token == "false": - return "false" - - return "false" From ca2a4578adc1450035078f2a7445fc0242e9c9d1 Mon Sep 17 00:00:00 2001 From: Leroy Wang Date: Fri, 1 Sep 2023 14:05:04 -0700 Subject: [PATCH 6/6] Update config.jsonnet --- src/genbench/tasks/quantifier_understanding/config.jsonnet | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/genbench/tasks/quantifier_understanding/config.jsonnet b/src/genbench/tasks/quantifier_understanding/config.jsonnet index fa4313d..72c8976 100644 --- a/src/genbench/tasks/quantifier_understanding/config.jsonnet +++ b/src/genbench/tasks/quantifier_understanding/config.jsonnet @@ -12,11 +12,12 @@ authors: [ 'Leroy Wang', + 'Shane Steinert-Threlkeld' ], data_source: { type: 'manual', - test: 'https://github.com/lerow/genbench_cbt/blob/quantifier_understanding/src/genbench/tasks/quantifier_understanding/test_data.jsonl', + test: 'https://raw.githubusercontent.com/lerow/genbench_cbt/quantifier_understanding/src/genbench/tasks/quantifier_understanding/test_data.jsonl', }, has_validation_set: false,