<jupyter_start><jupyter_text>আউট অফ ভোকাবুলারি টোকেন এবং প্যাড সিকোয়েন্স আগের উদাহরণে কী দেখলাম? ওয়ার্ড ইনডেক্সে না থাকলে সেই শব্দটা 'মিসিং' থাকছে। এটা কী ঠিক হলো? ওয়ার্ড ইন্ডেক্স অর্থাৎ কর্পাসে শব্দগুলো থাকলে তখনই সে আমাদের জানাবে - নাহলে সেই শব্দটা মিসিং হয়ে থাকবে। এটাতো কোনো ভালো ডিজাইন হতে পারে না। আমরা যদি কর্পাসে যেসব শব্দ থাকবে না সেগুলোকে ‘আউট অফ ভোকাবুলারি’ (OOV) হিসেবে বলে দিলে যে শব্দগুলো ‘ওয়ার্ড ইন্ডেক্সে অর্থাৎ কর্পাসে থাকবে না - তাদেরকে ‘আউট অফ ভোকাবুলারি’ হিসেবে ডিক্লেয়ার করবে। আবার দেখি নিচের উদাহরণ।<jupyter_code>from tensorflow.keras.preprocessing.text import Tokenizer

sentences = [
    'আমি ভালবাসি বই পড়তে,',
    'আমি ভালবাসি বই লিখতে!',
    'বইমেলা এলে আমি প্রচুর বই কিনি',
    'এইবার বইমেলায় আমার সাথে তুমি কি যাবে?'
]<jupyter_output><empty_output><jupyter_text>এবার আমরা একটু সাবধান হলাম। আমাদের টোকেনাইজারে নতুন একটা প্যারামিটার ব্যবহার করছি ‘আউট অফ ভোকাবুলারি’ শব্দগুলোর জন্য - যাতে যে শব্দগুলো ওয়ার্ল্ড ইনডেক্সে থাকবে না তাদেরকে যাতে কোনভাবে শনাক্ত করা যায়। এটাতো কম্পিউটারের জন্য সমস্যা হবার কথা না।আমাদের ‘আউট অফ ভোকাবুলারি’ টোকেন ```oov_token=""```, মনে থাকবে তো?tf.keras.preprocessing.text.Tokenizer হচ্ছে একটা ইউটিলিটি ক্লাস। তার কাজ হচ্ছে একটা টেক্সট কর্পাসকে ভেক্টরাইজ করা। এই টোকেনের কোএফিসিয়েন্ট বাইনারি হয় ওয়ার্ড কাউন্টের ওপরে যা আসে টার্ম ফ্রিকুয়েন্সি - ইনভার্স ডকুমেন্ট ফ্রিকুয়েন্সি থেকে। গুগল করে দেখুন TF-IDF - এর অর্থ কিভাবে একটা শব্দ সেই ডকুমেন্টের সাথে সম্পর্কিত হতে পারে তার একটা পরিসংখ্যান। এখানে দুটো ম্যাট্রিক্স গুন করা হয়। একটা শব্দ কতবার সেই ডকুমেন্টে আছে এবং তার সাথে সেই শব্দটির ফ্রিকোয়েন্সি আরো কত ডকুমেন্টে আছে সেটার একটা ইনভার্স ক্যালকুলেশন। এটা নিয়ে এতো মাথা ঘামানোর দরকার নেই।এর ফরম্যাট দেখুন নিচে,```tf.keras.preprocessing.text.Tokenizer(    num_words=None,    filters='!"$%&()*+,-./:;?@[\\]^_`{|}~\t\n',    lower=True,    split=" ",    char_level=False,    oov_token=None,    document_count=0,    **kwargs)```সেখানে oov_token হিসেবে কিছু একটা দিচ্ছি।<jupyter_code>tokenizer = Tokenizer(num_words = 100, oov_token="<OOV>")
tokenizer.fit_on_texts(sentences)
word_index = tokenizer.word_index

sequences = tokenizer.texts_to_sequences(sentences)<jupyter_output><empty_output><jupyter_text>টোকেন ```oov_token="" ```দেয়া মানে হচ্ছে এটা ওয়ার্ড ইনডেক্সে যোগ হয়ে যাবে, মিসিং না দেখিয়ে যখনই একটা শব্দকে সে পাবে না সেখানে ওয়ার্ড ইনডেক্সে যেই ভ্যালু দেখাবে - প্রতিবার সেটাই আসবে। একেবারে নাই মামা থেকে কানা মামা ভালো।<jupyter_code>from tensorflow.keras.preprocessing.sequence import pad_sequences

padded = pad_sequences(sequences, maxlen=8)
print("ওয়ার্ড ইনডেক্স = " , word_index)
print("\nসিকোয়েন্স = " , sequences)
print("\n'০' দিয়ে প্যাডিং দেয়া সিকোয়েন্স:")
print(padded)<jupyter_output>ওয়ার্ড ইনডেক্স =  {'<OOV>': 1, 'আমি': 2, 'বই': 3, 'ভালবাসি': 4, 'পড়তে': 5, 'লিখতে': 6, 'বইমেলা': 7, 'এলে': 8, 'প্রচুর': 9, 'কিনি': 10, 'এইবার': 11, 'বইমেলায়': 12, 'আমার': 13, 'সাথে': 14, 'তুমি': 15, 'কি': 16, 'যাবে': 17}

সিকোয়েন্স =  [[2, 4, 3, 5], [2, 4, 3, 6], [7, 8, 2, 9, 3, 10], [11, 12, 13, 14, 15, 16, 17]]

'০' দিয়ে প্যাডিং দেয়া সিকোয়েন্স:
[[ 0  0  0  0  2  4  3  5]
 [ 0  0  0  0  2  4  3  6]
 [ 0  0  7  8  2  9  3 10]
 [ 0 11 12 13 14 15 16 17]]<jupyter_text>এখানে ওয়ার্ড ইনডেক্স =  ```{'': 1} ```এর মানে হচ্ছে এখন থেকে কোন আউট অফ ভোকাবুলারি অর্থাৎ মিসিং শব্দগুলো ১ হিসেবে দেখাবে। এটা একটা ভালো দিক। ![alt text](https://github.com/raqueeb/nlp_bangla/raw/master/assets/n1.png)উপরের ছবিতে পুরো কর্পাসের সিকোয়েন্স প্রিন্ট করে কী দেখছি? কোন ১ নেই।<jupyter_code># আমরা নতুন কিছু শব্দ ব্যবহার করি যেটা আমাদের টোকেনাইজারকে ফিট করা হয়নি
test_data = [
    'আমি আসলেই ভালবাসি বই পড়তে',
    'বইমেলায় এবার প্রচুর নতুন বই এসেছে!'
]<jupyter_output><empty_output><jupyter_text>এখানে দেখুন, test_dataতে যে শব্দগুলো ব্যবহার করা হয়েছে সেখানে নিচের শব্দগুলো নেই। ![alt text](https://github.com/raqueeb/nlp_bangla/raw/master/assets/n2.png)সেখানে কী আসবে? অবশ্যই ১।<jupyter_code>test_seq = tokenizer.texts_to_sequences(test_data)
print("টেস্ট সিকোয়েন্স = ", test_seq)

padded = pad_sequences(test_seq, maxlen=8)
print("\nপ্যাডিং দেয়া টেস্ট সিকোয়েন্স: ")
print(padded)<jupyter_output>টেস্ট সিকোয়েন্স =  [[2, 1, 4, 3, 5], [12, 1, 9, 1, 3, 1]]

প্যাডিং দেয়া টেস্ট সিকোয়েন্স: 
[[ 0  0  0  2  1  4  3  5]
 [ 0  0 12  1  9  1  3  1]]
{'fraction_non_alphanumeric': 0.284823783265404, 'fraction_numerical': 0.032845840326060895, 'mean_word_length': 4.876056338028169, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 21, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '247600', 'license': 'MIT', 'n_tokens_mistral': 3522, 'n_tokens_neox': 4086, 'n_words': 520, 'path': 'Chap_5_oov_token_pad_sequences.ipynb', 'repo_name': 'BbillahrariBBr/nlp_bangla', 'size': '4171'}