Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does Keras Tokenizer method exactly do?

Tags:

python

nlp

keras

On occasion, circumstances require us to do the following:

from keras.preprocessing.text import Tokenizer tokenizer = Tokenizer(num_words=my_max) 

Then, invariably, we chant this mantra:

tokenizer.fit_on_texts(text)  sequences = tokenizer.texts_to_sequences(text) 

While I (more or less) understand what the total effect is, I can't figure out what each one does separately, regardless of how much research I do (including, obviously, the documentation). I don't think I've ever seen one without the other.

So what does each do? Are there any circumstances where you would use either one without the other? If not, why aren't they simply combined into something like:

sequences = tokenizer.fit_on_texts_to_sequences(text) 

Apologies if I'm missing something obvious, but I'm pretty new at this.

like image 319
Jack Fleeting Avatar asked Aug 21 '18 20:08

Jack Fleeting


People also ask

What does Tokenizer do in Tensorflow?

Transforms each text in texts to a sequence of integers. Each item in texts can also be a list, in which case we assume each item of that list to be a token. Only top num_words-1 most frequent words will be taken into account. Only words known by the tokenizer will be taken into account.

How does a Tokenizer work?

Tokenization works by removing the valuable data from your environment and replacing it with these tokens. Most businesses hold at least some sensitive data within their systems, whether it be credit card data, medical information, Social Security numbers, or anything else that requires security and protection.

What is a Tokenizer in Python?

The tokenize module provides a lexical scanner for Python source code, implemented in Python. The scanner in this module returns comments as tokens as well, making it useful for implementing “pretty-printers”, including colorizers for on-screen displays.


2 Answers

From the source code:

  1. fit_on_texts Updates internal vocabulary based on a list of texts. This method creates the vocabulary index based on word frequency. So if you give it something like, "The cat sat on the mat." It will create a dictionary s.t. word_index["the"] = 1; word_index["cat"] = 2 it is word -> index dictionary so every word gets a unique integer value. 0 is reserved for padding. So lower integer means more frequent word (often the first few are stop words because they appear a lot).
  2. texts_to_sequences Transforms each text in texts to a sequence of integers. So it basically takes each word in the text and replaces it with its corresponding integer value from the word_index dictionary. Nothing more, nothing less, certainly no magic involved.

Why don't combine them? Because you almost always fit once and convert to sequences many times. You will fit on your training corpus once and use that exact same word_index dictionary at train / eval / testing / prediction time to convert actual text into sequences to feed them to the network. So it makes sense to keep those methods separate.

like image 83
nuric Avatar answered Sep 18 '22 11:09

nuric


Adding more to above answers with examples will help in better understanding:

Example 1:

t  = Tokenizer() fit_text = "The earth is an awesome place live" t.fit_on_texts(fit_text) test_text = "The earth is an great place live" sequences = t.texts_to_sequences(test_text)  print("sequences : ",sequences,'\n')  print("word_index : ",t.word_index) #[] specifies : 1. space b/w the words in the test_text    2. letters that have not occured in fit_text  Output :         sequences :  [[3], [4], [1], [], [1], [2], [8], [3], [4], [], [5], [6], [], [2], [9], [], [], [8], [1], [2], [3], [], [13], [7], [2], [14], [1], [], [7], [5], [15], [1]]          word_index :  {'e': 1, 'a': 2, 't': 3, 'h': 4, 'i': 5, 's': 6, 'l': 7, 'r': 8, 'n': 9, 'w': 10, 'o': 11, 'm': 12, 'p': 13, 'c': 14, 'v': 15} 

Example 2:

t  = Tokenizer() fit_text = ["The earth is an awesome place live"] t.fit_on_texts(fit_text)  #fit_on_texts fits on sentences when list of sentences is passed to fit_on_texts() function.  #ie - fit_on_texts( [ sent1, sent2, sent3,....sentN ] )  #Similarly, list of sentences/single sentence in a list must be passed into texts_to_sequences. test_text1 = "The earth is an great place live" test_text2 = "The is my program" sequences = t.texts_to_sequences([test_text1, test_text2])  print('sequences : ',sequences,'\n')  print('word_index : ',t.word_index) #texts_to_sequences() returns list of list. ie - [ [] ]  Output:          sequences :  [[1, 2, 3, 4, 6, 7], [1, 3]]           word_index :  {'the': 1, 'earth': 2, 'is': 3, 'an': 4, 'awesome': 5, 'place': 6, 'live': 7} 
like image 43
ajaysinghnegi Avatar answered Sep 22 '22 11:09

ajaysinghnegi