import  numpy as  np
import  tensorflow as  tf
from  tensorflow.keras .models  import  Sequential
from  tensorflow.keras .layers  import  Embedding,  SimpleRNN,  Dense
text =  "This is a sample text for language modeling using RNN." 
chars =  sorted ( set ( text) ) 
char_to_index =  { char: index for  index,  char in  enumerate ( chars) } 
index_to_char =  { index: char for  index,  char in  enumerate ( chars) } 
text_indices =  [ char_to_index[ char]  for  char in  text] 
seq_length, sequences, next_char =  20 , [ ] , [ ] 
for  i in  range ( 0 ,  len ( text_indices)  - seq_length) :
 sequences.append ( text_indices[ i : i + seq_length] ) 
 next_char.append ( text_indices[ i + seq_length] ) 
X =  np.array ( sequences) 
y =  np.array ( next_char) 
17 
model =  Sequential( [ Embedding( input_dim= len ( chars) ,  output_dim= 50 ,  input_length= seq_length) , SimpleRNN( 100 ,  return_sequences= False ) , Dense( len ( chars) ,  activation= "softmax" ) ] ) 
model.compile ( loss= "sparse_categorical_crossentropy" ,  optimizer= "adam" ) 
model.fit ( X,  y,  batch_size= 64 ,  epochs= 50 ) 
seed_text =  "This is a sample te" 
generated_text =  seed_text
num_chars_to_generate =  100 
for  _ in  range ( num_chars_to_generate) :
 seed_indices =  [ char_to_index[ char]  for  char in  seed_text] 
 
 if  len ( seed_indices)  <  seq_length:
     diff =  seq_length - len ( seed_indices) 
     seed_indices =  [ 0 ]  * diff + seed_indices
 
 seed_indices =  np.array ( seed_indices) .reshape ( 1 ,  -1 ) 
 next_index =  model.predict ( seed_indices) .argmax ( ) 
 next_char =  index_to_char[ next_index] 
 generated_text +=  next_char
 seed_text =  seed_text[ 1 :]  + next_char
print ( generated_text) 
 
				aW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCmZyb20gdGVuc29yZmxvdy5rZXJhcy5tb2RlbHMgaW1wb3J0IFNlcXVlbnRpYWwKZnJvbSB0ZW5zb3JmbG93LmtlcmFzLmxheWVycyBpbXBvcnQgRW1iZWRkaW5nLCBTaW1wbGVSTk4sIERlbnNlCnRleHQgPSAiVGhpcyBpcyBhIHNhbXBsZSB0ZXh0IGZvciBsYW5ndWFnZSBtb2RlbGluZyB1c2luZyBSTk4uIgpjaGFycyA9IHNvcnRlZChzZXQodGV4dCkpCmNoYXJfdG9faW5kZXggPSB7Y2hhcjogaW5kZXggZm9yIGluZGV4LCBjaGFyIGluIGVudW1lcmF0ZShjaGFycyl9CmluZGV4X3RvX2NoYXIgPSB7aW5kZXg6IGNoYXIgZm9yIGluZGV4LCBjaGFyIGluIGVudW1lcmF0ZShjaGFycyl9CnRleHRfaW5kaWNlcyA9IFtjaGFyX3RvX2luZGV4W2NoYXJdIGZvciBjaGFyIGluIHRleHRdCnNlcV9sZW5ndGgsc2VxdWVuY2VzLG5leHRfY2hhciA9IDIwLFtdLFtdCmZvciBpIGluIHJhbmdlKDAsIGxlbih0ZXh0X2luZGljZXMpIC0gc2VxX2xlbmd0aCk6CiBzZXF1ZW5jZXMuYXBwZW5kKHRleHRfaW5kaWNlc1tpIDogaSArIHNlcV9sZW5ndGhdKQogbmV4dF9jaGFyLmFwcGVuZCh0ZXh0X2luZGljZXNbaSArIHNlcV9sZW5ndGhdKQpYID0gbnAuYXJyYXkoc2VxdWVuY2VzKQp5ID0gbnAuYXJyYXkobmV4dF9jaGFyKQoxNwptb2RlbCA9IFNlcXVlbnRpYWwoW0VtYmVkZGluZyhpbnB1dF9kaW09bGVuKGNoYXJzKSwgb3V0cHV0X2RpbT01MCwgaW5wdXRfbGVuZ3RoPXNlcV9sZW5ndGgpLFNpbXBsZVJOTigxMDAsIHJldHVybl9zZXF1ZW5jZXM9RmFsc2UpLERlbnNlKGxlbihjaGFycyksIGFjdGl2YXRpb249InNvZnRtYXgiKV0pCm1vZGVsLmNvbXBpbGUobG9zcz0ic3BhcnNlX2NhdGVnb3JpY2FsX2Nyb3NzZW50cm9weSIsIG9wdGltaXplcj0iYWRhbSIpCm1vZGVsLmZpdChYLCB5LCBiYXRjaF9zaXplPTY0LCBlcG9jaHM9NTApCnNlZWRfdGV4dCA9ICJUaGlzIGlzIGEgc2FtcGxlIHRlIgpnZW5lcmF0ZWRfdGV4dCA9IHNlZWRfdGV4dApudW1fY2hhcnNfdG9fZ2VuZXJhdGUgPSAxMDAKZm9yIF8gaW4gcmFuZ2UobnVtX2NoYXJzX3RvX2dlbmVyYXRlKToKIHNlZWRfaW5kaWNlcyA9IFtjaGFyX3RvX2luZGV4W2NoYXJdIGZvciBjaGFyIGluIHNlZWRfdGV4dF0KCiBpZiBsZW4oc2VlZF9pbmRpY2VzKSA8IHNlcV9sZW5ndGg6CiAgICAgZGlmZiA9IHNlcV9sZW5ndGggLSBsZW4oc2VlZF9pbmRpY2VzKQogICAgIHNlZWRfaW5kaWNlcyA9IFswXSAqIGRpZmYgKyBzZWVkX2luZGljZXMKCiBzZWVkX2luZGljZXMgPSBucC5hcnJheShzZWVkX2luZGljZXMpLnJlc2hhcGUoMSwgLTEpCiBuZXh0X2luZGV4ID0gbW9kZWwucHJlZGljdChzZWVkX2luZGljZXMpLmFyZ21heCgpCiBuZXh0X2NoYXIgPSBpbmRleF90b19jaGFyW25leHRfaW5kZXhdCiBnZW5lcmF0ZWRfdGV4dCArPSBuZXh0X2NoYXIKIHNlZWRfdGV4dCA9IHNlZWRfdGV4dFsxOl0gKyBuZXh0X2NoYXIKcHJpbnQoZ2VuZXJhdGVkX3RleHQp