TF পাঠ্যের সাথে টোকেনাইজিং

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub এ দেখুন নোটবুক ডাউনলোড করুন TF হাব মডেল দেখুন

ওভারভিউ

টোকেনাইজেশন হল একটি স্ট্রিংকে টোকেনে বিভক্ত করার প্রক্রিয়া। সাধারণত, এই টোকেনগুলি হল শব্দ, সংখ্যা এবং/অথবা বিরাম চিহ্ন। tensorflow_text প্যাকেজ টেক্সট preprocessing জন্য উপলব্ধ tokenizers একটি নম্বর আপনার পাঠ্য-ভিত্তিক মডেলের জন্য প্রয়োজনীয় প্রদান করে। টেনসরফ্লো গ্রাফে টোকেনাইজেশন সম্পাদন করার মাধ্যমে, আপনাকে প্রশিক্ষণ এবং অনুমান ওয়ার্কফ্লো এবং প্রিপ্রসেসিং স্ক্রিপ্ট পরিচালনার মধ্যে পার্থক্য সম্পর্কে চিন্তা করতে হবে না।

এই নির্দেশিকাটি টেনসরফ্লো টেক্সট দ্বারা প্রদত্ত অনেকগুলি টোকেনাইজেশন বিকল্প নিয়ে আলোচনা করে, যখন আপনি একটি বিকল্পের উপর অন্যটি ব্যবহার করতে চান এবং কীভাবে এই টোকেনাইজারগুলিকে আপনার মডেলের মধ্যে থেকে ডাকা হয়।

সেটআপ

pip install -q tensorflow-text
import requests
import tensorflow as tf
import tensorflow_text as tf_text

স্প্লিটার API

প্রধান ইন্টারফেস হয় Splitter এবং SplitterWithOffsets যা একক পদ্ধতি আছে split এবং split_with_offsetsSplitterWithOffsets বৈকল্পিক (যা প্রসারিত Splitter ) বাইট অফসেট পাবার জন্য একটি বিকল্প অন্তর্ভুক্ত করা হয়েছে। এটি কলকারীকে জানতে দেয় যে তৈরি করা টোকেনটি আসল স্ট্রিংয়ের কোন বাইট থেকে তৈরি করা হয়েছে।

Tokenizer এবং TokenizerWithOffsets এর বিশেষ সংস্করণ Splitter যে সুবিধা পদ্ধতি প্রদান tokenize এবং tokenize_with_offsets যথাক্রমে।

সাধারণত, কোনো এন-মাত্রিক ইনপুট জন্য, ফিরে টোকেন একটি n + 1-মাত্রিক হয় RaggedTensor মূল পৃথক স্ট্রিং ম্যাপিং টোকেন ভেতরের-পূর্বের মাত্রা সঙ্গে।

class Splitter {
  @abstractmethod
  def split(self, input)
}

class SplitterWithOffsets(Splitter) {
  @abstractmethod
  def split_with_offsets(self, input)
}

এখানে একটা হয় Detokenizer ইন্টারফেস। এই ইন্টারফেসটি বাস্তবায়নকারী যেকোন টোকেনাইজার টোকেনের একটি N-মাত্রিক র‍্যাগড টেনসর গ্রহণ করতে পারে এবং সাধারণত একটি N-1-মাত্রিক টেনসর বা র্যাগড টেনসর প্রদান করে যাতে প্রদত্ত টোকেনগুলি একসাথে একত্রিত হয়।

class Detokenizer {
  @abstractmethod
  def detokenize(self, input)
}

টোকেনাইজার

নীচে টেনসরফ্লো টেক্সট দ্বারা প্রদত্ত টোকেনাইজারগুলির স্যুট রয়েছে৷ স্ট্রিং ইনপুট UTF-8 বলে ধরে নেওয়া হয়। দয়া করে পর্যালোচনা করুন ইউনিকোড নির্দেশিকা UTF-8- স্ট্রিং রূপান্তরের জন্য।

পুরো শব্দ টোকেনাইজার

এই টোকেনাইজারগুলি শব্দ দ্বারা একটি স্ট্রিংকে বিভক্ত করার চেষ্টা করে এবং এটি পাঠ্যকে বিভক্ত করার সবচেয়ে স্বজ্ঞাত উপায়।

হোয়াইটস্পেস টোকেনাইজার

text.WhitespaceTokenizer সবচেয়ে মৌলিক tokenizer যা (যেমন। স্থান, ট্যাব, নতুন লাইন) আইসিইউ সংজ্ঞায়িত হোয়াইটস্পেস অক্ষর উপর স্ট্রিং splits হয়। এটি প্রায়শই দ্রুত প্রোটোটাইপ মডেল তৈরি করার জন্য ভাল।

tokenizer = tf_text.WhitespaceTokenizer()
tokens = tokenizer.tokenize(["What you know you can't explain, but you feel it."])
print(tokens.to_list())
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/util/dispatch.py:206: batch_gather (from tensorflow.python.ops.array_ops) is deprecated and will be removed after 2017-10-25.
Instructions for updating:
`tf.batch_gather` is deprecated, please use `tf.gather` with `batch_dims=-1` instead.
[[b'What', b'you', b'know', b'you', b"can't", b'explain,', b'but', b'you', b'feel', b'it.']]

আপনি এই টোকেনাইজারের একটি ঘাটতি লক্ষ্য করতে পারেন যে একটি টোকেন তৈরি করার জন্য শব্দের সাথে যতিচিহ্ন অন্তর্ভুক্ত করা হয়েছে। শব্দ এবং পৃথক টোকেন মধ্যে যতিচিহ্ন বিভক্ত করার জন্য, UnicodeScriptTokenizer ব্যবহার করা উচিত।

ইউনিকোডস্ক্রিপ্ট টোকেনাইজার

UnicodeScriptTokenizer ইউনিকোড স্ক্রিপ্ট গণ্ডি উপর ভিত্তি করে স্ট্রিং splits। ব্যবহৃত স্ক্রিপ্ট কোডগুলি ইন্টারন্যাশনাল কম্পোনেন্ট ফর ইউনিকোড (ICU) UScriptCode মানগুলির সাথে মিলে যায়। দেখুন: http://icu-project.org/apiref/icu4c/uscript_8h.html

বাস্তবে, এই অনুরূপ WhitespaceTokenizer সবচেয়ে আপাত পার্থক্য হচ্ছে যে এটা ভাষা গ্রন্থে (যেমন। USCRIPT_LATIN, USCRIPT_CYRILLIC, ইত্যাদি) পাশাপাশি একে অপরের থেকে ভাষা গ্রন্থে পৃথক থেকে যতিচিহ্ন (USCRIPT_COMMON) স্প্লিট হবে। মনে রাখবেন এটি সংকোচন শব্দগুলিকে পৃথক টোকেনে বিভক্ত করবে।

tokenizer = tf_text.UnicodeScriptTokenizer()
tokens = tokenizer.tokenize(["What you know you can't explain, but you feel it."])
print(tokens.to_list())
[[b'What', b'you', b'know', b'you', b'can', b"'", b't', b'explain', b',', b'but', b'you', b'feel', b'it', b'.']]

সাবওয়ার্ড টোকেনাইজার

সাবওয়ার্ড টোকেনাইজারগুলি একটি ছোট শব্দভান্ডারের সাথে ব্যবহার করা যেতে পারে এবং মডেলটিকে এটি তৈরি করে এমন সাবওয়ার্ডগুলি থেকে অভিনব শব্দ সম্পর্কে কিছু তথ্য থাকতে দেয়।

আমরা সংক্ষেপে নিচে Subword tokenization অপশন নিয়ে আলোচনা, কিন্তু Subword Tokenization টিউটোরিয়াল গভীরতা আরও যায় এবং কীভাবে vocab ফাইল তৈরি করতে।

Wordpiece Tokenizer

WordPiece টোকেনাইজেশন একটি ডেটা-চালিত টোকেনাইজেশন স্কিম যা সাব-টোকেনের একটি সেট তৈরি করে। এই সাব টোকেনগুলি ভাষাগত মরফিমের সাথে সঙ্গতিপূর্ণ হতে পারে, তবে এটি প্রায়শই হয় না।

WordpieceTokenizer আশা করে যে ইনপুট ইতিমধ্যেই টোকেনে বিভক্ত হবে। এই পূর্বশর্ত কারণে, আপনি প্রায়ই ব্যবহার বিভক্ত করতে চান হবে WhitespaceTokenizer বা UnicodeScriptTokenizer পূর্বেই।

tokenizer = tf_text.WhitespaceTokenizer()
tokens = tokenizer.tokenize(["What you know you can't explain, but you feel it."])
print(tokens.to_list())
[[b'What', b'you', b'know', b'you', b"can't", b'explain,', b'but', b'you', b'feel', b'it.']]

পরে স্ট্রিং টোকেন বিভক্ত করা হয়, WordpieceTokenizer subtokens বিভক্ত করার জন্য ব্যবহার করা যেতে পারে।

url = "https://github.com/tensorflow/text/blob/master/tensorflow_text/python/ops/test_data/test_wp_en_vocab.txt?raw=true"
r = requests.get(url)
filepath = "vocab.txt"
open(filepath, 'wb').write(r.content)
52382
subtokenizer = tf_text.UnicodeScriptTokenizer(filepath)
subtokens = tokenizer.tokenize(tokens)
print(subtokens.to_list())
[[[b'What'], [b'you'], [b'know'], [b'you'], [b"can't"], [b'explain,'], [b'but'], [b'you'], [b'feel'], [b'it.']]]

বার্টটোকেনাইজার

BertTokenizer BERT কাগজ থেকে টোকেনাইজেশনের মূল বাস্তবায়নকে প্রতিফলিত করে। এটি WordpieceTokenizer দ্বারা সমর্থিত, তবে শব্দগুলিকে প্রথমে স্বাভাবিককরণ এবং টোকেনাইজ করার মতো অতিরিক্ত কাজগুলিও সম্পাদন করে৷

tokenizer = tf_text.BertTokenizer(filepath, token_out_type=tf.string, lower_case=True)
tokens = tokenizer.tokenize(["What you know you can't explain, but you feel it."])
print(tokens.to_list())
[[[b'what'], [b'you'], [b'know'], [b'you'], [b'can'], [b"'"], [b't'], [b'explain'], [b','], [b'but'], [b'you'], [b'feel'], [b'it'], [b'.']]]

সেন্টেন্সপিস টোকেনাইজার

সেন্টেন্সপিস টোকেনাইজার হল একটি সাব-টোকেন টোকেনাইজার যা অত্যন্ত কনফিগারযোগ্য। এটি সেন্টেন্সপিস লাইব্রেরি দ্বারা সমর্থিত। BertTokenizer এর মতো, এটি সাব-টোকেনে বিভক্ত হওয়ার আগে স্বাভাবিককরণ এবং টোকেন বিভাজন অন্তর্ভুক্ত করতে পারে।

url = "https://github.com/tensorflow/text/blob/master/tensorflow_text/python/ops/test_data/test_oss_model.model?raw=true"
sp_model = requests.get(url).content
tokenizer = tf_text.SentencepieceTokenizer(sp_model, out_type=tf.string)
tokens = tokenizer.tokenize(["What you know you can't explain, but you feel it."])
print(tokens.to_list())
[[b'\xe2\x96\x81What', b'\xe2\x96\x81you', b'\xe2\x96\x81know', b'\xe2\x96\x81you', b'\xe2\x96\x81can', b"'", b't', b'\xe2\x96\x81explain', b',', b'\xe2\x96\x81but', b'\xe2\x96\x81you', b'\xe2\x96\x81feel', b'\xe2\x96\x81it', b'.']]

অন্যান্য splitters

UnicodeCharTokenizer

এটি একটি স্ট্রিংকে UTF-8 অক্ষরে বিভক্ত করে। এটি CJK ভাষাগুলির জন্য দরকারী যেগুলির শব্দগুলির মধ্যে ফাঁকা নেই৷

tokenizer = tf_text.UnicodeCharTokenizer()
tokens = tokenizer.tokenize(["What you know you can't explain, but you feel it."])
print(tokens.to_list())
[[87, 104, 97, 116, 32, 121, 111, 117, 32, 107, 110, 111, 119, 32, 121, 111, 117, 32, 99, 97, 110, 39, 116, 32, 101, 120, 112, 108, 97, 105, 110, 44, 32, 98, 117, 116, 32, 121, 111, 117, 32, 102, 101, 101, 108, 32, 105, 116, 46]]

আউটপুট হল ইউনিকোড কোডপয়েন্ট। এটি বিগগ্রামের মতো অক্ষর এনগ্রাম তৈরির জন্যও কার্যকর হতে পারে। UTF-8 অক্ষরে আবার রূপান্তর করতে।

characters = tf.strings.unicode_encode(tf.expand_dims(tokens, -1), "UTF-8")
bigrams = tf_text.ngrams(characters, 2, reduction_type=tf_text.Reduction.STRING_JOIN, string_separator='')
print(bigrams.to_list())
[[b'Wh', b'ha', b'at', b't ', b' y', b'yo', b'ou', b'u ', b' k', b'kn', b'no', b'ow', b'w ', b' y', b'yo', b'ou', b'u ', b' c', b'ca', b'an', b"n'", b"'t", b't ', b' e', b'ex', b'xp', b'pl', b'la', b'ai', b'in', b'n,', b', ', b' b', b'bu', b'ut', b't ', b' y', b'yo', b'ou', b'u ', b' f', b'fe', b'ee', b'el', b'l ', b' i', b'it', b't.']]

হাবমডিউল টোকেনাইজার

এটি টিএফ হাব-এ মোতায়েন করা মডেলগুলির চারপাশে একটি মোড়ক যা কলগুলিকে সহজ করতে কারণ TF হাব বর্তমানে র্যাগড টেনসর সমর্থন করে না। একটি মডেল সঞ্চালন টোকেনাইজেশন সিজেকে ভাষার জন্য বিশেষভাবে উপযোগী যখন আপনি শব্দে বিভক্ত করতে চান, কিন্তু একটি হিউরিস্টিক গাইড প্রদান করার জন্য স্পেস নেই। এই সময়ে, আমাদের কাছে চীনাদের জন্য একটি একক সেগমেন্টেশন মডেল রয়েছে।

MODEL_HANDLE = "https://tfhub.dev/google/zh_segmentation/1"
segmenter = tf_text.HubModuleTokenizer(MODEL_HANDLE)
tokens = segmenter.tokenize(["新华社北京"])
print(tokens.to_list())
[[b'\xe6\x96\xb0\xe5\x8d\x8e\xe7\xa4\xbe', b'\xe5\x8c\x97\xe4\xba\xac']]

UTF-8 এনকোড করা বাইট স্ট্রিং-এর ফলাফল দেখা কঠিন হতে পারে। দেখতে সহজ করতে তালিকার মানগুলি ডিকোড করুন৷

def decode_list(x):
  if type(x) is list:
    return list(map(decode_list, x))
  return x.decode("UTF-8")

def decode_utf8_tensor(x):
  return list(map(decode_list, x.to_list()))

print(decode_utf8_tensor(tokens))
[['新华社', '北京']]

SplitMergeTokenizer

SplitMergeTokenizer & SplitMergeFromLogitsTokenizer উল্লিখিত মানগুলি যে ইঙ্গিত যেখানে স্ট্রিং বিভক্ত হওয়া উচিত উপর ভিত্তি করে বিভাজন একটি লক্ষ্যবস্তু উদ্দেশ্য একটি স্ট্রিং আছে। পূর্ববর্তী সেগমেন্টেশন উদাহরণের মতো আপনার নিজস্ব সেগমেন্টেশন মডেল তৈরি করার সময় এটি কার্যকর।

জন্য SplitMergeTokenizer , 0 এর একটি মান একটি নতুন স্ট্রিং এর শুরু ইঙ্গিত ব্যবহার করা হয়, এবং 1 এর মান নির্দেশ করে চরিত্র বর্তমান স্ট্রিং এর অংশ।

strings = ["新华社北京"]
labels = [[0, 1, 1, 0, 1]]
tokenizer = tf_text.SplitMergeTokenizer()
tokens = tokenizer.tokenize(strings, labels)
print(decode_utf8_tensor(tokens))
[['新华社', '北京']]

SplitMergeFromLogitsTokenizer অনুরূপ, কিন্তু এটা পরিবর্তে একটি স্নায়ুর নেটওয়ার্ক ভবিষ্যদ্বাণী করা যে যদি প্রতিটি অক্ষর একটি নতুন স্ট্রিং বিভক্ত করা বা বর্তমান এক মধ্যে মিশে গিয়ে তৈরি থেকে logit মান জোড়া স্বীকার করে।

strings = [["新华社北京"]]
labels = [[[5.0, -3.2], [0.2, 12.0], [0.0, 11.0], [2.2, -1.0], [-3.0, 3.0]]]
tokenizer = tf_text.SplitMergeFromLogitsTokenizer()
tokenizer.tokenize(strings, labels)
print(decode_utf8_tensor(tokens))
[['新华社', '北京']]

RegexSplitter

RegexSplitter একটি প্রদত্ত রেগুলার এক্সপ্রেশন দ্বারা সংজ্ঞায়িত নির্বিচারে ব্রেকপয়েন্ট এ সেগমেন্ট স্ট্রিং করতে সক্ষম হয়।

splitter = tf_text.RegexSplitter("\s")
tokens = splitter.split(["What you know you can't explain, but you feel it."], )
print(tokens.to_list())
[[b'What', b'you', b'know', b'you', b"can't", b'explain,', b'but', b'you', b'feel', b'it.']]

অফসেট

স্ট্রিংগুলিকে টোকেনাইজ করার সময়, এটি প্রায়ই জানতে চাওয়া হয় যে মূল স্ট্রিংটিতে টোকেনটি কোথা থেকে এসেছে। এই কারণে, প্রতিটি tokenizer যা কার্যকরী জন্য TokenizerWithOffsets একটি tokenize_with_offsets পদ্ধতি যা টোকেন সহ বাইট অফসেট ফিরে আসবে হয়েছে। স্টার্ট_অফসেট প্রতিটি টোকেন যেখান থেকে শুরু হয় মূল স্ট্রিং-এ বাইটগুলির তালিকা করে এবং প্রতিটি টোকেন শেষ হওয়ার পরপরই শেষ_অফসেটগুলি বাইটগুলির তালিকা করে। রিফ্রেস করার জন্য, শুরুর অফসেটগুলি অন্তর্ভুক্ত এবং শেষ অফসেটগুলি একচেটিয়া৷

tokenizer = tf_text.UnicodeScriptTokenizer()
(tokens, start_offsets, end_offsets) = tokenizer.tokenize_with_offsets(['Everything not saved will be lost.'])
print(tokens.to_list())
print(start_offsets.to_list())
print(end_offsets.to_list())
[[b'Everything', b'not', b'saved', b'will', b'be', b'lost', b'.']]
[[0, 11, 15, 21, 26, 29, 33]]
[[10, 14, 20, 25, 28, 33, 34]]

ডিটোকেনাইজেশন

Tokenizers যা বাস্তবায়ন Detokenizer একটি প্রদান detokenize পদ্ধতি যা স্ট্রিং একত্রিত করতে প্রচেষ্টা করা হয়েছে। এটি ক্ষতিকারক হওয়ার সম্ভাবনা রয়েছে, তাই ডিটোকেনাইজড স্ট্রিং সর্বদা আসল, প্রাক-টোকেনাইজড স্ট্রিংয়ের সাথে ঠিক মেলে না।

tokenizer = tf_text.UnicodeCharTokenizer()
tokens = tokenizer.tokenize(["What you know you can't explain, but you feel it."])
print(tokens.to_list())
strings = tokenizer.detokenize(tokens)
print(strings.numpy())
[[87, 104, 97, 116, 32, 121, 111, 117, 32, 107, 110, 111, 119, 32, 121, 111, 117, 32, 99, 97, 110, 39, 116, 32, 101, 120, 112, 108, 97, 105, 110, 44, 32, 98, 117, 116, 32, 121, 111, 117, 32, 102, 101, 101, 108, 32, 105, 116, 46]]
[b"What you know you can't explain, but you feel it."]

TF ডেটা

প্রশিক্ষণ মডেলের জন্য একটি ইনপুট পাইপলাইন তৈরি করার জন্য TF ডেটা একটি শক্তিশালী API। টোকেনাইজাররা API এর সাথে প্রত্যাশিতভাবে কাজ করে।

docs = tf.data.Dataset.from_tensor_slices([['Never tell me the odds.'], ["It's a trap!"]])
tokenizer = tf_text.WhitespaceTokenizer()
tokenized_docs = docs.map(lambda x: tokenizer.tokenize(x))
iterator = iter(tokenized_docs)
print(next(iterator).to_list())
print(next(iterator).to_list())
[[b'Never', b'tell', b'me', b'the', b'odds.']]
[[b"It's", b'a', b'trap!']]