This page was translated by the Cloud Translation API.
Switch to English

ইউনিকোড স্ট্রিং

টেনসরফ্লো.অর্গ.এ দেখুন গুগল কোলাবে চালান গিটহাবের উত্স দেখুন নোটবুক ডাউনলোড করুন

ভূমিকা

প্রাকৃতিক ভাষা প্রক্রিয়া করে এমন মডেলগুলি প্রায়শই বিভিন্ন চরিত্রের সেট সহ বিভিন্ন ভাষা পরিচালনা করে। ইউনিকোড একটি স্ট্যান্ডার্ড এনকোডিং সিস্টেম যা প্রায় সব ভাষা থেকে অক্ষর উপস্থাপন করতে ব্যবহৃত হয়। প্রতিটি অক্ষর 0 এবং 0x10FFFF মধ্যে একটি অনন্য পূর্ণসংখ্যার কোড পয়েন্ট ব্যবহার করে এনকোড 0x10FFFF । একটি ইউনিকোড স্ট্রিং শূন্য বা আরও কোড পয়েন্টের ক্রম।

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

import tensorflow as tf

tf.string ডেটা টাইপ

বেসিক tf.string dtype আপনাকে বাইট স্ট্রিংয়ের tf.string dtype করতে দেয়। ইউনিকোড স্ট্রিংগুলি ডিফল্টরূপে utf-8 এনকোড করা হয়।

tf.constant(u"Thanks 😊")
<tf.Tensor: shape=(), dtype=string, numpy=b'Thanks \xf0\x9f\x98\x8a'>

একটি tf.string টেনসর বিভিন্ন দৈর্ঘ্যের বাইট স্ট্রিং ধরে রাখতে পারে কারণ বাইট স্ট্রিংগুলি পারমাণবিক ইউনিট হিসাবে বিবেচিত হয়। স্ট্রিং দৈর্ঘ্য টেনসর মাত্রার মধ্যে অন্তর্ভুক্ত করা হয় না।

tf.constant([u"You're", u"welcome!"]).shape
TensorShape([2])

ইউনিকোড উপস্থাপন

টেনসরফ্লোতে ইউনিকোড স্ট্রিং উপস্থাপনের দুটি মানক উপায় রয়েছে:

  • string স্কেলার - যেখানে কোড পয়েন্টগুলির ক্রমটি একটি পরিচিত অক্ষর এনকোডিং ব্যবহার করে এনকোড করা হয়েছে।
  • int32 ভেক্টর - যেখানে প্রতিটি পজিশনে একটি কোড কোড পয়েন্ট থাকে।

উদাহরণস্বরূপ, নিম্নলিখিত তিনটি মান ইউনিকোড স্ট্রিং "语言处理" (যার অর্থ চীনা ভাষায় "ভাষা প্রক্রিয়াজাতকরণ"):

# Unicode string, represented as a UTF-8 encoded string scalar.
text_utf8 = tf.constant(u"语言处理")
text_utf8
<tf.Tensor: shape=(), dtype=string, numpy=b'\xe8\xaf\xad\xe8\xa8\x80\xe5\xa4\x84\xe7\x90\x86'>
# Unicode string, represented as a UTF-16-BE encoded string scalar.
text_utf16be = tf.constant(u"语言处理".encode("UTF-16-BE"))
text_utf16be
<tf.Tensor: shape=(), dtype=string, numpy=b'\x8b\xed\x8a\x00Y\x04t\x06'>
# Unicode string, represented as a vector of Unicode code points.
text_chars = tf.constant([ord(char) for char in u"语言处理"])
text_chars
<tf.Tensor: shape=(4,), dtype=int32, numpy=array([35821, 35328, 22788, 29702], dtype=int32)>

উপস্থাপনার মধ্যে রূপান্তর

টেনসরফ্লো এই বিভিন্ন উপস্থাপনার মধ্যে রূপান্তর করতে ক্রিয়াকলাপ সরবরাহ করে:

tf.strings.unicode_decode(text_utf8,
                          input_encoding='UTF-8')
<tf.Tensor: shape=(4,), dtype=int32, numpy=array([35821, 35328, 22788, 29702], dtype=int32)>
tf.strings.unicode_encode(text_chars,
                          output_encoding='UTF-8')
<tf.Tensor: shape=(), dtype=string, numpy=b'\xe8\xaf\xad\xe8\xa8\x80\xe5\xa4\x84\xe7\x90\x86'>
tf.strings.unicode_transcode(text_utf8,
                             input_encoding='UTF8',
                             output_encoding='UTF-16-BE')
<tf.Tensor: shape=(), dtype=string, numpy=b'\x8b\xed\x8a\x00Y\x04t\x06'>

ব্যাচের মাত্রা

একাধিক স্ট্রিং ডিকোড করার সময়, প্রতিটি স্ট্রিংয়ের অক্ষরের সংখ্যা সমান নাও হতে পারে। প্রত্যাবর্তনের ফলাফলটি একটি tf.RaggedTensor , যেখানে প্রতিটি স্ট্রিংয়ের অক্ষরের সংখ্যার উপর নির্ভর করে tf.RaggedTensor মাত্রার দৈর্ঘ্য পরিবর্তিত হয়:

# A batch of Unicode strings, each represented as a UTF8-encoded string.
batch_utf8 = [s.encode('UTF-8') for s in
              [u'hÃllo',  u'What is the weather tomorrow',  u'Göödnight', u'😊']]
batch_chars_ragged = tf.strings.unicode_decode(batch_utf8,
                                               input_encoding='UTF-8')
for sentence_chars in batch_chars_ragged.to_list():
  print(sentence_chars)
[104, 195, 108, 108, 111]
[87, 104, 97, 116, 32, 105, 115, 32, 116, 104, 101, 32, 119, 101, 97, 116, 104, 101, 114, 32, 116, 111, 109, 111, 114, 114, 111, 119]
[71, 246, 246, 100, 110, 105, 103, 104, 116]
[128522]

আপনি এই tf.RaggedTensor সরাসরি ব্যবহার করতে পারেন, বা tf.RaggedTensor.to_tensor এবং tf.RaggedTensor.to_sparse পদ্ধতি ব্যবহার করে প্যাডিং বা একটি tf.SparseTensor সহ একটি ঘন tf.Tensor রূপান্তর করতে পারেন।

batch_chars_padded = batch_chars_ragged.to_tensor(default_value=-1)
print(batch_chars_padded.numpy())
[[   104    195    108    108    111     -1     -1     -1     -1     -1
      -1     -1     -1     -1     -1     -1     -1     -1     -1     -1
      -1     -1     -1     -1     -1     -1     -1     -1]
 [    87    104     97    116     32    105    115     32    116    104
     101     32    119    101     97    116    104    101    114     32
     116    111    109    111    114    114    111    119]
 [    71    246    246    100    110    105    103    104    116     -1
      -1     -1     -1     -1     -1     -1     -1     -1     -1     -1
      -1     -1     -1     -1     -1     -1     -1     -1]
 [128522     -1     -1     -1     -1     -1     -1     -1     -1     -1
      -1     -1     -1     -1     -1     -1     -1     -1     -1     -1
      -1     -1     -1     -1     -1     -1     -1     -1]]

batch_chars_sparse = batch_chars_ragged.to_sparse()

একই দৈর্ঘ্যের সাথে একাধিক স্ট্রিং এনকোড করার সময়, একটি tf.Tensor ইনপুট হিসাবে ব্যবহার করা যেতে পারে:

tf.strings.unicode_encode([[99, 97, 116], [100, 111, 103], [ 99, 111, 119]],
                          output_encoding='UTF-8')
<tf.Tensor: shape=(3,), dtype=string, numpy=array([b'cat', b'dog', b'cow'], dtype=object)>

বিভিন্ন দৈর্ঘ্যের সাথে একাধিক স্ট্রিং এনকোড করার সময়, একটি tf.RaggedTensor ইনপুট হিসাবে ব্যবহার করা উচিত:

tf.strings.unicode_encode(batch_chars_ragged, output_encoding='UTF-8')
<tf.Tensor: shape=(4,), dtype=string, numpy=
array([b'h\xc3\x83llo', b'What is the weather tomorrow',
       b'G\xc3\xb6\xc3\xb6dnight', b'\xf0\x9f\x98\x8a'], dtype=object)>

আপনি প্যাডেড বা বিক্ষিপ্ত বিন্যাসে একাধিক স্ট্রিং সঙ্গে একটি টেন্সর থাকে, তাহলে তারপর একটি রূপান্তর tf.RaggedTensor কল করার আগে unicode_encode :

tf.strings.unicode_encode(
    tf.RaggedTensor.from_sparse(batch_chars_sparse),
    output_encoding='UTF-8')
<tf.Tensor: shape=(4,), dtype=string, numpy=
array([b'h\xc3\x83llo', b'What is the weather tomorrow',
       b'G\xc3\xb6\xc3\xb6dnight', b'\xf0\x9f\x98\x8a'], dtype=object)>
tf.strings.unicode_encode(
    tf.RaggedTensor.from_tensor(batch_chars_padded, padding=-1),
    output_encoding='UTF-8')
<tf.Tensor: shape=(4,), dtype=string, numpy=
array([b'h\xc3\x83llo', b'What is the weather tomorrow',
       b'G\xc3\xb6\xc3\xb6dnight', b'\xf0\x9f\x98\x8a'], dtype=object)>

ইউনিকোড অপারেশন

চরিত্রের দৈর্ঘ্য

tf.strings.length অপারেশনের একটি প্যারামিটার unit , এটি নির্দেশ করে যে tf.strings.length কীভাবে গণনা করা উচিত। unit "BYTE" ডিফল্ট থাকে তবে প্রতিটি এনকোড string ইউনিকোড কোডপয়েন্টের সংখ্যা নির্ধারণের জন্য এটি "UTF8_CHAR" বা "UTF16_CHAR" মতো অন্যান্য মানগুলিতে সেট করা যেতে পারে।

# Note that the final character takes up 4 bytes in UTF8.
thanks = u'Thanks 😊'.encode('UTF-8')
num_bytes = tf.strings.length(thanks).numpy()
num_chars = tf.strings.length(thanks, unit='UTF8_CHAR').numpy()
print('{} bytes; {} UTF-8 characters'.format(num_bytes, num_chars))
11 bytes; 8 UTF-8 characters

চরিত্রের সাবস্ট্রিংগুলি

একইভাবে, tf.strings.substr অপারেশন "গ্রহণ unit " প্যারামিটারটি, এবং তা নির্ধারণ করতে অফসেট ধরনের কি হবে "এটি ব্যবহার করে pos " এবং " len " paremeters ধারণ করে।

# default: unit='BYTE'. With len=1, we return a single byte.
tf.strings.substr(thanks, pos=7, len=1).numpy()
b'\xf0'
# Specifying unit='UTF8_CHAR', we return a single character, which in this case
# is 4 bytes.
print(tf.strings.substr(thanks, pos=7, len=1, unit='UTF8_CHAR').numpy())
b'\xf0\x9f\x98\x8a'

ইউনিকোড স্ট্রলগুলি বিভক্ত করুন

tf.strings.unicode_split অপারেশনটি ইউনিকোড স্ট্রিংগুলিকে পৃথক অক্ষরের সাবস্ট্রিংগুলিতে বিভক্ত করে:

tf.strings.unicode_split(thanks, 'UTF-8').numpy()
array([b'T', b'h', b'a', b'n', b'k', b's', b' ', b'\xf0\x9f\x98\x8a'],
      dtype=object)

অক্ষরের জন্য বাইট অফসেট

tf.strings.unicode_decode দ্বারা উত্পাদিত অক্ষর tf.strings.unicode_decode মূল স্ট্রিংয়ের সাথে সারিবদ্ধ করার জন্য, প্রতিটি অক্ষরটি কোথায় শুরু হয় সে সম্পর্কিত অফসেটটি জানা দরকারী। tf.strings.unicode_decode_with_offsets পদ্ধতিটি tf.strings.unicode_decode_with_offsets unicode_decode , এটি বাদে এটি প্রতিটি অক্ষরের প্রারম্ভের অফসেট সম্বলিত একটি দ্বিতীয় unicode_decode প্রদান করে।

codepoints, offsets = tf.strings.unicode_decode_with_offsets(u"🎈🎉🎊", 'UTF-8')

for (codepoint, offset) in zip(codepoints.numpy(), offsets.numpy()):
  print("At byte offset {}: codepoint {}".format(offset, codepoint))
At byte offset 0: codepoint 127880
At byte offset 4: codepoint 127881
At byte offset 8: codepoint 127882

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

প্রতিটি ইউনিকোড কোড পয়েন্ট স্ক্রিপ্ট হিসাবে পরিচিত কোডপয়েন্টগুলির একক সংগ্রহের অন্তর্ভুক্ত। চরিত্রের স্ক্রিপ্টটি কোন ভাষার মধ্যে থাকতে পারে তা নির্ধারণে সহায়ক example উদাহরণস্বরূপ, 'Б' সিরিলিক স্ক্রিপ্টে রয়েছে তা জেনে বোঝায় যে সেই অক্ষরটি সম্বলিত আধুনিক পাঠ সম্ভবত রাশিয়ান বা ইউক্রেনীয় জাতীয় স্লাভিক ভাষা থেকে এসেছে।

প্রদত্ত কোডপয়েন্টটি কোন স্ক্রিপ্ট ব্যবহার করে তা নির্ধারণ করতে tf.strings.unicode_script ক্রিয়াকলাপ সরবরাহ করে। স্ক্রিপ্ট কোড আছে int32 সংশ্লিষ্ট মান ইউনিকোড আন্তর্জাতিক সামগ্রী (আইসিইউ) UScriptCode মান।

uscript = tf.strings.unicode_script([33464, 1041])  # ['芸', 'Б']

print(uscript.numpy())  # [17, 8] == [USCRIPT_HAN, USCRIPT_CYRILLIC]
[17  8]

tf.strings.unicode_script অপারেশনটি বহুমাত্রিক tf.Tensor গুলি বা tf.RaggedTensor এর কোডপয়েন্টে প্রয়োগ করা যেতে পারে:

print(tf.strings.unicode_script(batch_chars_ragged))
<tf.RaggedTensor [[25, 25, 25, 25, 25], [25, 25, 25, 25, 0, 25, 25, 0, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25], [25, 25, 25, 25, 25, 25, 25, 25, 25], [0]]>

উদাহরণ: সরল বিভাজন

বিভাজন হ'ল পাঠ্যকে শব্দের মতো ইউনিটে বিভক্ত করার কাজ task এটি প্রায়শই সহজ হয় যখন স্পেস অক্ষরগুলি পৃথক শব্দের জন্য পৃথক শব্দ ব্যবহার করা হয় তবে কিছু ভাষা (যেমন চাইনিজ এবং জাপানি) স্পেস ব্যবহার করে না এবং কিছু ভাষায় (জার্মান এর মতো) দীর্ঘ যৌগিক থাকে যা তাদের অর্থ বিশ্লেষণের জন্য বিভক্ত হতে হবে। ওয়েব পাঠ্যে, "এনওয়াই 株 価" (নিউ ইয়র্ক স্টক এক্সচেঞ্জ) এর মতো বিভিন্ন ভাষা এবং স্ক্রিপ্টগুলি প্রায়শই একসাথে মিশ্রিত হয়।

স্ক্রিপ্টে আনুমানিক শব্দের সীমানায় পরিবর্তন ব্যবহার করে আমরা খুব রুক্ষ বিভাজন (কোনও এমএল মডেল বাস্তবায়ন না করে) সম্পাদন করতে পারি। এটি উপরের "NY 株 example" উদাহরণের মতো স্ট্রিংয়ের জন্য কাজ করবে। এটি স্পেস ব্যবহার করে এমন বেশিরভাগ ভাষার ক্ষেত্রেও কাজ করবে, কারণ বিভিন্ন স্ক্রিপ্টের স্পেস অক্ষরগুলিকে সমস্ত ইউএসআরএটিT_COMMON হিসাবে শ্রেণীবদ্ধ করা হয়েছে, একটি বিশেষ স্ক্রিপ্ট কোড যা কোনও আসল পাঠ্যের চেয়ে পৃথক।

# dtype: string; shape: [num_sentences]
#
# The sentences to process.  Edit this line to try out different inputs!
sentence_texts = [u'Hello, world.', u'世界こんにちは']

প্রথমত, আমরা বাক্যগুলি অক্ষর কোডপয়েন্টগুলিতে ডিকোড করি এবং প্রতিটি অক্ষরের জন্য স্ক্রিপ্ট সনাক্তকারী পাই।

# dtype: int32; shape: [num_sentences, (num_chars_per_sentence)]
#
# sentence_char_codepoint[i, j] is the codepoint for the j'th character in
# the i'th sentence.
sentence_char_codepoint = tf.strings.unicode_decode(sentence_texts, 'UTF-8')
print(sentence_char_codepoint)

# dtype: int32; shape: [num_sentences, (num_chars_per_sentence)]
#
# sentence_char_scripts[i, j] is the unicode script of the j'th character in
# the i'th sentence.
sentence_char_script = tf.strings.unicode_script(sentence_char_codepoint)
print(sentence_char_script)
<tf.RaggedTensor [[72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 46], [19990, 30028, 12371, 12435, 12395, 12385, 12399]]>
<tf.RaggedTensor [[25, 25, 25, 25, 25, 0, 0, 25, 25, 25, 25, 25, 0], [17, 17, 20, 20, 20, 20, 20]]>

এরপরে, শব্দগুলির সীমানা কোথায় যুক্ত করা উচিত তা নির্ধারণ করতে আমরা সেই স্ক্রিপ্ট শনাক্তকারীদের ব্যবহার করি। আমরা প্রতিটি বাক্যের শুরুতে একটি শব্দ সীমানা যুক্ত করি এবং প্রতিটি চরিত্রের জন্য যার স্ক্রিপ্টটি পূর্বের অক্ষর থেকে পৃথক:

# dtype: bool; shape: [num_sentences, (num_chars_per_sentence)]
#
# sentence_char_starts_word[i, j] is True if the j'th character in the i'th
# sentence is the start of a word.
sentence_char_starts_word = tf.concat(
    [tf.fill([sentence_char_script.nrows(), 1], True),
     tf.not_equal(sentence_char_script[:, 1:], sentence_char_script[:, :-1])],
    axis=1)

# dtype: int64; shape: [num_words]
#
# word_starts[i] is the index of the character that starts the i'th word (in
# the flattened list of characters from all sentences).
word_starts = tf.squeeze(tf.where(sentence_char_starts_word.values), axis=1)
print(word_starts)
tf.Tensor([ 0  5  7 12 13 15], shape=(6,), dtype=int64)

তারপরে আমরা সমস্ত ব্যাচ থেকে শব্দের RaggedTensor সহ একটি RaggedTensor তৈরি করতে সেই স্টার্ট অফসেটগুলি ব্যবহার করতে পারি:

# dtype: int32; shape: [num_words, (num_chars_per_word)]
#
# word_char_codepoint[i, j] is the codepoint for the j'th character in the
# i'th word.
word_char_codepoint = tf.RaggedTensor.from_row_starts(
    values=sentence_char_codepoint.values,
    row_starts=word_starts)
print(word_char_codepoint)
<tf.RaggedTensor [[72, 101, 108, 108, 111], [44, 32], [119, 111, 114, 108, 100], [46], [19990, 30028], [12371, 12435, 12395, 12385, 12399]]>

এবং পরিশেষে, আমরা RaggedTensor ফেরত দিতে পারি:

# dtype: int64; shape: [num_sentences]
#
# sentence_num_words[i] is the number of words in the i'th sentence.
sentence_num_words = tf.reduce_sum(
    tf.cast(sentence_char_starts_word, tf.int64),
    axis=1)

# dtype: int32; shape: [num_sentences, (num_words_per_sentence), (num_chars_per_word)]
#
# sentence_word_char_codepoint[i, j, k] is the codepoint for the k'th character
# in the j'th word in the i'th sentence.
sentence_word_char_codepoint = tf.RaggedTensor.from_row_lengths(
    values=word_char_codepoint,
    row_lengths=sentence_num_words)
print(sentence_word_char_codepoint)
<tf.RaggedTensor [[[72, 101, 108, 108, 111], [44, 32], [119, 111, 114, 108, 100], [46]], [[19990, 30028], [12371, 12435, 12395, 12385, 12399]]]>

চূড়ান্ত ফলাফলটি পড়া সহজ করার জন্য, আমরা এটি ইউটিএফ -8 স্ট্রিংগুলিতে আবার এনকোড করতে পারি:

tf.strings.unicode_encode(sentence_word_char_codepoint, 'UTF-8').to_list()
[[b'Hello', b', ', b'world', b'.'],
 [b'\xe4\xb8\x96\xe7\x95\x8c',
  b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf']]