What does Keras Tokenizer method exactly do?

前端 未结 3 1172
别跟我提以往
别跟我提以往 2021-01-30 00:35

On occasion, circumstances require us to do the following:

from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer(num_words=my_max)
相关标签:
3条回答
  • 2021-01-30 01:10

    Lets see what this line of code does.

    tokenizer.fit_on_texts(text)

    For example, consider the sentence " The earth is an awesome place live"

    tokenizer.fit_on_texts("The earth is an awesome place live") fits [[1,2,3,4,5,6,7]] where 3 -> "is" , 6 -> "place", so on.

    sequences = tokenizer.texts_to_sequences("The earth is an great place live")
    

    returns [[1,2,3,4,6,7]].

    You see what happened here. The word "great" is not fit initially, so it does not recognize the word "great". Meaning, fit_on_text can be used independently on train data and then the fitted vocabulary index can be used to represent a completely new set of word sequence. These are two different processes. Hence the two lines of code.

    0 讨论(0)
  • 2021-01-30 01:14

    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.

    0 讨论(0)
  • 2021-01-30 01:28

    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}
    
    0 讨论(0)
提交回复
热议问题