From ccd69532091af7fcf0c1f45421a78a91ceda8968 Mon Sep 17 00:00:00 2001 From: Dmitri Soshnikov Date: Mon, 23 May 2022 12:12:45 +0300 Subject: [PATCH] Add NER lesson and lab --- README.md | 2 +- lessons/5-NLP/19-NER/NER-TF.ipynb | 481 ++++++++++++++++++++++++ lessons/5-NLP/19-NER/README.md | 69 +++- lessons/5-NLP/19-NER/images/bot-ner.png | Bin 0 -> 38663 bytes lessons/5-NLP/19-NER/lab/README.md | 47 +++ lessons/6-Other/22-DeepRL/README.md | 2 +- 6 files changed, 598 insertions(+), 3 deletions(-) create mode 100644 lessons/5-NLP/19-NER/NER-TF.ipynb create mode 100644 lessons/5-NLP/19-NER/images/bot-ner.png create mode 100644 lessons/5-NLP/19-NER/lab/README.md diff --git a/README.md b/README.md index f10e688b..b931f870 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ For a gentle introduction to *AI in the Cloud* topics you may consider taking th 16Recurrent Neural NetworksTextPyTorchTensorFlow 17Generative Recurrent NetworksTextPyTorchTensorFlowLab 18Transformers. BERT.TextPyTorchTensorFlow -19Named Entity RecognitionTextPyTorchTensorFlow +19Named Entity RecognitionTextTensorFlowLab 20Large Language Models, Prompt Programming and Few-Shot TasksTextPyTorchTensorFlow VIOther AI Techniques 21Genetic AlgorithmsTextNotebook diff --git a/lessons/5-NLP/19-NER/NER-TF.ipynb b/lessons/5-NLP/19-NER/NER-TF.ipynb new file mode 100644 index 00000000..46ed3249 --- /dev/null +++ b/lessons/5-NLP/19-NER/NER-TF.ipynb @@ -0,0 +1,481 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Named Entity Recognition (NER)\n", + "\n", + "This notebook is from [AI for Beginners Curriculum](http://aka.ms/ai-beginners).\n", + "\n", + "In this example, we will learn how to train NER model on [Annotated Corpus for Named Entity Recognition](https://www.kaggle.com/datasets/abhinavwalia95/entity-annotated-corpus) Dataset from Kaggle. Before procedding, please donwload [ner_dataset.csv](https://www.kaggle.com/datasets/abhinavwalia95/entity-annotated-corpus?resource=download&select=ner_dataset.csv) file into current directory." + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from tensorflow import keras\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Preparing the Dataset \n", + "\n", + "We will start by reading the dataset into a dataframe. If you want to learn more about using Pandas, visit a [lesson on data processing](https://github.com/microsoft/Data-Science-For-Beginners/tree/main/2-Working-With-Data/07-python) in our [Data Science for Beginners](http://aka.ms/datascience-beginners)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Sentence #WordPOSTag
0Sentence: 1ThousandsNNSO
1NaNofINO
2NaNdemonstratorsNNSO
3NaNhaveVBPO
4NaNmarchedVBNO
\n", + "
" + ], + "text/plain": [ + " Sentence # Word POS Tag\n", + "0 Sentence: 1 Thousands NNS O\n", + "1 NaN of IN O\n", + "2 NaN demonstrators NNS O\n", + "3 NaN have VBP O\n", + "4 NaN marched VBN O" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_csv('ner_dataset.csv',encoding='unicode-escape')\n", + "df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's get unique tags and create lookup dictionaries that we can use to convert tags into class numbers:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['O', 'B-geo', 'B-gpe', 'B-per', 'I-geo', 'B-org', 'I-org', 'B-tim',\n", + " 'B-art', 'I-art', 'I-per', 'I-gpe', 'I-tim', 'B-nat', 'B-eve',\n", + " 'I-eve', 'I-nat'], dtype=object)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tags = df.Tag.unique()\n", + "tags" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'O'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "id2tag = dict(enumerate(tags))\n", + "tag2id = { v : k for k,v in id2tag.items() }\n", + "\n", + "id2tag[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we need to do the same with vocabulary. For simplicity, we will create vocabulary without taking word frequency into account; in real life you might want to use Keras vectorizer, and limit the number of words." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "vocab = set(df['Word'].apply(lambda x: x.lower()))\n", + "id2word = { i+1 : v for i,v in enumerate(vocab) }\n", + "id2word[0] = ''\n", + "vocab.add('')\n", + "word2id = { v : k for k,v in id2word.items() }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need to create a dataset of sentences for training. Let's loop through the original dataset and separate all individual sentences into `X` (lists of words) and `Y` (list of tokens):" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "X,Y = [],[]\n", + "s,t = [],[]\n", + "for i,row in df[['Sentence #','Word','Tag']].iterrows():\n", + " if pd.isna(row['Sentence #']):\n", + " s.append(row['Word'])\n", + " t.append(row['Tag'])\n", + " else:\n", + " if len(s)>0:\n", + " X.append(s)\n", + " Y.append(t)\n", + " s,t = [row['Word']],[row['Tag']]\n", + "X.append(s)\n", + "Y.append(t)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will now vectorize all words and tokens:" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "([10386,\n", + " 23515,\n", + " 4134,\n", + " 29620,\n", + " 7954,\n", + " 13583,\n", + " 21193,\n", + " 12222,\n", + " 27322,\n", + " 18258,\n", + " 5815,\n", + " 15880,\n", + " 5355,\n", + " 25242,\n", + " 31327,\n", + " 18258,\n", + " 27067,\n", + " 23515,\n", + " 26444,\n", + " 14412,\n", + " 358,\n", + " 26551,\n", + " 5011,\n", + " 30558],\n", + " [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0])" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def vectorize(seq):\n", + " return [word2id[x.lower()] for x in seq]\n", + "\n", + "def tagify(seq):\n", + " return [tag2id[x] for x in seq]\n", + "\n", + "Xv = list(map(vectorize,X))\n", + "Yv = list(map(tagify,Y))\n", + "\n", + "Xv[0], Yv[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For simplicity, we will pad all sentences with 0 tokens to the maximum length. In real life, we might want to use more clever strategy, and pad sequences only within one minibatch." + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "X_data = keras.preprocessing.sequence.pad_sequences(Xv,padding='post')\n", + "Y_data = keras.preprocessing.sequence.pad_sequences(Yv,padding='post')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Defining Token Classification Network\n", + "\n", + "We will use two-layer bidirectional LSTM network for token classification. In order to apply dense classifier to each of the output of the last LSTM layer, we will use `TimeDistributed` construction, which replicates the same dense layer to each of the outputs of LSTM at each step: " + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"sequential_3\"\n", + "_________________________________________________________________\n", + " Layer (type) Output Shape Param # \n", + "=================================================================\n", + " embedding_4 (Embedding) (None, 104, 300) 9545400 \n", + " \n", + " bidirectional_6 (Bidirectio (None, 104, 200) 320800 \n", + " nal) \n", + " \n", + " bidirectional_7 (Bidirectio (None, 104, 200) 240800 \n", + " nal) \n", + " \n", + " time_distributed_3 (TimeDis (None, 104, 17) 3417 \n", + " tributed) \n", + " \n", + "=================================================================\n", + "Total params: 10,110,417\n", + "Trainable params: 10,110,417\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "maxlen = X_data.shape[1]\n", + "vocab_size = len(vocab)\n", + "num_tags = len(tags)\n", + "model = keras.models.Sequential([\n", + " keras.layers.Embedding(vocab_size, 300, input_length=maxlen),\n", + " keras.layers.Bidirectional(keras.layers.LSTM(units=100, activation='tanh', return_sequences=True)),\n", + " keras.layers.Bidirectional(keras.layers.LSTM(units=100, activation='tanh', return_sequences=True)),\n", + " keras.layers.TimeDistributed(keras.layers.Dense(num_tags, activation='softmax'))\n", + "])\n", + "model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['acc'])\n", + "model.summary()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note here that we are explicity specifying `maxlen` for our dataset - in case we want the network to be able to handle variable length sequences, we need to be a bit more clever when defining the network.\n", + "\n", + "Let's now train the model. For speed, we will only train for one epoch, but you may try training for longer time. Also, you may want to separate some part of the dataset as training dataset, to observe validation accuracy." + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1499/1499 [==============================] - 740s 488ms/step - loss: 0.0667 - acc: 0.9841\n" + ] + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit(X_data,Y_data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Testing the Result\n", + "\n", + "Let's now see how our entity recognition model works on a sample sentence: " + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [], + "source": [ + "sent = 'John Smith went to Paris to attend a conference in cancer development institute'\n", + "words = sent.lower().split()\n", + "v = keras.preprocessing.sequence.pad_sequences([[word2id[x] for x in words]],padding='post',maxlen=maxlen)\n", + "res = model(v)[0]" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "john -> B-per\n", + "smith -> I-per\n", + "went -> O\n", + "to -> O\n", + "paris -> B-geo\n", + "to -> O\n", + "attend -> O\n", + "a -> O\n", + "conference -> O\n", + "in -> O\n", + "cancer -> B-org\n", + "development -> I-org\n", + "institute -> I-org\n" + ] + } + ], + "source": [ + "r = np.argmax(res.numpy(),axis=1)\n", + "for i,w in zip(r,words):\n", + " print(f\"{w} -> {id2tag[i]}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Takeaway\n", + "\n", + "Even simple LSTM model shows reasonable results at NER. However, to get much better results, you may want to use large pre-trained language models such as BERT. Training BERT for NER using Huggingface Transformers library is described [here](https://huggingface.co/course/chapter7/2?fw=pt)." + ] + } + ], + "metadata": { + "interpreter": { + "hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f" + }, + "kernelspec": { + "display_name": "Python 3.8.12 ('py38')", + "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.8.12" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/lessons/5-NLP/19-NER/README.md b/lessons/5-NLP/19-NER/README.md index f6e0339a..380b4583 100644 --- a/lessons/5-NLP/19-NER/README.md +++ b/lessons/5-NLP/19-NER/README.md @@ -1 +1,68 @@ -Placeholder \ No newline at end of file +# Named Entity Recognition + +Up to now, we have mostly been concentrating on one NLP task - classification. However, there are also other NLP tasks that can be accomplished with neural networks. One of those tasks is **[Named Entity Recognition](https://en.wikipedia.org/wiki/Named-entity_recognition)** (NER), which deals with recognizing specific entities within text, such as places, person names, date-time intervals, chemical formulae and so on. + +## [Pre-lecture quiz](https://black-ground-0cc93280f.1.azurestaticapps.net/quiz/119) + +## Example of Using NER + +Suppose you want to develop a natural language chat bot, similar to Amazon Alexa or Google Assistant. The way intelligent chat bots work is to *understand* what the user want by doing text classification on the input sentence. The result of this classification is so-called **intent**, which determines what a chat bot should do. + +![Bot NER](images/bot-ner.png) + +> Image by author + +However, a user may provide some parameters as part of the phrase. For example, when asking for a weather, she may specify a location or date. A bot should be able to understand those entities, and fill in the parameter slots accordingly before performing the action. This is exactly when NER comes in. + +Another example would be [analyzing scientific medical papers](https://soshnikov.com/science/analyzing-medical-papers-with-azure-and-text-analytics-for-health/), one of the main things we need to look for are specific medical terms, such as diseases and medical substances. While a small number of diseases can probably be extracted using substring search, more complex entities, such as chemical compounds and medication names, need more complex approach. + +## NER as Token Classification + +NER models are essentially **token classification models**, because for each of the input tokens we need to decide whether it belongs to an entity or not, and if it does - to which entity class. + +Consider the following paper title: + +**Tricuspid valve regurgitation** and **lithium carbonate** **toxicity** in a newborn infant. + +Entities here are: +* Tricuspid valve regurgitation is a disease (`DIS`) +* Lithium carbonate is a chemical substance (`CHEM`) +* Toxicity is also a disease (`DIS`) + +Notice that one entity can span several tokens. And, as in this case, we need to distinguish between two consecutive entities. Thus it is common to use two classes for each entity - one specifying the first token of the entity (often `B-` prefix is used, for beginning), and another - the continuation of an entity (`I-`, for inner token). We also use `O` as a class to represent all other tokens. Such token tagging is called [BIO tagging](https://en.wikipedia.org/wiki/Inside%E2%80%93outside%E2%80%93beginning_(tagging)) (or IOB). When tagged, our title will look like this: + +Token | Tag +------|----- +Tricuspid | B-DIS +valve | I-DIS +regurgitation | I-DIS +and | O +lithium | B-CHEM +carbonate | I-CHEM +toxicity | B-DIS +in | O +a | O +newborn | O +infant | O +. | O + +Since we need to build one-to-one correspondence between tokens and this classes, we can train rightmost **many-to-many** neural network model from this picture: + +![Image showing common recurrent neural network patterns.](../17-GenerativeNetworks/images/unreasonable-effectiveness-of-rnn.jpg) + +> *Image from blog post [Unreasonable Effectiveness of Recurrent Neural Networks](http://karpathy.github.io/2015/05/21/rnn-effectiveness/) by [Andrej Karpaty](http://karpathy.github.io/). NER token classification models correspond to right-most network architecture on this picture.* + +## Training NER models + +Since NER model is essentially a token classification model, we can use RNNs that we are already familiar with for this task. In this case, each block of recurrent network will return the token ID. Example notebook shows how to train LSTM for token classification. + +## ✍️ Example Notebooks: NER + +Continue your learning in the following notebooks: + +* [NER with TensorFlow](NER-TF.ipynb) + +## [Assignment](lab/README.md) + +In the assignment for this lesson, you will have to train medical entity recognition model. You can start with training LSTM model as described in this lesson, and proceed with using BERT transformer model. Read [the instructions](lab/README.md) to get all the details. + diff --git a/lessons/5-NLP/19-NER/images/bot-ner.png b/lessons/5-NLP/19-NER/images/bot-ner.png new file mode 100644 index 0000000000000000000000000000000000000000..2b5c982566076065559362a5af407a758a5a4b35 GIT binary patch literal 38663 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