From 1e1a6cf11e4ac06efe586af500aa4d9e41d39544 Mon Sep 17 00:00:00 2001 From: Jonas Weinz Date: Fri, 12 Jul 2019 15:45:40 +0200 Subject: [PATCH] fist crf results for simple entity recognition and also synced other stuff --- Tagging/CRF_evaluation.ipynb | 1680 +++++++++++++++++++++++++ Tagging/CRF_training.ipynb | 576 +++++++++ Tagging/Conllu_Training.ipynb | 290 +++++ Tagging/README.md | 4 + Tagging/Recioe_Tagging.ipynb | 81 +- Tagging/Recipe_Tagging_Analysis.ipynb | 1467 +++++++++++++++++++++ Tagging/conllu_batch_generator.py | 275 ++++ Tagging/conllu_generator.py | 90 +- Tagging/crf_data_generator.py | 123 ++ Tagging/recipe_collnu_generator.py | 9 +- Tagging/tagging_tools.py | 28 + Tagging/test.crfsuite | Bin 0 -> 544048 bytes tools.py | 102 ++ 13 files changed, 4684 insertions(+), 41 deletions(-) create mode 100644 Tagging/CRF_evaluation.ipynb create mode 100644 Tagging/CRF_training.ipynb create mode 100644 Tagging/Conllu_Training.ipynb create mode 100644 Tagging/README.md create mode 100644 Tagging/Recipe_Tagging_Analysis.ipynb create mode 100644 Tagging/conllu_batch_generator.py create mode 100644 Tagging/crf_data_generator.py create mode 100644 Tagging/tagging_tools.py create mode 100644 Tagging/test.crfsuite create mode 100644 tools.py diff --git a/Tagging/CRF_evaluation.ipynb b/Tagging/CRF_evaluation.ipynb new file mode 100644 index 0000000..2074322 --- /dev/null +++ b/Tagging/CRF_evaluation.ipynb @@ -0,0 +1,1680 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# CRF entity recognition evaluation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.core.display import Markdown, HTML, display\n", + "\n", + "import crf_data_generator as cdg\n", + "import pycrfsuite" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "data = cdg.ConlluCRFReader(\"recipes0.conllu\")\n", + "\n", + "data_iterator = iter(data)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def sentence_as_markdown_table( tokens, labels = None, predictions = None):\n", + " n = len(tokens)\n", + " s = \"| |\"\n", + " for t in tokens:\n", + " s += t + \" |\"\n", + " \n", + " s += \"\\n|-----|\" + \"----|\" * n\n", + " \n", + " if labels is not None:\n", + " s += \"\\n|labels:|\" + \"\".join([f\" {l} |\" for l in labels])\n", + " \n", + " if predictions is not None:\n", + " s+= \"\\n|Predicitions:|\" + \"\".join([f\" {p} |\" for p in predictions])\n", + " \n", + " display(Markdown(s + \"\\n\"))\n", + "\n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tagger = pycrfsuite.Tagger()\n", + "tagger.open('test.crfsuite')" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "| |Reduce |heat |to |low |and |let |the |water |simmer |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | action | 0 | 0 | 0 | 0 | 0 | ingredient | action | 0 |\n", + "|Predicitions:| action | action | 0 | 0 | 0 | 0 | 0 | ingredient | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Gently |drop |gnudi |, |about |12 |at |a |time |, |into |the |simmering |water |and |cook |until |they |rise |to |the |surface |, |about |4 |minutes |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | ingredient | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | action | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Simmer |for |4 |more |minutes |and |remove |with |a |slotted |spoon |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | action | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Keep |boiled |gnudi |warm |while |you |finish |cooking |remaining |batches |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | action | 0 | action | 0 | 0 | 0 | action | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | action | 0 | action | 0 | 0 | 0 | action | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Melt_butter |in |a |large |skillet |over |medium |heat |and |cook |whole |sage_leaves |until |they |wilt |and |are |beginning |to |brown |, |about |2 |minutes |; |remove |leaves |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| ingredient | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | action | ingredient | 0 |\n", + "|Predicitions:| ingredient | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | action | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Retain |butter |in |skillet |. |\n", + "|-----|----|----|----|----|----|\n", + "|labels:| 0 | ingredient | 0 | 0 | 0 |\n", + "|Predicitions:| action | ingredient | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Stir |chopped |sage |into |the |hot |butter |and |cook |until |the |butter |begins |to |brown |and |give |off |a |nutty |fragrance |, |about |2 |minutes |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | action | ingredient | 0 | 0 | ingredient | ingredient | 0 | action | 0 | 0 | ingredient | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | action | ingredient | 0 | 0 | ingredient | ingredient | 0 | action | 0 | 0 | ingredient | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Gently |mix |the |gnudi |into |the |butter |and |sage |until |gnudi |are |coated |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | action | 0 | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | action | 0 | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Garnish |with |whole |sage_leaves |and |sprinkle |with |2 |tablespoons |Parmigiano-Reggiano_cheese |to |serve |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | ingredient | 0 | action | 0 | 0 | 0 | ingredient | 0 | action | 0 |\n", + "|Predicitions:| action | 0 | 0 | ingredient | 0 | action | 0 | 0 | 0 | ingredient | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |\n", + "|-----|\n", + "|labels:|\n", + "|Predicitions:|\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Preheat |the |oven |to |350 |degrees |. |\n", + "|-----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Cream |butter |with |lemon_zest |and |sugar |( |minus |1 |tablespoon |) |until |light |and |fluffy |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| ingredient | ingredient | 0 | ingredient | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| ingredient | ingredient | 0 | ingredient | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Add |the |egg |and |vanilla |and |beat |until |combined |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | ingredient | 0 | action | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | ingredient | 0 | action | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Meanwhile |, |toss |the |blueberries |with |1/4 |cup |of |flour |, |then |whisk |together |the |remaining |flour |, |baking_powder |and |salt |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | action | 0 | 0 | action | 0 | 0 | 0 | action | 0 | ingredient | 0 | action | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | action | 0 | 0 | action | 0 | 0 | 0 | action | 0 | ingredient | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Add |the |flour |mixture |to |the |butter |mixture |a |little |at |a |time |, |alternating |with |the |buttermilk |; |fold |in |the |blueberries |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | action | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | action | 0 | 0 | ingredient | 0 |\n", + "|Predicitions:| action | 0 | action | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | ingredient | 0 | action | 0 | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Grease |a |9-inch |square |aluminum |baking |pan |with |butter |or |coat |with |non-stick |spray |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Spread |batter |into |pan |. |\n", + "|-----|----|----|----|----|----|\n", + "|labels:| action | action | 0 | 0 | 0 |\n", + "|Predicitions:| action | ingredient | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Sprinkle |batter |with |remaining |tablespoon |of |sugar |. |\n", + "|-----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | action | 0 | 0 | 0 | 0 | action | 0 |\n", + "|Predicitions:| action | ingredient | 0 | 0 | action | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Bake |for |35-45 |minutes |. |\n", + "|-----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Check |with |a |toothpick |, |checking |for |doneness |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Let |cool |at |least |15 |minutes |before |serving |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | action | 0 | 0 | 0 | 0 | 0 | action | 0 |\n", + "|Predicitions:| 0 | action | 0 | 0 | 0 | 0 | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |\n", + "|-----|\n", + "|labels:|\n", + "|Predicitions:|\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Preheat |a |grill |for |high |heat |. |\n", + "|-----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | action | 0 | 0 | action | 0 |\n", + "|Predicitions:| 0 | 0 | action | 0 | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |In |a |medium |bowl |, |lightly |mix |together |the |ground_beef |, |Worcestershire_sauce |, |liquid_smoke |and |garlic_powder |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | ingredient | 0 | ingredient | 0 | ingredient | 0 | ingredient | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | ingredient | 0 | ingredient | 0 | ingredient | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Form |into |3 |patties |, |handling |the |meat |minimally |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Brush |both |sides |of |each |patty |with |some |oil |, |and |season |with |seasoned_salt |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | action | 0 | ingredient | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | action | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Place |the |patties |on |the |grill |grate |, |and |cook |for |about |5 |minutes |per |side |, |until |well |done |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | action | action | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | 0 | action | ingredient | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |\n", + "|-----|\n", + "|labels:|\n", + "|Predicitions:|\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Heat |oven |to |400 |degrees |F |. |\n", + "|-----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Saute |sausage |and |zucchini |in |oil |in |a |large |nonstick |skillet |over |medium |heat |5 |to |7 |minutes |, |or |until |sausage |is |browned |and |zucchini |tender |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | ingredient | 0 | ingredient | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | action | 0 | ingredient | 0 | 0 |\n", + "|Predicitions:| 0 | ingredient | 0 | ingredient | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | action | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Remove |skillet |from |heat |; |cool |slightly |. |\n", + "|-----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | action | 0 | action | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | action | 0 | action | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Combine |ricotta |, |egg_white |, |mozzarella |, |1/4 |cup |of |the |Parmesan |, |salt |, |and |pepper |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | ingredient | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | ingredient | 0 |\n", + "|Predicitions:| 0 | ingredient | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Spread |3/4 |cup |of |the |tomato_sauce |on |bottom |of |a |10-inch |ovenproof |skillet |, |preferably |cast-iron |or |nonstick |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Top |with |2 |noodles |, |long |sides |touching |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| ingredient | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| ingredient | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Spoon |1/3 |each |of |the |sausage |mixture |, |cheese |mixture |, |and |basil_leaves |over |noodles |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | ingredient | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | ingredient | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Assemble |2 |more |layers |, |beginning |with |2 |noodles |, |then |3/4 |cup |of |the |sauce |, |1/3 |of |the |sausage |mixture |, |1/3 |of |the |cheese |mixture |, |and |1/3 |of |the |basil_leaves |, |ending |top |layer |with |the |last |2 |noodles |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | ingredient | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Spread |the |remaining |3/4 |cup |sauce |over |top |and |sprinkle |with |the |remaining |1/4 |cup |Parmesan |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Cover |tightly |with |foil |. |\n", + "|-----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Bake |35 |minutes |. |\n", + "|-----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Let |rest |10 |minutes |before |cutting |into |wedges |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |\n", + "|-----|\n", + "|labels:|\n", + "|Predicitions:|\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Preheat |the |oven |to |450 |degrees |F. |Bring |a |large |pot |of |salted_water |to |a |boil |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | action | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Put |2 |pieces |of |foil |side |by |side |on |a |baking |sheet |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Put |the |almonds |on |one |piece |of |foil |and |the |broccoli |on |the |other |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | ingredient | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | ingredient | 0 | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Transfer |to |the |oven |; |roast |until |the |almonds |are |lightly |toasted |, |about |7 |minutes |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | ingredient | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | ingredient | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Remove |the |foil |with |the |almonds |. |\n", + "|-----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | ingredient | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Continue |roasting |the |broccoli |until |tender |, |about |7 |more |minutes |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Season |the |broccoli |with |salt |and |pepper |and |transfer |to |a |large |bowl |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Add |the |pasta |to |the |boiling_water |and |cook |as |the |label |directs |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | 0 | ingredient | 0 | action | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | 0 | ingredient | 0 | action | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Meanwhile |, |pulse |the |almonds |in |a |food |processor |until |finely |chopped |; |with |the |motor |running |, |add |the |garlic |and |process |until |finely |chopped |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | ingredient | 0 | 0 | 0 | 0 | action | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | ingredient | 0 | 0 | 0 | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Drizzle |in |the |olive_oil |and |process |until |blended |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | ingredient | 0 | 0 | 0 | action | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Add |the |basil |and |pulse |until |smooth |; |transfer |to |the |bowl |with |the |broccoli |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Put |the |tomatoes |and |half |of |their |juice |( |about |1 |cup |) |in |the |food |processor |and |pulse |until |pureed |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Add |to |the |bowl |with |the |broccoli |mixture |and |stir |to |combine |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | action | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | action | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Add |1 |teaspoon |salt |and |1/2 |teaspoon |pepper |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | action | 0 | 0 | 0 | ingredient | 0 |\n", + "|Predicitions:| action | 0 | 0 | action | 0 | 0 | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Drain |the |pasta |and |toss |with |the |sauce |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | 0 | 0 | 0 | ingredient | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | 0 | 0 | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Per |serving |: |Calories |744 |; |Fat |39 |g |( |Saturated |5 |g |) |; |Cholesterol |0 |mg |; |Sodium |555 |mg |; |Carbohydrate |82 |g |; |Fiber |12 |g |; |Protein |20 |g |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | action | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Photograph |by |Antonis |Achilleos |\n", + "|-----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |\n", + "|-----|\n", + "|labels:|\n", + "|Predicitions:|\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Preheat |oven |to |350 |degrees |F |( |175 |degrees |C |) |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Lightly |grease |one |13 |x |9 |inch |cake |pan |or |two |8 |inch |round |cake |pans |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | ingredient | ingredient | 0 | 0 |\n", + "|Predicitions:| 0 | ingredient | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | ingredient | ingredient | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Mix |sugar |and |flour |together |. |\n", + "|-----|----|----|----|----|----|----|\n", + "|labels:| action | action | 0 | action | 0 | 0 |\n", + "|Predicitions:| action | action | 0 | action | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |With |two |knives |or |a |pastry |blender |cut |the |shortening |into |the |flour |and |sugar |until |the |mixture |resembles |coarse |crumbs |( |as |if |you |were |making |pie_dough |) |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | ingredient | 0 | action | 0 | ingredient | 0 | 0 | action | 0 | action | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | ingredient | 0 | 0 | ingredient | 0 | action | 0 | 0 | 0 | 0 | action | 0 | action | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Reserve |1/2 |cup |of |this |mixture |as |crumbs |for |top |of |cake |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 | ingredient | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |To |the |remaining |flour |mixture |stir |in |the |baking_powder |, |eggs |, |milk |, |and |vanilla |and |mix |well |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | action | 0 | action | 0 | 0 | ingredient | 0 | ingredient | 0 | ingredient | 0 | 0 | ingredient | 0 | action | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | action | 0 | action | 0 | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 | 0 | ingredient | 0 | action | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Pour |batter |into |prepared |pan |. |\n", + "|-----|----|----|----|----|----|----|\n", + "|labels:| action | action | 0 | action | 0 | 0 |\n", + "|Predicitions:| 0 | action | 0 | action | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Sprinkle |reserved |crumb |mixture |over |top |. |\n", + "|-----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | 0 | ingredient | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Bake |at |350 |degrees |F |( |175 |degrees |C |) |for |about |45 |minutes |( |35 |minutes |if |using |two |8 |inch |round |cake |pans |) |or |until |center |of |cake |springs |back |when |lightly |touched |or |a |toothpick |inserted |in |the |center |comes |out |clean |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |\n", + "|-----|\n", + "|labels:|\n", + "|Predicitions:|\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Combine |the |garlic |, |onions |, |salt |and |5 |cups |water |in |a |12-inch |high-sided |saucepan |and |bring |to |a |boil |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | ingredient | 0 | ingredient | 0 | action | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 |\n", + "|Predicitions:| 0 | 0 | ingredient | 0 | ingredient | 0 | action | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Add |the |chicken_breasts |and |bay_leaf |, |and |lower |the |heat |to |a |simmer |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | ingredient | 0 | 0 | action | 0 | action | 0 | 0 | action | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | ingredient | 0 | 0 | action | 0 | action | 0 | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Cook |the |chicken |, |partially |covered |, |until |cooked |through |, |about |35 |minutes |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | 0 | action | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | 0 | action | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |( |To |check |for |doneness |, |slit |the |chicken |in |half |to |make |sure |the |interior |is |no |longer |pink |. |) |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Remove |the |chicken |( |reserve |the |broth |) |and |allow |to |cool |slightly |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | action | 0 | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | action | 0 | ingredient | 0 | 0 | 0 | 0 | action | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |When |cool |enough |to |handle |, |shred |by |hand |and |place |in |a |medium |bowl |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | action | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | action | 0 | 0 | 0 | 0 | action | 0 | ingredient | 0 | action | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Remove |enough |broth |to |leave |about |2 |cups |in |the |pan |with |the |onions |and |garlic |( |cool |and |refrigerate |or |freeze |the |extra |broth |for |another |use |) |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 | action | 0 | action | 0 | action | 0 | ingredient | ingredient | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 | action | 0 | 0 | 0 | action | 0 | ingredient | ingredient | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Remove |the |bay_leaf |. |\n", + "|-----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Add |the |tomatillos |and |jalapenos |and |cook |until |the |tomatillos |are |olive |green |, |10 |to |12 |minutes |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | 0 | 0 | action | 0 | 0 | ingredient | 0 | ingredient | ingredient | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | 0 | 0 | action | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |With |a |slotted |spoon |, |transfer |the |solid |ingredients |( |onions |, |tomatillos |and |garlic |) |to |a |blender |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 | ingredient | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 | ingredient | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Add |the |cilantro |and |process |until |smooth |( |using |some |of |the |liquid |in |the |pan |if |needed |) |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Season |with |salt |and |pepper |. |\n", + "|-----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | action | 0 | ingredient | 0 |\n", + "|Predicitions:| action | 0 | action | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Pour |the |salsa |back |into |the |saucepan |and |bring |to |a |boil |; |add |the |chicken |and |cook |until |the |flavors |incorporate |, |about |5 |minutes |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | action | 0 | ingredient | 0 | action | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | action | 0 | ingredient | 0 | action | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Adjust |the |seasoning |. |\n", + "|-----|----|----|----|----|\n", + "|labels:| action | 0 | action | 0 |\n", + "|Predicitions:| 0 | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Remove |from |the |heat |and |set |aside |to |cool |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | action | 0 | action | 0 | 0 | action | 0 |\n", + "|Predicitions:| action | 0 | 0 | action | 0 | action | 0 | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Preheat |the |oven |to |400 |degrees |F |. |\n", + "|-----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |To |assemble |the |empanadas |: |Dust |a |flat |surface |with |flour |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Roll |out |the |pizza_dough |about |1/8 |to |1/4 |inch |thick |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| ingredient | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| ingredient | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Using |a |6-inch |round |cookie |cutter |( |or |a |bowl |or |plate |with |the |same |diameter |) |, |cut |the |dough |into |circles |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | ingredient | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | ingredient | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | ingredient | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | ingredient | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Expect |to |get |about |3 |circles |from |1 |pound |of |dough |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Brush |the |egg |wash |over |the |surface |of |one |dough |round |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | action | 0 | 0 | 0 | 0 | 0 | ingredient | ingredient | 0 |\n", + "|Predicitions:| 0 | 0 | ingredient | action | 0 | 0 | action | 0 | 0 | ingredient | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Add |2 |tablespoons |of |filling |onto |half |of |the |circle |and |sprinkle |about |1 |ounce |of |mozzarella |on |top |of |the |filling |, |if |using |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 | ingredient | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | ingredient | 0 | ingredient | 0 | 0 | ingredient | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Fold |the |plain |half |over |the |filling |. |\n", + "|-----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | 0 | ingredient | 0 |\n", + "|Predicitions:| 0 | 0 | action | 0 | 0 | 0 | ingredient | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Seal |the |edges |with |fork |tines |or |crimp |decoratively |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Repeat |for |the |remaining |empanadas |. |\n", + "|-----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | 0 | 0 | ingredient | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |( |Save |any |leftover |filling |in |an |airtight |container |in |the |fridge |for |up |to |a |week |for |another |use |. |) |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | ingredient | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | ingredient | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Transfer |the |empanadas |to |a |baking |sheet |lined |with |parchment |paper |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | ingredient | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | 0 | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Using |a |pastry |brush |, |brush |the |tops |of |the |empanadas |with |the |egg |wash. |Bake |until |crisp |and |golden |brown |, |about |20 |minutes |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | 0 | ingredient | action | 0 | action | 0 | ingredient | 0 | 0 | ingredient | 0 | 0 | ingredient | 0 | action | 0 | ingredient | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 |\n", + "|Predicitions:| 0 | 0 | ingredient | action | 0 | action | 0 | ingredient | 0 | 0 | 0 | 0 | 0 | ingredient | 0 | action | 0 | ingredient | 0 | 0 | action | 0 | 0 | 0 | 0 | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Let |cool |for |about |10 |minutes |before |serving |. |\n", + "|-----|----|----|----|----|----|----|----|----|----|\n", + "|labels:| 0 | action | 0 | 0 | 0 | 0 | 0 | action | 0 |\n", + "|Predicitions:| 0 | action | 0 | 0 | 0 | 0 | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |\n", + "|-----|\n", + "|labels:|\n", + "|Predicitions:|\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Heat |a |large |pot |over |mediumhigh |heat |. |\n", + "|-----|----|----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | 0 | 0 | 0 | 0 | action | 0 |\n", + "|Predicitions:| action | 0 | 0 | 0 | 0 | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "| |Add |the |bacon |and |cook |. |\n", + "|-----|----|----|----|----|----|----|\n", + "|labels:| action | 0 | ingredient | 0 | action | 0 |\n", + "|Predicitions:| action | 0 | ingredient | 0 | action | 0 |\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for i, (features, labels, tokens) in enumerate(data):\n", + " if i > 100:\n", + " break\n", + " \n", + " prediction = tagger.tag(features)\n", + " \n", + " sentence_as_markdown_table(tokens, labels, prediction)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'---------'" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"---\" * 3" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\" ['0', '0', '0', '0', '0', 'action', '0', '0'] |\"" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\".join([f\" {l} |\" for l in labels])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Tagging/CRF_training.ipynb b/Tagging/CRF_training.ipynb new file mode 100644 index 0000000..00a9f19 --- /dev/null +++ b/Tagging/CRF_training.ipynb @@ -0,0 +1,576 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import conllu_batch_generator as cbg" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "cr = cbg.ConlluReader(\"recipes0.conllu\")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "t = cr.__iter__().__next__()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "OrderedDict([('id', 2),\n", + " ('form', 'oven'),\n", + " ('lemma', 'oven'),\n", + " ('upostag', 'ADV'),\n", + " ('xpostag', 'RB'),\n", + " ('feats', None),\n", + " ('head', None),\n", + " ('deprel', '_'),\n", + " ('deps', None),\n", + " ('misc', None)])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t[0][1]" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def word2features(sent, i):\n", + " word = sent[i]['form']\n", + " postag = sent[i]['upostag']\n", + " features = [\n", + " 'bias',\n", + " #'word.lower=' + word.lower(),\n", + " 'word[-3:]=' + word[-3:],\n", + " 'word[-2:]=' + word[-2:],\n", + " 'word.isupper=%s' % word.isupper(),\n", + " 'word.istitle=%s' % word.istitle(),\n", + " 'word.isdigit=%s' % word.isdigit(),\n", + " 'postag=' + postag,\n", + " 'postag[:2]=' + postag[:2],\n", + " ]\n", + " if i > 0:\n", + " word1 = sent[i-1]['form']\n", + " postag1 = sent[i-1]['upostag']\n", + " features.extend([\n", + " '-1:word.lower=' + word1.lower(),\n", + " '-1:word.istitle=%s' % word1.istitle(),\n", + " '-1:word.isupper=%s' % word1.isupper(),\n", + " '-1:postag=' + postag1,\n", + " '-1:postag[:2]=' + postag1[:2],\n", + " ])\n", + " if i > 1:\n", + " word1 = sent[i-2]['form']\n", + " postag1 = sent[i-2]['upostag']\n", + " features.extend([\n", + " '-2:word.lower=' + word1.lower(),\n", + " '-2:word.istitle=%s' % word1.istitle(),\n", + " '-2:word.isupper=%s' % word1.isupper(),\n", + " '-2:postag=' + postag1,\n", + " '-2:postag[:2]=' + postag1[:2],\n", + " ])\n", + " else:\n", + " features.append('BOS')\n", + " \n", + " if i < len(sent)-1:\n", + " word1 = sent[i+1]['form']\n", + " postag1 = sent[i+1]['upostag']\n", + " features.extend([\n", + " '+1:word.lower=' + word1.lower(),\n", + " '+1:word.istitle=%s' % word1.istitle(),\n", + " '+1:word.isupper=%s' % word1.isupper(),\n", + " '+1:postag=' + postag1,\n", + " '+1:postag[:2]=' + postag1[:2],\n", + " ])\n", + " if i < len(sent)-2:\n", + " word1 = sent[i+1]['form']\n", + " postag1 = sent[i+1]['upostag']\n", + " features.extend([\n", + " '+2:word.lower=' + word1.lower(),\n", + " '+2:word.istitle=%s' % word1.istitle(),\n", + " '+2:word.isupper=%s' % word1.isupper(),\n", + " '+2:postag=' + postag1,\n", + " '+2:postag[:2]=' + postag1[:2],\n", + " ])\n", + " else:\n", + " features.append('EOS')\n", + " \n", + " return features" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def sent2labels(sent):\n", + " labels = []\n", + " for token in sent:\n", + " if token['misc'] is not None and 'food_type' in token['misc']:\n", + " labels.append(token['misc']['food_type'])\n", + " else:\n", + " labels.append(\"0\")\n", + " return labels" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def sent2features(sent):\n", + " return [word2features(sent, i) for i in range(len(sent))]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def sent2tokens(sent):\n", + " return [token['form'] for token in sent]" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def feature2tokens(sent):\n", + " return [t[1].split(\"=\")[1] for t in sent]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def conllu2tokens(sent):\n", + " return [t['form'] for t in sent]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* create test dataset:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# read 50000 samples:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "n_train = 50000\n", + "n_test = 1000\n", + "\n", + "X_train = []\n", + "Y_train = []\n", + "t_train = []\n", + "\n", + "X_test = []\n", + "Y_test = []\n", + "t_test = []\n", + "\n", + "\n", + "\n", + "for i,sample in enumerate(cr):\n", + " \n", + " if i < n_train:\n", + " X_train.append(sent2features(sample[0]))\n", + " Y_train.append(sent2labels(sample[0]))\n", + " t_train.append(conllu2tokens(sample[0]))\n", + " else:\n", + " X_test.append(sent2features(sample[0]))\n", + " Y_test.append(sent2labels(sample[0]))\n", + " t_test.append(conllu2tokens(sample[0]))\n", + " \n", + " if i >= n_train + n_test:\n", + " break\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* train with crfsuite" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "import pycrfsuite" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "trainer = pycrfsuite.Trainer(verbose=False)\n", + "\n", + "for xseq, yseq in zip(X_train, Y_train):\n", + " trainer.append(xseq, yseq)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "trainer.set_params({\n", + " 'c1': 1.0, # coefficient for L1 penalty\n", + " 'c2': 1e-3, # coefficient for L2 penalty\n", + " #'max_iterations': 50, # stop earlier\n", + "\n", + " # include transitions that are possible, but not observed\n", + " 'feature.possible_transitions': True\n", + "})" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['feature.minfreq',\n", + " 'feature.possible_states',\n", + " 'feature.possible_transitions',\n", + " 'c1',\n", + " 'c2',\n", + " 'max_iterations',\n", + " 'num_memories',\n", + " 'epsilon',\n", + " 'period',\n", + " 'delta',\n", + " 'linesearch',\n", + " 'max_linesearch']" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trainer.params()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "trainer.train('test.crfsuite')" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'num': 688,\n", + " 'scores': {},\n", + " 'loss': 72969.779861,\n", + " 'feature_norm': 130.969535,\n", + " 'error_norm': 157.007119,\n", + " 'active_features': 8435,\n", + " 'linesearch_trials': 1,\n", + " 'linesearch_step': 1.0,\n", + " 'time': 0.346}" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "trainer.logparser.last_iteration\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* test:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tagger = pycrfsuite.Tagger()\n", + "tagger.open('test.crfsuite')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Predicted: \n", + "Correct: \n", + "\n", + "\n", + "Prepare mudding as directed on package using 3 cups milk .\n", + "Predicted: action ingredient 0 0 0 0 0 0 0 ingredient 0\n", + "Correct: action 0 0 0 0 0 0 0 0 ingredient 0\n", + "\n", + "\n", + "Remove from heat ; stir in orange_peel .\n", + "Predicted: action 0 action 0 action 0 ingredient 0\n", + "Correct: action 0 action 0 action 0 ingredient 0\n", + "\n", + "\n", + "Cover surface of pudding with waxed paper or plastic wrap and cool 15 minutes .\n", + "Predicted: action action 0 0 0 0 0 0 0 0 0 action 0 0 0\n", + "Correct: action 0 0 ingredient 0 0 0 0 0 0 0 action 0 0 0\n", + "\n", + "\n", + "Line bottom of trifle dish or glass bowl with 1/3 of the cake cubes ; .\n", + "Predicted: 0 0 0 0 0 0 0 0 0 0 0 0 ingredient 0 0 0\n", + "Correct: 0 0 0 0 0 0 0 0 0 0 0 0 ingredient 0 0 0\n", + "\n", + "\n", + "Drizzle with 1 tablespoon of the orange_juice_concentrate .\n", + "Predicted: 0 0 0 0 0 0 ingredient 0\n", + "Correct: 0 0 0 0 0 0 ingredient 0\n", + "\n", + "\n", + "Spoon 1/3 of pudding over top .\n", + "Predicted: action 0 0 0 0 ingredient 0\n", + "Correct: action 0 0 ingredient 0 ingredient 0\n", + "\n", + "\n", + "Spoon 1/3 of strawberry filling over pudding .\n", + "Predicted: action 0 0 ingredient 0 0 ingredient 0\n", + "Correct: action 0 0 ingredient ingredient 0 ingredient 0\n", + "\n", + "\n", + "Top with 1/3 of orange_segments .\n", + "Predicted: ingredient 0 0 0 0 0\n", + "Correct: ingredient 0 0 0 ingredient 0\n", + "\n", + "\n", + "Repeat layers 2 more times .\n", + "Predicted: 0 0 0 0 0 0\n", + "Correct: 0 0 0 0 0 0\n", + "\n", + "\n", + "Cover and refrigerate 3 hours or overnight .\n", + "Predicted: action 0 action 0 0 0 0 0\n", + "Correct: action 0 action 0 0 0 0 0\n", + "\n", + "\n", + "Store in refrigerator .\n", + "Predicted: 0 0 action 0\n", + "Correct: 0 0 action 0\n", + "\n", + "\n", + "\n", + "Predicted: \n", + "Correct: \n", + "\n", + "\n", + "Meanwhile , whisk the vinegar , lemon_zest and juice , honey , dried_oregano , 1/2 teaspoon salt and 1/4 teaspoon pepper in a large bowl .\n", + "Predicted: 0 0 action 0 action 0 ingredient 0 ingredient 0 ingredient 0 ingredient 0 0 0 action 0 0 0 ingredient 0 0 0 0 0\n", + "Correct: 0 0 action 0 ingredient 0 ingredient 0 ingredient 0 ingredient 0 ingredient 0 0 0 action 0 0 0 ingredient 0 0 0 0 0\n", + "\n", + "\n", + "Whisk in the olive_oil in a slow , steady stream until emulsified .\n", + "Predicted: action 0 0 ingredient 0 0 0 0 0 0 0 0 0\n", + "Correct: action 0 0 ingredient 0 0 0 0 0 0 0 0 0\n", + "\n", + "\n", + "Add the tomatoes and olives and toss .\n", + "Predicted: action 0 ingredient 0 ingredient 0 0 0\n", + "Correct: action 0 ingredient 0 ingredient 0 0 0\n", + "\n", + "\n", + "Peel the cucumbers , leaving alternating strips of green peel .\n", + "Predicted: action 0 ingredient 0 0 0 0 0 ingredient action 0\n", + "Correct: action 0 ingredient 0 ingredient 0 0 0 ingredient action 0\n", + "\n", + "\n", + "Trim the ends , halve lengthwise and slice crosswise , about 1/2 inch thick ; add to the bowl with the tomatoes .\n", + "Predicted: 0 0 ingredient 0 0 0 0 action 0 0 0 0 0 0 0 action 0 0 0 0 0 ingredient 0\n", + "Correct: 0 0 0 0 0 0 0 action ingredient 0 0 0 0 0 0 action 0 0 0 0 0 ingredient 0\n", + "\n", + "\n", + "Drain the red onion , add to the bowl and toss .\n", + "Predicted: action 0 ingredient ingredient 0 action 0 0 0 0 0 0\n", + "Correct: action 0 ingredient ingredient 0 action 0 0 0 0 0 0\n", + "\n", + "\n", + "Drain the feta and slice horizontally into 4 even rectangles .\n", + "Predicted: action 0 0 0 ingredient 0 0 0 0 0 0\n", + "Correct: action 0 0 0 action 0 0 0 0 0 0\n", + "\n", + "\n", + "Divide the salad among plates .\n", + "Predicted: 0 0 ingredient 0 0 0\n", + "Correct: 0 0 ingredient 0 0 0\n", + "\n", + "\n", + "Top with the feta and oregano ; drizzle with olive_oil and season with pepper .\n", + "Predicted: ingredient 0 0 ingredient 0 ingredient 0 0 0 ingredient 0 action 0 ingredient 0\n", + "Correct: ingredient 0 0 0 0 ingredient 0 0 0 ingredient 0 action 0 ingredient 0\n", + "\n", + "\n", + "Photograph by Johnny Miller\n", + "Predicted: 0 0 0 0\n", + "Correct: 0 0 0 0\n", + "\n", + "\n", + "\n", + "Predicted: \n", + "Correct: \n", + "\n", + "\n", + "Put the potatoes in a large saucepan and cover with water .\n", + "Predicted: action 0 ingredient 0 0 0 0 0 action 0 ingredient 0\n", + "Correct: action 0 ingredient 0 0 0 0 0 action 0 ingredient 0\n", + "\n", + "\n", + "Add 1 teaspoon salt to the water .\n", + "Predicted: action 0 0 action 0 0 ingredient 0\n", + "Correct: action 0 0 action 0 0 ingredient 0\n", + "\n", + "\n", + "Bring to a boil over high heat , reduce to a simmer and cook the potatoes until they are very tender but not overcooked , about 10 minutes .\n", + "Predicted: 0 0 0 action 0 0 action 0 ingredient 0 0 action 0 action 0 ingredient 0 0 0 0 0 0 0 action 0 0 0 0 0\n", + "Correct: 0 0 0 action 0 0 action 0 action 0 0 action 0 action 0 ingredient 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "\n", + "\n", + "Remove the potatoes from the water and let them drain on a dishtowel , gently patting to dry .\n", + "Predicted: action 0 ingredient 0 0 ingredient 0 0 0 action 0 0 0 0 0 0 0 0 0\n", + "Correct: action 0 ingredient 0 0 ingredient 0 0 0 action 0 0 0 0 0 0 0 0 0\n", + "\n", + "\n", + "Allow to cool .\n", + "Predicted: 0 0 action 0\n", + "Correct: 0 0 action 0\n", + "\n", + "\n", + "Gently press down on one potato with a spatula to gently flatten it to about 1/2 inch thick .\n", + "Predicted: 0 0 0 0 0 ingredient 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "Correct: 0 0 0 0 0 ingredient 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + "\n", + "\n" + ] + } + ], + "source": [ + "for i in range(100,130):\n", + " print(' '.join(t_test[i]))\n", + " #print(' '.join(feature2tokens(X_test[i])), end='\\n\\n')\n", + " print(\"Predicted:\", ' '.join(tagger.tag(X_test[i])))\n", + " print(\"Correct: \", ' '.join(Y_test[i]))\n", + " \n", + " print(\"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Tagging/Conllu_Training.ipynb b/Tagging/Conllu_Training.ipynb new file mode 100644 index 0000000..892528e --- /dev/null +++ b/Tagging/Conllu_Training.ipynb @@ -0,0 +1,290 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import sys\n", + "\n", + "from conllu import parse\n", + "\n", + "sys.path.insert(0,'..')\n", + "import settings\n", + "\n", + "from tagging_tools import print_visualized_tags\n", + "\n", + "from train_sample_generator import ConlluReader, ConlluDataProvider\n", + "\n", + "from gensim.test.utils import common_texts, get_tmpfile\n", + "from gensim.models import Word2Vec\n", + "from nltk import PorterStemmer\n", + "import numpy as np\n", + "from sklearn import preprocessing\n", + "porter = PorterStemmer()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "conllu_reader = ConlluReader(\"recipes0.conllu\", iter_documents=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[TokenList]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "conllu_reader.__iter__().__next__()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "conllu_data_provider = ConlluDataProvider(\"recipes0.conllu\", \n", + " word2vec_model=None,\n", + " batchsize=100,\n", + " window_size=3,\n", + " iter_documents=False,\n", + " food_type=\"ingredient\")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "x,y = conllu_data_provider.getNextDataBatch(y_food_type_label=\"ingredient\")" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1148" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(y)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "sum_tokens = 0\n", + "i = 0\n", + "for x,y in conllu_data_provider:\n", + " sum_tokens += len(x)\n", + " i += 1\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "649423" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sum_tokens" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "576" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "i" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## decision tree classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.tree import DecisionTreeClassifier\n", + "from sklearn.ensemble import RandomForestClassifier\n", + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "conllu_data_provider = ConlluDataProvider(\"recipes0.conllu\", \n", + " word2vec_model=None,\n", + " batchsize=100,\n", + " window_size=3,\n", + " iter_documents=False,\n", + " food_type=\"ingredient\")" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "clf = RandomForestClassifier(n_estimators=100 ,random_state=0, warm_start=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "for x,y in conllu_data_provider:\n", + " break\n", + " X_train, X_test, y_train, y_test = train_test_split(x,y, random_state=0)\n", + " clf.fit(X_train, y_train)\n", + " pred = tree.predict(X_test)\n", + " print(\"loss: \", np.sum((pred - y_test)**2) / len(x))" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " ...,\n", + " [0., 0., 1., ..., 0., 0., 0.],\n", + " [0., 0., 0., ..., 0., 0., 0.],\n", + " [0., 1., 0., ..., 0., 0., 0.]])" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss: 0.041811846689895474\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/jonas/.local/lib/python3.7/site-packages/sklearn/ensemble/forest.py:307: UserWarning: Warm-start fitting without increasing n_estimators does not fit new trees.\n", + " warn(\"Warm-start fitting without increasing n_estimators does not \"\n" + ] + } + ], + "source": [ + "clf.fit(X_train, y_train)\n", + "pred = tree.predict(X_test)\n", + "print(\"loss: \", np.sum((pred - y_test)**2) / len(x))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Tagging/README.md b/Tagging/README.md new file mode 100644 index 0000000..8c847d6 --- /dev/null +++ b/Tagging/README.md @@ -0,0 +1,4 @@ +# Tagging tools +--- + +in this folder are tools that are here to annotate existing recipe instructions and generating conllu files from them diff --git a/Tagging/Recioe_Tagging.ipynb b/Tagging/Recioe_Tagging.ipynb index d4df712..fc46398 100644 --- a/Tagging/Recioe_Tagging.ipynb +++ b/Tagging/Recioe_Tagging.ipynb @@ -90,7 +90,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -109,7 +109,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -120,7 +120,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -142,16 +142,25 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ - "mwe_tokenizer = MWETokenizer([w.split() for w in ingredients.multi_word_ingredients_stemmed])" + "from stemmed_mwe_tokenizer import StemmedMWETokenizer" ] }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "mwe_tokenizer = StemmedMWETokenizer([w.split() for w in ingredients.multi_word_ingredients_stemmed])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -423,8 +432,7 @@ " 'of',\n", " 'pasta',\n", " 'to',\n", - " 'cheese',\n", - " 'sauce',\n", + " 'cheese_sauce',\n", " 'is',\n", " 'crucial',\n", " 'to',\n", @@ -457,7 +465,7 @@ " '.']" ] }, - "execution_count": 35, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -466,6 +474,61 @@ "mwe_tokenizer.tokenize(nltk.tokenize.word_tokenize(instructions[0]))" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\u001b[0;31mSignature:\u001b[0m \u001b[0mmwe_tokenizer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mspan_tokenize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mDocstring:\u001b[0m\n", + "Identify the tokens using integer offsets ``(start_i, end_i)``,\n", + "where ``s[start_i:end_i]`` is the corresponding token.\n", + "\n", + ":rtype: iter(tuple(int, int))\n", + "\u001b[0;31mFile:\u001b[0m ~/.local/lib/python3.7/site-packages/nltk/tokenize/api.py\n", + "\u001b[0;31mType:\u001b[0m method\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "?mwe_tokenizer." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "ename": "NotImplementedError", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNotImplementedError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mmwe_tokenizer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mspan_tokenize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnltk\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtokenize\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mword_tokenize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minstructions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/.local/lib/python3.7/site-packages/nltk/tokenize/api.py\u001b[0m in \u001b[0;36mspan_tokenize\u001b[0;34m(self, s)\u001b[0m\n\u001b[1;32m 42\u001b[0m \u001b[0;34m:\u001b[0m\u001b[0mrtype\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0miter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtuple\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 43\u001b[0m \"\"\"\n\u001b[0;32m---> 44\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mNotImplementedError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 45\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 46\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mtokenize_sents\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstrings\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNotImplementedError\u001b[0m: " + ] + } + ], + "source": [ + "mwe_tokenizer.span_tokenize(nltk.tokenize.word_tokenize(instructions[0]))" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/Tagging/Recipe_Tagging_Analysis.ipynb b/Tagging/Recipe_Tagging_Analysis.ipynb new file mode 100644 index 0000000..36b0093 --- /dev/null +++ b/Tagging/Recipe_Tagging_Analysis.ipynb @@ -0,0 +1,1467 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Recipe Tagging analysis\n", + "\n", + "analyse and visualize preconfigured conllu files" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys\n", + "\n", + "from conllu import parse\n", + "\n", + "sys.path.insert(0,'..')\n", + "import settings\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "conllu_path = \"recipes0.conllu\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "with open(conllu_path, 'r') as f:\n", + " data = f.readlines()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# newdoc\n", + "1 Set set NOUN NNP _ _ _ _ food_type=action \n", + "2 oven oven ADV RB _ _ _ _ _ \n", + "3 to to PRT TO _ _ _ _ _ \n", + "4 350 350 NUM CD _ _ _ _ _ \n", + "5 degrees degre NOUN NNS _ _ _ _ _ \n", + "6 F F NOUN NNP _ _ _ _ _ \n", + "7 . . . . _ _ _ _ _ \n", + "\n", + "8 Grease greas VERB VB _ _ _ _ _ \n", + "9 a a DET DT _ _ _ _ _ \n", + "10 13 13 NUM CD _ _ _ _ _ \n", + "11 x x ADJ JJ _ _ _ _ _ \n", + "12 9-inch 9-inch ADJ JJ _ _ _ _ _ \n", + "13 baking bake VERB VBG _ _ _ _ food_type=action \n", + "14 dish dish NOUN NN _ _ _ _ _ \n", + "15 . . . . _ _ _ _ _ \n", + "\n", + "16 Cook cook VERB VB _ _ _ _ food_type=action \n", + "17 the the DET DT _ _ _ _ _ \n", + "\n" + ] + } + ], + "source": [ + "print(\"\".join(data[0:20]))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "ts = parse(\"\".join(data))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "sentence = ts[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "list" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(ts)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "* visualize tags:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from tagging_tools import print_visualized_tags" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/markdown": [ + "Set oven to 350 degrees F . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Grease a 13 x 9-inch baking dish . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Cook the macaroni in boiling_water until al dente ( do not cook until very soft ) drain , then place into a bowl . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Place the milk , flour , onion_salt and garlic_powder in a 1-quart jar ; cover tightly and shake vigorously for 1 minute ; pour the mixture over the macaroni and add in 3-1/2 cups shredded_cheddar_cheese ; mix thoroughly to combine , then spread into the baking dish . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Sprinkle with breadcrumbs then remaining 1 cup of cheddar_cheese . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Drizzle 1/4 cup melted_butter or margarine over the top . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Bake uncovered for 45 minutes or until golden brown . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Stir together the sugar , salt , pepper , cumin and mustard in small bowl . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Place salmon so that the side the skin was removed from is down . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Press sugar mixture evenly onto fish . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Heat oil over medium heat in large nonstick or cast-iron skillet . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "When hot , place fish rub-side down in pan . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Cook until brown_sugar rub dissolves and darkens slightly , being careful not to burn , about 4 minutes . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Flip fish and cook to medium doneness , about 1 minute longer . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Mix all ingredients in bowl in order listed . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Make small or medium size balls out of mixture and place on a greased cookie sheet sprayed with Pam . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "For extra happy horses you can sprinkle a little bit of honey on them before cooking . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Bake 350F for 15-20 minutes and make sure they do n't burn ! " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "The day before you want to eat this cut your rolls into 8 medium to thick slices , put on a light setting and just slightly toast them or put them into the oven and slightly pre toast them . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "They will be grilled the next day again so do not brown them to much , alternatively you can buy larger ready cooked crostini , next day cut the cheese to size to fit the slices of bread . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "The next day , slice some cheese the same size as each slice of bread.. " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Layer first a slice of bread , then a slice of cheese then a slice of bread and another slice of cheese into ovenproof soup plates or bowls " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "prepare you soup by making a clear stock of preference , vegetable , chicken , fish or beef . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "You can do this by skimming the grey foam as soon a it comes up with a very small net strainer or a ladle . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "This needs to be done as soon as it comes up as it first starts boiling or the soup will go cloudy . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Season to your liking . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Add a little sherry . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Drain the stock , carefully ladle the clear stock over the bread and cheese . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Put the bowls into the oven and melt the cheese . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Hope you enjoy " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "The bread full of soup is the best bit " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Using a 1/2 c ice-cream scoop , put one scoop of sherbet on each cookie . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Freeze until firm , at least 15 minutes . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Heat the oven to 475 degrees F . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Whip the egg_whites in a glass or metal bowl until soft peaks form . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Add the sugar and beat until stiff peaks form . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Place the frozen sherbet topped cookies about 2 '' apart on a wire rack on a baking sheet . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Spread the meringue over each of the sherbets and also the cookie edges . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Bake until lightly browned , about 2 minutes . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Serve immediately . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Spread 1/2 tablespoon butter on one side of each piece of toasted Italian_bread . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Set aside . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Heat olive_oil in a skillet over high heat . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "When oil begins to smoke , pour scallops into pan . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Cook for 30 seconds without stirring . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Toss scallops in pan and stir in garlic . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Cook and stir until fragrant , about 30 seconds . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Stir wine and lemon_juice into scallops , bring to a boil , and cook for about 30 seconds . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Stir parsley and cold butter into scallops and remove from heat . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "When butter melts , stir in salt , black_pepper , and cayenne_pepper . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Spoon scallops over buttered toast and serve immediately . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "1 . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Whisk together brownie mix , flour , and sugar . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "2.Using a heavy spoon , stir in the eggs one at a time , followed by butter and 2 tablespoons water . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "If the batter appears like there is too much flour , add 1 more tablespoon of water . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Batter will be very thick . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "3 . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Fold in chocolate_chunks 4 . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "Cover and refrigerate for 2 hours . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/markdown": [ + "5 . " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for i in range(60):\n", + " print_visualized_tags(ts[i])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## train word2vec model based on stemmed words" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "from gensim.test.utils import common_texts, get_tmpfile\n", + "from gensim.models import Word2Vec\n", + "from nltk import PorterStemmer\n", + "import numpy as np\n", + "from sklearn import preprocessing\n", + "porter = PorterStemmer()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "sentence_symbols = set(('.', ';', '!', '?', ',')) " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "stemmed_sentences = []\n", + "for sentence in ts:\n", + " stemmed_sentence = []\n", + " for token in sentence:\n", + " stemmed = token['lemma']\n", + " if stemmed not in sentence_symbols:\n", + " stemmed_sentence.append(stemmed)\n", + " stemmed_sentences.append(stemmed_sentence)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "52563" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(stemmed_sentences)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "model = Word2Vec(stemmed_sentences, size=128, window=1, min_count=1, workers=4)\n", + "def word_similarity(word_a:str, word_b:str, model=model, stemmer=porter):\n", + " return model.wv.similarity(stemmer.stem(word_a), stemmer.stem(word_b))\n", + "\n", + "def word_exists(word:str, model=model, stemmer=porter):\n", + " return stemmer.stem(word) in model.wv\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## train stuff" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* create Data Arrays" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "upos_tags = []\n", + "word_vecs = []\n", + "bool_ingr = []\n", + "bool_actn = []\n", + "\n", + "lb = preprocessing.LabelBinarizer()\n", + "lb.fit(['.', 'ADJ', 'ADP', 'ADV', 'CONJ', 'DET', 'NOUN', 'NUM', 'PRON', 'PRT', 'VERB', 'X'])\n", + "\n", + "number_tokens = 0\n", + "\n", + "for sentence in ts:\n", + " sent_upos = []\n", + " sent_word = []\n", + " sent_ingr = []\n", + " sent_actn = []\n", + " \n", + " for token in sentence:\n", + " number_tokens += 1\n", + " if token['form'] not in sentence_symbols:\n", + " sent_word.append(model.wv[token['lemma']])\n", + " upos = token['upostag']\n", + " misc = token['misc']\n", + " actn = False\n", + " ingr = False\n", + " sent_upos.append(upos)\n", + " if misc != None and 'food_type' in misc:\n", + " if misc['food_type'] == \"action\":\n", + " actn = True\n", + " elif misc['food_type'] == \"ingredient\":\n", + " ingr = True\n", + " sent_ingr.append(ingr)\n", + " sent_actn.append(actn)\n", + " if len(sent_upos) > 0:\n", + " upos_tags.append(lb.transform(sent_upos))\n", + " word_vecs.append(sent_word)\n", + " bool_ingr.append(sent_ingr)\n", + " bool_actn.append(sent_actn)\n", + " \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* create one-vs-all binary labels from upos values" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([-0.68675774, -0.7883484 , 0.20251137, -0.05719408, 0.09501456,\n", + " 0.05182203, -0.25285384, -0.41048968, -0.71525794, -0.67254657,\n", + " -0.17055118, -0.17210464, -0.82208157, 0.2450692 , 0.5252676 ,\n", + " -0.19269118, 0.341501 , 0.34656093, 0.9737164 , 0.35325623,\n", + " -0.89236367, -0.64312077, -0.7638635 , 0.39858425, -0.27193114,\n", + " 0.49859434, -0.81326216, 0.7487419 , 0.16307887, 0.25901216,\n", + " 0.66147804, -0.58643436, -0.09952813, 0.17525254, -0.00194792,\n", + " 0.07784765, 0.90528905, -0.15917295, -0.3427578 , 1.0070069 ,\n", + " -0.57078034, 0.33585113, -0.27914697, -0.24289384, 0.17581789,\n", + " 0.2808861 , -0.35724574, 0.2030598 , 0.7853533 , 0.5153942 ,\n", + " -0.02380644, -0.34730977, -0.2862777 , -0.44545448, 0.04394584,\n", + " -0.7926984 , -0.3066928 , -0.4378877 , 0.06224217, -0.48833787,\n", + " -0.48612142, 0.33839923, -0.02597165, 0.06829736, -1.3514524 ,\n", + " -0.72032964, 0.81755555, 0.73999155, 0.35204384, 0.32564116,\n", + " 0.37047276, 0.3869023 , 0.73725784, 0.49011388, -0.06073807,\n", + " 0.40204594, 0.25720817, 0.3023497 , -0.7338208 , -1.2525887 ,\n", + " 0.758383 , 0.1704396 , 0.26385054, -0.6765845 , -0.80152684,\n", + " -0.47452438, -0.25873485, 0.05395245, -0.5654043 , 0.5105308 ,\n", + " 0.26053032, 0.34596896, -0.62164515, -0.02258987, 0.06654755,\n", + " 0.8050189 , -0.02911493, -0.74690014, -0.5086117 , -0.06318699,\n", + " 1.2542377 , 0.5853978 , -0.92408645, -0.6169342 , -0.5941347 ,\n", + " 0.2128975 , 0.76446146, 0.78195745, -0.3471526 , 0.51036954,\n", + " 0.5108987 , -0.09576786, -0.7606738 , 0.8236566 , -0.28881475,\n", + " -0.7867539 , 0.31546646, 0.40256152, 0.0999696 , 0.20387918,\n", + " -0.6289423 , 0.63682 , 0.8060169 , -0.98891175, 0.14811945,\n", + " 0.29527354, 0.31912726, -0.22632086], dtype=float32)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "word_vecs[0][0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* the most annoying part: create sliding windows around words and create huge arrays containing values ad it's neighbors" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "window_size = 3\n", + "batch_size = 1000" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "12" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(lb.classes_)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "\n", + "train_upos_tags = np.zeros((batch_size, window_size * 2 + 1, len(lb.classes_)))\n", + "train_word_vecs = np.zeros((batch_size, window_size * 2 + 1, model.vector_size))\n", + "train_bool_ingr = np.zeros((batch_size, 1))\n", + "train_bool_actn = np.zeros((batch_size, 1))\n", + "\n", + "X = np.zeros((batch_size, window_size * 2 + 1, train_upos_tags.shape[2] + train_word_vecs.shape[2]))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [], + "source": [ + "sentence_counter = 0\n", + "token_counter = 0\n", + "i = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "def next_batch():\n", + " global sentence_counter\n", + " global i\n", + " global token_counter\n", + " global train_upos_tags\n", + " global train_word_vecs\n", + " global train_bool_ingr\n", + " global train_bool_actn\n", + " \n", + " \n", + " train_upos_tags = np.zeros((batch_size, window_size * 2 + 1, len(lb.classes_)))\n", + " train_word_vecs = np.zeros((batch_size, window_size * 2 + 1, model.vector_size))\n", + " train_bool_ingr = np.zeros((batch_size, 1))\n", + " train_bool_actn = np.zeros((batch_size, 1))\n", + " \n", + " i = 0\n", + " \n", + " current_sent_upos = upos_tags[sentence_counter]\n", + " current_sent_word = word_vecs[sentence_counter]\n", + " current_sent_ingr = bool_ingr[sentence_counter]\n", + " current_sent_actn = bool_actn[sentence_counter]\n", + "\n", + " \n", + " for i in range(batch_size):\n", + " \n", + " for j in range(- window_size, window_size + 1):\n", + " if j + token_counter < 0:\n", + " pass\n", + " elif j + token_counter >= len(current_sent_upos):\n", + " pass\n", + " else:\n", + " train_upos_tags[i,j + window_size,:] = current_sent_upos[token_counter + j]\n", + " train_word_vecs[i,j + window_size,:] = current_sent_word[token_counter + j]\n", + "\n", + " train_bool_ingr[i] = current_sent_ingr[token_counter]\n", + " train_bool_actn[i] = current_sent_actn[token_counter]\n", + "\n", + " token_counter += 1\n", + "\n", + " if token_counter >= len(current_sent_upos):\n", + " current_sent_upos = upos_tags[sentence_counter]\n", + " current_sent_word = word_vecs[sentence_counter]\n", + " current_sent_ingr = bool_ingr[sentence_counter]\n", + " current_sent_actn = bool_actn[sentence_counter]\n", + " \n", + " sentence_counter += 1\n", + " token_counter = 0\n", + " \n", + " # flatten dimensions:\n", + " train_upos_tags = train_upos_tags.reshape((batch_size, train_upos_tags.shape[1] * train_upos_tags.shape[2]))\n", + " train_word_vecs = train_word_vecs.reshape((batch_size, train_word_vecs.shape[1] * train_word_vecs.shape[2]))" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "next_batch()" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1000" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(train_bool_ingr)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "9\n", + "10\n", + "11\n", + "12\n", + "13\n", + "14\n", + "15\n" + ] + } + ], + "source": [ + "for j in range(token_counter - window_size, token_counter + window_size + 1):\n", + " print(j + window_size)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "896" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(train_word_vecs[2])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## create a decision tree classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.tree import DecisionTreeClassifier\n", + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "* train ingredients" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "X = train_upos_tags\n", + "Y = train_bool_ingr" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X,Y, random_state=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "250" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "tree = DecisionTreeClassifier(random_state=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,\n", + " max_features=None, max_leaf_nodes=None,\n", + " min_impurity_decrease=0.0, min_impurity_split=None,\n", + " min_samples_leaf=1, min_samples_split=2,\n", + " min_weight_fraction_leaf=0.0, presort=False,\n", + " random_state=0, splitter='best')" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tree.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [], + "source": [ + "pred = tree.predict(X_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.,\n", + " 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.,\n", + " 1., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1., 0., 1., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 1., 1., 0., 1., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 1.,\n", + " 0., 0., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.,\n", + " 0., 0., 0., 0., 1., 1., 1., 0., 1., 1., 0., 0., 1., 0., 0., 0., 1.,\n", + " 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(pred - y_test[:,0])**2" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 1., 1., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1., 1.,\n", + " 1., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 1., 0., 0., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.,\n", + " 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", + " 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.,\n", + " 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_test[:,0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Tagging/conllu_batch_generator.py b/Tagging/conllu_batch_generator.py new file mode 100644 index 0000000..737639d --- /dev/null +++ b/Tagging/conllu_batch_generator.py @@ -0,0 +1,275 @@ +#!/usr/bin/env python3 + +import sys + +from conllu import parse +from tagging_tools import print_visualized_tags + +from sklearn import preprocessing +import numpy as np + +sys.path.insert(0, '..') +import settings # noqa + + +class ConlluSentenceIterator(object): + def __init__(self, conllu_reader): + self.conllu_reader = conllu_reader + + def __next__(self): + next_sent = self.conllu_reader.next_sentence() + if next_sent is None: + raise StopIteration + return next_sent + + +class ConlluDocumentIterator(object): + def __init__(self, conllu_reader): + self.conllu_reader = conllu_reader + + def __next__(self): + next_sent = self.conllu_reader.next_document() + if next_sent is None: + raise StopIteration + return next_sent + + +class ConlluReader(object): + def __init__(self, path, iter_documents=False): + self._path = path + self._fileobj = None + self._open() + self.iter_documents = iter_documents + + def _open(self): + self._fileobj = open(self._path, 'r') + + def next_sentence(self): + data = "" + while True: + line = self._fileobj.readline() + if line == "": + break + data += line + if line == "\n": + break + + if data == "": + return None + + if data[-1] != "\n": + data += "\n" + + conllu_obj = parse(data) + return conllu_obj + + def next_document(self): + data = "" + last_line_empty = False + while True: + line = self._fileobj.readline() + if line == "": + break + data += line + if line == "\n": + if last_line_empty: + break + last_line_empty = True + else: + last_line_empty = False + + if data == "": + return None + + if data[-1] != "\n": + data += "\n" + + conllu_obj = parse(data) + return conllu_obj + + def __iter__(self): + return ConlluDocumentIterator(self) if self.iter_documents else ConlluSentenceIterator(self) + + +class SlidingWindowListIterator(object): + def __init__(self, parent): + self.parent = parent + self.i = 0 + + def __next__(self): + if len(self.parent) == self.i: + raise StopIteration + + self.i += 1 + return self.parent[self.i - 1] + + +class SlidingWindowList(list): + def __init__(self, sliding_window_size, input=None, border_value=None): + + self.sliding_window_size = sliding_window_size + self.border_value = border_value + + if border_value is None and input is not None: + self.border_value = type(input[0])() + + if input is not None: + super(SlidingWindowList, self).__init__(input) + + def __getitem__(self, index): + + if type(index) == slice: + start = 0 if index.start is None else index.start + stop = len(self) if index.stop is None else index.stop + step = 1 if index.step is None else index.step + return [self[i] for i in range(start, stop, step)] + + else: + n = self.sliding_window_size * 2 + 1 + res = n * [self.border_value] + + j_start = index - self.sliding_window_size + + for i in range(n): + ind = j_start + i + if ind >= 0 and ind < len(self): + res[i] = super(SlidingWindowList, self).__getitem__(ind) + + return res + + def __iter__(self): + return SlidingWindowListIterator(self) + + +''' +class ConlluDataProviderIterator(object): + def __init__(self, parent): + self.parent = parent + self.conllu_reader = ConlluReader( + parent.filepath, parent.iter_documents) + + def __next__(self): + result = self.parent.getNextDataBatch(conllu_reader=self.conllu_reader) + if result is None: + raise StopIteration + return result +''' + +''' +class ConlluDataProvider(object): + def __init__(self, + filepath, + word2vec_model, + batchsize=100, + window_size=3, + iter_documents=False, + food_type=None): + self.batchsize = batchsize + self.word2vec_model = word2vec_model + self.filepath = filepath + self.conllu_reader = ConlluReader(filepath, iter_documents) + self.window_size = window_size + self.food_type = food_type + self.iter_documents = iter_documents + + # create a label binarizer for upos tags: + self.lb = preprocessing.LabelBinarizer() + self.lb.fit(['.', 'ADJ', 'ADP', 'ADV', 'CONJ', 'DET', + 'NOUN', 'NUM', 'PRON', 'PRT', 'VERB', 'X']) + + def _get_next_conllu_objects(self, n: int, conllu_reader): + i = 0 + conllu_list = [] + + while i < n: + try: + conllu_list.append(conllu_reader.__iter__().__next__()) + i += 1 + + except StopIteration: + break + + return conllu_list + + def _get_upos_X(self, conllu_list): + n_tokens = 0 + l_global = [] + for document in conllu_list: + l = [] + for sentence in document: + for token in sentence: + upos = token['upostag'] + l.append(upos) + n_tokens += 1 + if len(l) > 0: + l_global.append(self.lb.transform(l)) + + return l_global, n_tokens + + def _get_y(self, conllu_list, misk_key="food_type", misc_val="ingredient"): + n_tokens = 0 + y_global = [] + for document in conllu_list: + y = [] + for sentence in document: + for token in sentence: + m = token['misc'] + t_y = m is not None and misk_key in m and m[misk_key] == misc_val + y.append(t_y) + n_tokens += 1 + if len(y) > 0: + y_global.append(y) + + return y_global, n_tokens + + def getNextDataBatch(self, y_food_type_label=None, conllu_reader=None): + + if y_food_type_label is None: + y_food_type_label = self.food_type + + if conllu_reader is None: + conllu_reader = self.conllu_reader + conllu_list = self._get_next_conllu_objects( + self.batchsize, conllu_reader) + + if len(conllu_list) == 0: + return None + + # generate features for each document/sentence + n = len(conllu_list) + + d = self.window_size * 2 + 1 + + buf_X, x_tokens = self._get_upos_X(conllu_list) + buf_ingr_y, y_tokens = self._get_y(conllu_list) + + assert len(buf_X) == len(buf_ingr_y) and x_tokens == y_tokens + + X_upos = np.zeros(shape=(x_tokens, d * len(self.lb.classes_))) + y = None + + if y_food_type_label is not None: + y = np.zeros(shape=(x_tokens)) + + i = 0 + for xupos in buf_X: + tmp = SlidingWindowList(self.window_size, + xupos, + border_value=[0] * len(self.lb.classes_)) + for upos_window in tmp: + X_upos[i, :] = np.array(upos_window).flatten() + i += 1 + + i = 0 + if y_food_type_label is not None: + for sentence in buf_ingr_y: + for yl in sentence: + y[i] = yl + i += 1 + + return X_upos, y + + def __iter__(self): + return ConlluDataProviderIterator(self) + +''' diff --git a/Tagging/conllu_generator.py b/Tagging/conllu_generator.py index d91ac75..daeb7ee 100644 --- a/Tagging/conllu_generator.py +++ b/Tagging/conllu_generator.py @@ -102,7 +102,7 @@ class ConlluElement(object): return replace_tab(result, 16) -class ConlluDocument(object): +class ConlluSentence(object): def __init__(self): self.conllu_elements = [] @@ -114,7 +114,25 @@ class ConlluDocument(object): for elem in self.conllu_elements: result += elem.__repr__() + "\n" - return result + "\n" + return result + + def __str__(self): + return self.__repr__() + + +class ConlluDocument(object): + def __init__(self): + self.conllu_sentences = [] + + def add(self, conllu_sentence: ConlluSentence): + self.conllu_sentences.append(conllu_sentence) + + def __repr__(self): + result = "# newdoc\n" + for elem in self.conllu_sentences: + result += elem.__repr__() + "\n" + + return result def __str__(self): return self.__repr__() @@ -136,46 +154,56 @@ class ConlluGenerator(object): tokenized_documents = [] for doc in self.documents: - simple_tokenized = nltk.tokenize.word_tokenize(doc) - tokenized_documents.append( - self.mwe_tokenizer.tokenize(simple_tokenized)) + tokenized_sentences = [] + sentences = doc.split("\n") + for sent in sentences: + if (len(sent) > 0): + simple_tokenized = nltk.tokenize.word_tokenize(sent) + tokenized_sentences.append( + self.mwe_tokenizer.tokenize(simple_tokenized)) + tokenized_documents.append(tokenized_sentences) # now create initial colln-u elemnts for doc in tokenized_documents: + conllu_doc = ConlluDocument() self.id_counter = 0 - collnu_doc = ConlluDocument() - for token in doc: - stemmed_token = None - if "_" in token: - stemmed_token = "_".join( - [self.stemmer.stem(part) for part in token.split("_")]) - else: - stemmed_token = self.stemmer.stem(token) - collnu_doc.add(ConlluElement( - id=self.id_counter + 1, - form=token, - lemma=stemmed_token - )) - self.id_counter += 1 - self.conllu_documents.append(collnu_doc) + for sent in doc: + conllu_sent = ConlluSentence() + for token in sent: + stemmed_token = None + if "_" in token: + stemmed_token = "_".join( + [self.stemmer.stem(part) for part in token.split("_")]) + else: + stemmed_token = self.stemmer.stem(token) + conllu_sent.add(ConlluElement( + id=self.id_counter + 1, + form=token, + lemma=stemmed_token + )) + self.id_counter += 1 + conllu_doc.add(conllu_sent) + self.conllu_documents.append(conllu_doc) def pos_tagging(self): for conllu_document in self.conllu_documents: - tokens = [x.form for x in conllu_document.conllu_elements] - pos_tags = pos_tag(tokens) - simplified_tags = [map_tag('en-ptb', 'universal', tag) - for word, tag in pos_tags] + for conllu_sent in conllu_document.conllu_sentences: + tokens = [x.form for x in conllu_sent.conllu_elements] + pos_tags = pos_tag(tokens) + simplified_tags = [map_tag('en-ptb', 'universal', tag) + for word, tag in pos_tags] - for i in range(len(tokens)): - conllu_elem = conllu_document.conllu_elements[i] - conllu_elem.upos = simplified_tags[i] - conllu_elem.xpos = pos_tags[i][1] + for i in range(len(tokens)): + conllu_elem = conllu_sent.conllu_elements[i] + conllu_elem.upos = simplified_tags[i] + conllu_elem.xpos = pos_tags[i][1] def add_misc_value_by_list(self, key, value, stemmed_keyword_list): for conllu_document in self.conllu_documents: - for elem in conllu_document.conllu_elements: - if elem.lemma in stemmed_keyword_list: - elem.add_misc(key, value) + for conllu_sent in conllu_document.conllu_sentences: + for elem in conllu_sent.conllu_elements: + if elem.lemma in stemmed_keyword_list: + elem.add_misc(key, value) def __repr__(self): result = "" diff --git a/Tagging/crf_data_generator.py b/Tagging/crf_data_generator.py new file mode 100644 index 0000000..ce91b39 --- /dev/null +++ b/Tagging/crf_data_generator.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 + +import conllu_batch_generator as cbg + + +def word2features(sent, i): + word = sent[i]['form'] + postag = sent[i]['upostag'] + features = [ + 'bias', + #'word.lower=' + word.lower(), + 'word[-3:]=' + word[-3:], + 'word[-2:]=' + word[-2:], + 'word.isupper=%s' % word.isupper(), + 'word.istitle=%s' % word.istitle(), + 'word.isdigit=%s' % word.isdigit(), + 'postag=' + postag, + 'postag[:2]=' + postag[:2], + ] + if i > 0: + word1 = sent[i-1]['form'] + postag1 = sent[i-1]['upostag'] + features.extend([ + '-1:word.lower=' + word1.lower(), + '-1:word.istitle=%s' % word1.istitle(), + '-1:word.isupper=%s' % word1.isupper(), + '-1:postag=' + postag1, + '-1:postag[:2]=' + postag1[:2], + ]) + if i > 1: + word1 = sent[i-2]['form'] + postag1 = sent[i-2]['upostag'] + features.extend([ + '-2:word.lower=' + word1.lower(), + '-2:word.istitle=%s' % word1.istitle(), + '-2:word.isupper=%s' % word1.isupper(), + '-2:postag=' + postag1, + '-2:postag[:2]=' + postag1[:2], + ]) + else: + features.append('BOS') + + if i < len(sent)-1: + word1 = sent[i+1]['form'] + postag1 = sent[i+1]['upostag'] + features.extend([ + '+1:word.lower=' + word1.lower(), + '+1:word.istitle=%s' % word1.istitle(), + '+1:word.isupper=%s' % word1.isupper(), + '+1:postag=' + postag1, + '+1:postag[:2]=' + postag1[:2], + ]) + if i < len(sent)-2: + word1 = sent[i+1]['form'] + postag1 = sent[i+1]['upostag'] + features.extend([ + '+2:word.lower=' + word1.lower(), + '+2:word.istitle=%s' % word1.istitle(), + '+2:word.isupper=%s' % word1.isupper(), + '+2:postag=' + postag1, + '+2:postag[:2]=' + postag1[:2], + ]) + else: + features.append('EOS') + + return features + + +def sent2labels(sent): + labels = [] + for token in sent: + if token['misc'] is not None and 'food_type' in token['misc']: + labels.append(token['misc']['food_type']) + else: + labels.append("0") + return labels + + +def sent2features(sent): + return [word2features(sent, i) for i in range(len(sent))] + + +def sent2tokens(sent): + return [token['form'] for token in sent] + + +def feature2tokens(sent): + return [t[1].split("=")[1] for t in sent] + + +class ConlluCRFReaderIterator(object): + def __init__(self, parent): + self._parent = parent + self._iter = self._parent._conllu_reader.__iter__() + + def __next__(self): + features = None + labels = None + tokens = None + + if not self._parent._iter_documents: + next_sent = self._iter.__next__()[0] + features = sent2features(next_sent) + labels = sent2labels(next_sent) + tokens = sent2tokens(next_sent) + else: + next_doc = self._iter.__next__() + features = [sent2features(sentence) for sentence in next_doc] + labels = [sent2labels(sentence) for sentence in next_doc] + tokens = [sent2tokens(sentence) for sentence in next_doc] + + return features, labels, tokens + + +class ConlluCRFReader(object): + def __init__(self, path, iter_documents=False): + self._path = path + self._iter_documents = iter_documents + + self._conllu_reader = cbg.ConlluReader(path, iter_documents) + + def __iter__(self): + return ConlluCRFReaderIterator(self) diff --git a/Tagging/recipe_collnu_generator.py b/Tagging/recipe_collnu_generator.py index df78455..a9a5760 100755 --- a/Tagging/recipe_collnu_generator.py +++ b/Tagging/recipe_collnu_generator.py @@ -16,6 +16,12 @@ spec = importlib.util.spec_from_file_location( ingredients = importlib.util.module_from_spec(spec) spec.loader.exec_module(ingredients) +# loading actions: +spec = importlib.util.spec_from_file_location( + "ingredients", "../" + settings.actions_file) +actions = importlib.util.module_from_spec(spec) +spec.loader.exec_module(actions) + # load json reader @@ -36,13 +42,14 @@ def process_instructions(instructions: list): if len(instructions) == 0: return - conllu_input_docs = [doc.replace("\n", " ")[:-1] for doc in instructions] + conllu_input_docs = instructions cg = ConlluGenerator( conllu_input_docs, ingredients.multi_word_ingredients_stemmed) cg.tokenize_and_stem() cg.pos_tagging() cg.add_misc_value_by_list("food_type", "ingredient", [w.replace(" ","_") for w in ingredients.multi_word_ingredients_stemmed] + ingredients.ingredients_stemmed) + cg.add_misc_value_by_list("food_type", "action", actions.stemmed_cooking_verbs) savefile.write(str(cg)) diff --git a/Tagging/tagging_tools.py b/Tagging/tagging_tools.py new file mode 100644 index 0000000..5765836 --- /dev/null +++ b/Tagging/tagging_tools.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +from IPython.display import Markdown, display +import conllu + +def print_visualized_tags( + conllu_sentence, + food_tags_and_colors={'ingredient': 'cyan', 'action': "orange"}, + upos_colors={'VERB': 'yellow'}): + colorstr = "{}" + s = "" + for tag in conllu_sentence: + # print(tag) + upos = tag['upostag'] + if tag['misc'] != None: + for food_tag in food_tags_and_colors: + if food_tag == tag['misc']['food_type']: + s += colorstr.format( + food_tags_and_colors[food_tag], tag['form']) + " " + + elif upos in upos_colors: + s += colorstr.format(upos_colors[upos], tag['form']) + " " + else: + s += tag['form'] + " " + + display(Markdown(s)) + + diff --git a/Tagging/test.crfsuite b/Tagging/test.crfsuite new file mode 100644 index 0000000000000000000000000000000000000000..79cc1b5e8e77d75772ec75ffc5611e56993e0f23 GIT binary patch literal 544048 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%0DPqN5>$W6CMIX%?Biu&DuZLMc+to)oE^F!skl#_ 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 literal 0 HcmV?d00001 diff --git a/tools.py b/tools.py new file mode 100644 index 0000000..ee7e3a3 --- /dev/null +++ b/tools.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 + +import numpy as np +import json + +import nltk +from nltk.stem import PorterStemmer +from nltk.stem import LancasterStemmer +from nltk.corpus import stopwords as nltk_stopwords + +from pprint import pprint + +from gensim.test.utils import common_texts, get_tmpfile +from gensim.models import Word2Vec, KeyedVectors + +from sklearn.manifold import TSNE + +import matplotlib.pyplot as plt + +from json_buffered_reader import JSON_buffered_reader as JSON_br + +import pandas as pd + +import settings + +from ipypb import track +from IPython.display import HTML, Markdown + + +# loading learned wordvectors +wv = KeyedVectors.load("data/wordvectors.kv") +porter = PorterStemmer() + + +def word_similarity(word_a: str, word_b: str, model=wv, stemmer=porter): + return model.similarity(stemmer.stem(word_a), stemmer.stem(word_b)) + + +def word_exists(word: str, model=wv, stemmer=porter): + return stemmer.stem(word) in model + +from cooking_vocab import cooking_verbs +from cooking_ingredients import ingredients + +model_actions = [] +model_ingredients = [] + +for action in cooking_verbs: + if word_exists(action): + model_actions.append(action) + +for ingredient in ingredients: + if word_exists(ingredient): + model_ingredients.append(ingredient) + +def tsne_plot(tokens, model=wv, dist_token=None): + vecs = [] + labels = [] + for token in tokens: + vecs.append(model[token]) + labels.append(token) + + tsne_model = TSNE(perplexity=40, n_components=2, + init='pca', n_iter=2500, random_state=23) + plot_values = tsne_model.fit_transform(vecs) + + distances = [] + + min_size = 10 + max_size = 500 + + if dist_token is not None: + distances = np.array([model.similarity(t, dist_token) for t in tokens]) + # scale: + min_s = np.min(distances) + max_s = np.max(distances) + distances = min_size + (distances - min_s) * ((max_size - min_size) / (max_s - min_s)) + + + x = [] + y = [] + for value in plot_values: + x.append(value[0]) + y.append(value[1]) + + plt.figure(figsize=(16, 16)) + for i in range(len(x)): + if dist_token is None: + plt.scatter(x[i], y[i]) + else: + plt.scatter(x[i], y[i], s=distances[i]) + plt.annotate(labels[i], + xy=(x[i], y[i]), + xytext=(5, 2), + textcoords='offset points', + ha='right', + va='bottom') + plt.show() + + +stemmed_ingredients = [porter.stem(ing) for ing in model_ingredients] +stemmed_actions = [porter.stem(act) for act in model_actions] \ No newline at end of file