Natural Language Processing 2 : Zero to Hero | Aditya Shankarnarayan | Skillshare

Natural Language Processing 2 : Zero to Hero

Aditya Shankarnarayan, That Indian Coder Guy

Natural Language Processing 2 : Zero to Hero

Aditya Shankarnarayan, That Indian Coder Guy

Play Speed
  • 0.5x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 2x
12 Lessons (18m)
    • 1. Welcome

    • 2. Introduction

    • 3. Neural Network

    • 4. Google colab

    • 5. IMDb Dataset

    • 6. Coding;IMdB Dataset

    • 7. Word embeddings

    • 8. Coding;IMdB Dataset

    • 9. Sub words

    • 10. Coding:Sub words

    • 11. Class project

    • 12. Wrap up

  • --
  • Beginner level
  • Intermediate level
  • Advanced level
  • All levels
  • Beg/Int level
  • Int/Adv level

Community Generated

The level is determined by a majority opinion of students who have reviewed this class. The teacher's recommendation is shown until at least 5 student responses are collected.





About This Class

Learn NLP the right way!

Easy lesson with detailed example.

Lesson are explained thoroughly.

Tensorflow will be explained with great examples.

Topics covered in this class will set you up in the right direction.

Basic Python knowledge is required.

Meet Your Teacher

Teacher Profile Image

Aditya Shankarnarayan

That Indian Coder Guy


Hello, I’m Aditya
Iam a Programmer who is passionate about helping students become better coders. 
I have been programming since I was in the 8th grade and have been teaching for over a year now. I primarily focus on Data Science and related topics. 
I hope you find value in my classes and learn a lot from it. 


See full profile

Class Ratings

Expectations Met?
  • Exceeded!
  • Yes
  • Somewhat
  • Not really
Reviews Archive

In October 2018, we updated our review system to improve the way we collect feedback. Below are the reviews written before that update.

Your creative journey starts here.

  • Unlimited access to every class
  • Supportive online creative community
  • Learn offline with Skillshare’s app

Why Join Skillshare?

Take award-winning Skillshare Original Classes

Each class has short lessons, hands-on projects

Your membership supports Skillshare teachers

Learn From Anywhere

Take classes on the go with the Skillshare app. Stream or download to watch on the plane, the subway, or wherever you learn best.



1. Welcome: Welcome to natural language processing or NLP. In this class, you will learn how to use TensorFlow to possess text for natural language processing. And like images which come in these irregular shape lenses of pixel intensity values, x is a lot messier. Texts are long, shore use different punctuation and then there is a problem of feather using alphabets or word processing. In this class, we will tackle all of those questions. In this class, you will learn about tokenization, word embeddings, recurrent neural networks, and its types does LSD, EMS, and sequence models. By the end of this class, you'll learn how to build a model which can right, like Shakespeare. So I hope you take my class and I look forward to see you in the next lesson. 2. Introduction: Welcome to this new class. In the last class, we looked at tokenizing text, where we turn text into sequence of numbers. With a number was the value of a key value pair with the key being the word. Supporting example, you can represent the word tensor flow with value one and replace every instance of that word with a value of one in a sequence. Using tools and TensorFlow, we were able to possess strings, could indices of all the words Nucor piss off strings, and then converting these things into matrices of numbers. This is the Startup getting sentiment out of a sentence. But right now it's just strings of numbers representing words. So from there, how can we actually got sentiment or these text? Well, that's something that can be learned from corpus of words in much the same way as features are extracted from the images. This process is called lead embedding, with the idea being that associated words and words at Western as vectors in multi-dimensional space. So you're, I'm representing word embeddings of a corpus of text. This corpus of texts is off IMDB reviews. So these are movie reviews or CDs, DVDs which are represented here. So all these dots are words and their position in this graph means something. So once I saw a word like bad, can see words that relate to bag in one certain area. When I sucks, it is also a bad review, so it is also clustered with the board. Bad reward, good is separate or in different directions. Then the word bad, which was your. So as you can see, this is a representation of features of a word. So words that mean the seam will be clustered together. And words that mean differently from another word will be, will be apart from that particular volt. So this is a visual representation of word embeddings. We learn how to do this and how we can visualize this in the later lessons. So before I start, if you aren't familiar with tokenization, I recommend you guys to check out the previous class I did with the same name. So you can catch up with all the things that we have done in the next few lessons will be about neural networks and Google collapse from a previous class about image classification. So that people who are not familiar with neural networks or are not familiar with Google, Codelab uses particular lessons, but if you are familiar with both of them, you can skip ahead. So I hope to see you in the next lesson. 3. Neural Network: Before we start, I would like to familiarize you with certain aspects of a neural network. A neural network is made up of layers, input layer, hidden layer, and output layer. The input layer is where input is given to the network. If you're making an image classifier, we will input the pixel values of the image is the hidden layer is where all the heavy lifting happens. Each hidden layer has the fate and bias associated with it. The value of weight and bias helps to neural networks to learn different things. How does this learning takes place is out of the scope of this class, and it requires a mathematical and calculus background. Luckily, all this math is implemented for us in the form of TensorFlow functions, making it extremely easy. People having the background will certainly help you build a better neural network. But it is not required for beginners to get a basic understanding of neural network. I recommend you to go and check out playgrounds dot This is an excellent tool to understand how things work in the network. This is a classification problem where the background wildtype to map the respective colored dots. Try out different combination and test how it affects. Certainly, the learning rate is how fast or slow network will learn to have a value very high and will cause problems reaching a reasonable solution and having a value too low will increase the learning experience. Activation, activation is applied to each layer in the network, except the input layer. The activation basically shifts the value range of the particular neuron. For example, if features blue shifts the value of the negative numbers to 0 and will keep the positive numbers. And if you change it to sigmoid, sigmoid will transfer all the values will range between 01. So it can transfer values between 0 and when we use them in binary classification. Regularization helps us overcome overfitting and underfitting, which we will cover in a later lesson. So I recommend you guys to check out how different classifications work and test out different combinations. 4. Google colab: Google collaborative free cloud service, where you can improve your Python programming skills and develop deep learning applications using popular libraries as extensor flow and carries, unlike coding on your local machine and downloading bunch of libraries, all these libraries will be pre-installed. So saving up lots of space and local machine. As machine learning or deep learning is a computationally heavy task, we can use the PGP provided greener modal faster. The only requirement is an internet connection and then Google account. So when you open up your lab, you will be greeted with a welcome page. You can read it and learn more about it. Still, maybe skip it, and then click on notebook. This notebook will be saved on your Google Drive. You can save it in a local machine by going here and saving it as a Python notebook. As a Python file. We change it to dot mode and go to settings. And under settings, you can find teams that you continue to Doug Moore and then Himself taught to execute code. Negro to write that code, then press Shift Enter or hit the play button, and this will execute R code, and then the output will be displayed below the segue. I want to share more information about Kuulab, which I will do in a later lesson. So this was a basic introduction to Google Codelab, which will be sufficient for our use case to get in-depth knowledge about critical utensil for YouTube page. To find more information. 5. IMDb Dataset: Welcome to this new lesson. So I hope you guys are already familiar with collab as well as in the networks. So in this lesson, we'll be diving deeper into TensorFlow as a framework. So as data plays a major role in deep learning and machine learning, having high-quality datasets is important as a framework, TensorFlow provides you with inbuilt datasets that you can use freely. So tensor two datasets is a package that you can import and call for numerous datasets you can use for particular application, TensorFlow provide datasets in the genre of audio image, image classification, object detection, question answering, structured data, summarization, text, translate, and when you add a few datasets that TensorFlow provides us. So there is image data sets then image classification dataset. We used cats and dogs dataset from the internet. So digging a dataset from the Internet might have some issues. That it might not be up to certain standard images might not be perfect. They might be labeled incorrectly. Of course, having good data sets that do download online can be very beneficial as well. We had a glimpse of flow datasets in the previous image classification class where we use the fascist diminished dataset, further application. In this lesson, we will be using the text dataset, IMDB reviews. So using the IMDB reviews dataset that is available in density fluid as it will require a few lines of code so that we can import these module and then import the particular dataset that we require. We can do the following by the stack of code. So we import answer for datasets, SDLC, ds. Then we load the data set that we weren't using the lower function in TensorFlow datasets and then giving the name of the dataset that you want to import. This will import the metadata of the dataset. Then we'll just split the data into two at a staining and test. So basically in four lines, we imported the data set and split it into training and test data. So as this data has labeled as well as the sentences, we need to separate them. You can do this, but this code, first we declare for lists. This list will have training sentences, training rebels, test sentences and text labels. Then loop over the sentences and labels in the training data. And then append that particular sentence into training sentences list, and then appending the labels into obtaining levels. And we'll do the same procedure for test data. So now that we have our dataset will build a model for classifying good movie reviews versus bad movie reviews. So we'll do this, but this code is highly recommend. Two. Declare your variables are hyperparameters outside the actual code because it is easier to change the hyperparameters. But hyperparameter tuning, if you're not familiar with this set of code, you might not have taken my previous class where we talked about tokenization and Pali. So I suggest you go and check that out before any further. So first we declared the vocabulary size is 10 thousand. Then the embedding dimension will talk about embedding soon, but not now. We declared the maxlength and the midterm type, drunk type. I did not mention our tongue tip in the previous class. So when we declare a max length and then we tokenize Sentence which is bigger than the maxlength. We'll lose a few words. Right? So the first sentence is of 130 words, and we have a MacGuffin, the 1-20 will lose ten words. So drunk type will suggest return type will enforce a particular type of truncating where you can remove words from the back or from different. So truncating type post will help us to remove words after the sentence is complete. That is, if we have, if we have a sentence of 100 volts and at Max Lin, so 1-20, we'll remove the last ten sentences when we gave it o parameter pushed. So rest of the code is seem ready. We tokenize, then we make it into a sequence, and then we pad the sequence. So I hope you understand TensorFlow and have a brief knowledge about how tons it provokes. So if you guys are not familiar with tensor flow, I recommend you guys to go and check out my previous class on skill share about image classification, where I go in depth about TensorFlow as a framework, as we've explained to each and every line of code, pleasant here. So your v create a model. And as newer networks work in a sequence, we need to declare all the layers in a particular sequence. You might not understand what this layer is doing. So as I showed before, the spherical word embeddings sphere, which has words plotted on a 3D graph. So this function will basically lone those embeddings and we'll know which words that we need to pair. We look into embeddings later in the coming classes where I'll explain how embeddings working depth. So for now you can understand this line of code as it will create the relation between words. Then we'll flatten the dataset and doing that is created into a vector. And then we declare two dense layers, one with an activation. I'm going to do another logistic moon activation. As we require only binary classification. That is, good review at a bad review. So this is how we end up building a classifier for a bad movie review and a good movie review. In the next lesson, I'll show you how you can grab those word embeddings and create the visualization I showed you in the, in the previous lessons. So that you can get a better understanding on how word embeddings work. 6. Coding;IMdB Dataset: Welcome to this new lesson. So I hope you guys are already familiar with collab and unit books because that is the platform we're going to use to build our model. So in the previous lesson, we saw how to use tensor for datasets to get high-quality datasets for our application. So if a loading it and set from datasets for the first time, that we'll see a progress bar right here. You can also disable the progress bar by using this code. So now I have the IMDB reviews dataset inside the IMDB variable and add the metadata of the descent in the informative. Now, I'll split the data into training and testing, and then split that particular data obtaining liberal testing label, trainings and intestines. And always remember to turn on GPU acceleration in runtime settings so that you can save some time on computation. And then we create our vocabulary of tokens. And then use those tokens to create sequences of the table thinking as we are using the same data for tokenizing, as well as skating sequence, we won't have any outer vocabulary token. So as I said before, always Riemann tutor and GPU acceleration, as you can see, it takes quite some time to compute all the different tokens and sequence all the different sentences. Then we'll create our model. As you can see, we have that embedding line of code. So basically this will extract features from particular words. We don't have to do anything right here because it will learn on its own. We learn more about embeddings in the next lesson in our model when we compare it to the user binary cross entropy loss function, we use binary cross entropy loss function. As we are only having binary classifier, we use the Adam optimizer or optimizing. I'm want to, next me run wanted. This will take some time, but not much. And we'll see how much accuracy we can achieve. As you can see, our Mondelez finished executing. And you can see that we haven't a 100% accuracy, whether validation accuracy is only 50%. This means that our pointer as overfit. So this is a common problem that can occur to the Natural Language Processing. There are a few things that we can do to avoid them, and we look into it in the next lesson, you can always doing a hyperparameters Jordan there so that you can reduce this overfitting problem. So we will see how our model predicts from a good review to a bad review. So the first sentence I am giving it is, this is a bad move. So this is a negative review. And this sentence is, this is a very good movie. I liked it very much and this is a positive review. Next, VE converted into a sequence of tokens. So always remember, whenever we are passing something to a molded fee needed to be of the same input type as we gave it for training. For example, it has to be of the same type as a painting data, also that it can execute correctly. So once I have done this, as you can see, it gave me two values. That is 0.060420 and 96. So basically it could distinguish between a bad review, that is because it is closer to 0 and between a good review and it is extremely close to one. So once we round this out, so once we're on this out, we get the value 01. So basically, we were able to create a classifier that can distinguish We're going to bad movie review and a good movie. So suggest you go and try this out. In the next lesson, we'll see more about word embeddings and how you can visualize them. So I hope to see you in the next class. 7. Word embeddings: Welcome to your new list. I'd like to congratulate you once again for creating your post model that can classify between a good movie review and a bad movie review. So now we learn more about word embedding. So now I have four words for different word cat is man. Movement at planned Boehner. These four words have groups, that is, men and women are human beings. That is one group, AbdominalA as food. So there have been good, but these groups have some groups in them. That is inside human beings manage different women is different inside for that is fruit and then there's apple and banana. So we have these groups and subgroups, but a computer does not understand them. You associate certain meanings. That totally works. But for computer man, and I believe the same thing unless we give it the difference between networks. So I have provided you with four different variables for these four different words. So the first variable is gender. As you can see, man and woman are opposite genders, right? So as you can see, they have completely polar opposite values, that is minus 11 for apple and banana, they don't have a gender, so their values are close to 0. And availability living that if it is a living thing or not, human, man and a woman, I living things to the values close to one. Red does not really matter because they're not living things. So their values close to 0. Whereas age, so while classifying a man and a woman does not really matter, the main classifier is gender. So as you can see, any age did not have a high value. And same is for apples and bananas. But when it comes to food, man and woman are not food, but apple and banana. Therefore, their values are extremely high. So this is basically how bored embeddings work. As you can see, similar things are classified similarly. Apple and banana, our food. Therefore they are classified under one section. And as you can see, men and women are living things, so they are classified under the same thing. So this is how a machine can understand the different meanings of the words that it can start to distinguish between a man and a woman, that how similar they are now the friendlier and distinguishing between apples and bananas. You can also have a variable of color. Apple has a red color and banana has yellow color. So their values might vary. So that is how word embeddings work. So to visualize it on your own will require, I could do some preprocessing if you remember, while tokenizing are tokens looks something like this. That is, we have hello as the key and the token is devalued, right? When you're going to reverse it. So we require the token value to be the key, whereas the value should be the word. So it will still be a key-value pair, but reverse tick already don't memorize this chord. I have given it inside the useful course section below. So then use this function to create profiles of vectors and metadata. The metadata will have the Voltron a key-value pair. The vectors will have the token values for new key value pair. Alright, so we join all the birds, the d theta by n and the vectors, two vectors final density embedding field vectors file. Then V, download those datasets from Google column using this set of code. The next lesson we'll see how we can do this inside Google colon. 8. Coding;IMdB Dataset: Welcome to this new lesson. In this lesson, we'll see how we can take our word embeddings and create a visualization on those word embeddings as word embeddings of vector, they have, they have a certain point in space. We can plot that point. I understand how word embeddings work better. So before doing that being a good reverser key-value pairs. As you move NC, create a vocabulary. Do 4D is the key and token is devalued in an extreme. So via reverse it and create the token as the key and the vote as a value. Then we create confines of vectors and Metallica. The vectors is basically the embeddings and metadata is devoted to go with respect to the embedding. So we can do this, but this code right here. Then we use the Google collab module and put the files functionality. Then we download both of those fine. You don't have to remember. These code have provided discord in certainly useful quote documentation that I have given below. So once you start to execute this and see that it is done with into files. So as you can see, I have two files inside of my download section, that is the vector files and the metadata file. I've already executed this code. We first sharing it with you people. And therefore the numbering is different. So now all you have to do is go to the site I showed you before. So now to visualize this word embedding, I have linked decide blue. Now you need to pass on Lord. And then choose the vector find vectors d, V, C file. And then open this file. And then I will need to choose the metadata file. So if I don't load the metadata file, I won't be able to differentiate between the points. So after doing that, as you can see, this infrared model. So this is all the words created into Also, this is all the word embeddings for all the words that we used. So as you can see, it is not completely understandable diagonal. To create children distinction, we need to do click on. So once we sphere is the data, as you can see, there is certain polarization between the word embeddings toward embedding, they're starting to cluster on one side. So if I search for a word like mad, as you can see, all bad odors that is boards that they lead to something that is negative on one side. And if I write something like a mi, zinc, as you can see, amazing, amazing, amazingly on all clustered to the opposite side of the bad words. That is bad, horrendous, etcetera. So now if I type good, as you can see, good is also some very, as you can see that a few outliers. But it's fine. If you search for a word like harder when as you can see, where did I coded? All clustering but the negative side of d. So basically we have created of v that our neural network can distinguish between a bad word has the negative bird or a positive wood. So that will help on your network to understand if the word that is used in the review is of a negative review or is it a full positively? So do this by yourself and try to search good versus bad words. He will also see a few words that come in between. So those water neutral words. So if I'd asked you guys to go and check this out, and I'll see you in the next class. 9. Sub words: In the previous lesson, we used in separate data set R t, ds to lower the reviews from the IMDB data set and perform classifications on them. In Eugene, this prepackaged datasets, I already worked upon that to some data scientists have done the tokenization work for us already. And the IMDB data set is no exception. In this lesson, we'll see how we can take that already tokenizer pre-organized dataset and use them for our application. So this tokenization is the answer to that, which means that the verb is also divided into system works. So we'll see how x classification can be done using this and what different problems does it solve? So post-independence different datasets. And you can follow this link and we're also given the link below. So once you scroll down to the IMDB reviews, you can see we have many variance of it. So we are going to use this subvert 8K variant. So this variation has a vocabulary size of a thousand. So importing, so loading this dataset as simple as you saw in the previous lesson, we write IMDB underscore reviews slash, subverts. It can. We'll see how this looks in the next lesson when we code this. So after loading the dataset, we divide into training and testing data and tokenize it using the tokenizer that THY have imported from the dataset. You remember v, v using NOR function to create two different variable, that is the IMDB as well as the Info. And I said the info part contains the metadata. So basically it contains the encoder. So integrated help us to create a tokenizer that can tokenize. So our application is to predict good review from a bad review. So now we will create a model or that most of our code remains the same. As you can see, I have not used flattened function and have used the global average pooling 1D function. So basically what this does is it converts it into a one-dimensional array while reducing the number of parameter that depended on. So this will help us to reduce overfitting. As this dataset has a thousand different words, the embeddings will be huge, so therefore, having a flattened function will cause, will collapse to crash. So no, the British tried to predict term on this set of code is saying that we have binary knows entropy, Adam optimizer accuracy as a metric. And then we fit our model. Then we use this set of code. Boom, blood loss and accuracy. So this set of code is very important because it will help you to visualize that if you are suffering from over-fitting, underfitting easily and you can see how the progression goes and where the, where the graph ends up lactogen. So in the next lesson we'll see how to code this and how using subverts effect sub-classification. 10. Coding:Sub words: So in this lesson we'll see how subvert effect that a classifier and how some ports book. So this line will import that particular dataset, IMDB reviews. So instead of just importantly, IMDB reviews, we are importing the part which contains this subvert, that is the one that we saw in the previous lesson. I have linked to that particular GitHub page down below so you can see the different types for your study. As I mentioned in the previous lessons, if you haven't loaded that particular dataset inside their collab environment, you'll see some progress bus. So this will take some time to download. So it is not done loading insider colab environment. Now we can see how it works. So as you can see, once we print the tokenizer subverts, it has different words as well as capitalization and punctuation marks in the previous, in the previous lessons, we've worked with tokenizer, which did not consider these two things. Net is capitalization and punctuation marks. We just some words which basically mean that these words can be combined together to make a meaningful word. Some of these words make sense like in this and the tetra. But words like S, national makes sense. So we can see how this works in the next block of code. So I have a sample string. Enter flu is cool and awesome. Normally see how tokenizer books. In the previous lesson, if you remember, if we tokenize this word, we would have gotten around five values. You would have gotten five values. Each value corresponding to that particular word. So once we execute this line of code, as you can see, we don't have phi value, like the previous tokenizers views each coconut representing one would, in the previous tokenized, as we saw, we only got five values when we converted the sentence in a sequence. Now we can see we have got more than five tokens. Because this tokenizer works. Because this tokenizer works on some works. So it can create sequences using parts of sentences. So now this tokenizer might not have the word TensorFlow, but it can create that world using these numbers like ten. And it might have the word soul or flow, and then can create a meaningful words from this subvert. We'll see how it can do this in the next line of code. So now we can visualize how that sentence tokenized Exactly. So once we do this, we can see how it was tokenized. As I told earlier, it did not have the word tensor flow inside this vocabulary. So what did it do? It split those words in their respective sub word. So it had this avert ten. It had the word soar and kindness and good FL and o saw it. Divided that word into particular sub boards and then created a meaningful words with all those tokens. So this is extremely helpful because it ends up reducing the number of outer vocabulary tokens that we get. The next was is it already has insights vocabulary. So did not do dispirited. Next. It already had the word cool and awesome inside it, so did not need to split it. So it ends up splitting the words it does not have. Therefore, reducing the number of auto vocabulary tokens that we end up having. So now we just end up shuffling retaining dataset so that we do not get any patterns that might occur. So in the next block, we shuffle our dataset so that we do not have any patterns in our dataset. Then we end up padding our dataset using this function called as padded batch. We divide a large dataset into smaller batches so it's easier, easier to compute. And a bad sense, just type but, but I'm returned, which you can tune. So next we create a model. We do not use the flattened function because the number of words in our vocabulary is so large and the number of embeddings that IT might learn or the number of variables that it might learn. The so you would write will crash. We will call up the previous word embedding lessons, where I had forwards, apple, man, banana, and woman. I gave you four different variables or the four different embedding dimensions, right? So now we are having 64 M willing dimensions. If we had to classify those same forwards happen moving banana and men, instead of having just four different things like living, food, et cetera, we'll have 64 different things to classify from. Once we execute this, it will take some time to load. So in summary, as you can see, we have 64 different embodying diminutions from which our model can end up learning the features of the words. Statess, 64 different features for every single word. In this line of code. The first compiler modelled using binary cross entropy. Because we are still using a semicolon, we are still having binary classification, has a problem using the Adam optimizer. Then we start to fit our model using the training data and using the test data as validation data may only having ten nipples because you're only using ten epochs are. You can go on with higher number of e-books as well. This will take some time to compute because the load nimble parameters at about 500 thousand, so are more or less finished running. And we have gotten a test, and we had gotten painting accuracy of 94% and a test accuracy or validation accuracy of 87%, which is quite good for having for just ten epochs. You can always tune the parameters for getting better results. By addition, as well as for your training data. Means see how draining went on for each and every epoch. So now I will start to plot my data. As you can see, our accuracy for the training data is quite high. Medicine our test data has plateaued somewhere around 1887884 are lost. We can see that our training data has a really good or really low loss where as minute as our test manner desk loss is plateaued as well. So basically we have overfit the data. Again. In natural language processing, overfitting is an inevitable. There are a few things that we can do to prevent it. But from our previous lesson, from our previous model, we can see we have improved a lot. Whenever we create a deep learning and machine learning application, we will not have labels for that data. Villian to predict what is going on. So having a 100% accuracy on the training data will always cause a problem when we try to test the data on unseen information, all we need to do is try to reduce this gap. So congratulations, you've created two models where you can predict different tech and can analyze the sentiment behind them. So in the next lesson, we will discuss about their class project, and that will be our last lesson. 11. Class project: Welcome to your final technical lesson of this class. So you will build a sarcasm classifier as at last project. So your model should be able to predict between a sarcastic sentence and a non sarcastic sentence. So I want you guys to use the sarcasm JSON file that I used in the previous class, Natural Language Processing, to create a classifier that can predict class sarcasm, sarcastic, and non-psychiatric sentences. It's JSON file, so it will require a different set of core for processing, which I have mentioned in the previous class. So use that code to create a classifier and then share your model with your accuracy and our test sentence with the rest of the class. So I hope you guys enjoy doing this class project. 12. Wrap up: So congratulations on completing this class. So a quick summary before we wrap things up. So in this class we learned about word embedding and what word embeddings are and how word embeddings function. We also used how to use voids as input for a neural network. We also, we also created a model which can analyze 70 minutes until it can identify from a bad review to a good review. Sarcastic segments or non-psychiatric sentencing. You also learn something about subword tokenization. We did not talk about somewhat tokenization much in this class. But it will be a really important aspect in the next class, which is going to be or what RNNs, different type of neural networks specifically meant for voids, text and sentiment analysis. And if you guys are interested in deep learning, I have two other classes. One thing running image classification, when we classify different images. The next abort natural language processing, which is the prequel to this class, which I hope you have already taken. I request you all to share this class because you're interested people. And then the director, thank you guys once again for taking my class and I hope to see you in the next class. Thank you.