TF Metin ile Tokenleştirme

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın GitHub'da görüntüle Not defterini indir TF Hub modellerine bakın

genel bakış

Belirteçleştirme, bir dizeyi belirteçlere ayırma işlemidir. Genellikle bu belirteçler kelimeler, sayılar ve/veya noktalama işaretleridir. tensorflow_text paket metni ön işlenmesi için kullanılabilir tokenizers bir dizi metin tabanlı modeller tarafından gerekli sağlar. TensorFlow grafiğinde belirteçleştirmeyi gerçekleştirerek, eğitim ve çıkarım iş akışları ve ön işleme komut dosyalarını yönetme arasındaki farklar hakkında endişelenmenize gerek kalmayacak.

Bu kılavuz, TensorFlow Text tarafından sağlanan birçok simgeleştirme seçeneğini, ne zaman bir seçeneği diğerine kullanmak isteyebileceğinizi ve bu belirteçlerin modelinizden nasıl çağrıldığını açıklar.

Kurmak

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

Bölücü API'sı

Ana arayüzleri olan Splitter ve SplitterWithOffsets tek yöntemler var split ve split_with_offsets . SplitterWithOffsets varyantı (uzandığı Splitter ) bayt uzaklıklar almak için bir seçenek içerir. Bu, arayanın, oluşturulan belirtecin orijinal dizedeki hangi baytlardan oluşturulduğunu bilmesini sağlar.

Tokenizer ve TokenizerWithOffsets uzman sürümleri olan Splitter kolaylık yöntemleri sağlamak tokenize ve tokenize_with_offsets sırasıyla.

Genel olarak, herhangi bir N-boyutlu bir giriş için, geri belirteçleri N + 1 boyutlu olan RaggedTensor orijinal bireysel şeritlerine eşleme jeton en iç boyuta sahip.

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

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

Bir de bulunmaktadır Detokenizer arayüzü. Bu arabirimi uygulayan herhangi bir belirteç oluşturucu, belirteçlerin N boyutlu düzensiz tensörünü kabul edebilir ve normalde, verilen belirteçlerin bir araya toplandığı N-1 boyutlu bir tensör veya düzensiz tensör döndürür.

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

belirteçler

Aşağıda TensorFlow Text tarafından sağlanan belirteç paketi bulunmaktadır. Dize girişlerinin UTF-8 olduğu varsayılır. Gözden geçirin Unicode kılavuzu UTF-8'e dizeleri dönüştürmek için.

Tüm kelime belirteçleri

Bu belirteçler, bir dizeyi sözcüklere bölmeye çalışır ve metni bölmenin en sezgisel yoludur.

Boşluk Belirteçleştirici

text.WhitespaceTokenizer yoğun bakım tanımlanan boşluk karakteri (örn. Uzay, sekme, yeni satır) üzerine dizeleri böler en temel tokenizer olduğunu. Bu genellikle prototip modelleri hızlı bir şekilde oluşturmak için iyidir.

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.']]

Bu belirteç oluşturucunun bir eksikliğinin, bir belirteç oluşturmak için kelimeye noktalama işaretlerinin eklenmesi olduğunu fark edebilirsiniz. Ayrı dizgeciklerine kelime ve noktalama bölmek için, UnicodeScriptTokenizer kullanılmalıdır.

UnicodeScriptTokenizer

UnicodeScriptTokenizer Unicode komut sınırlarına dayalı dizeleri böler. Kullanılan komut dosyası kodları, Uluslararası Unicode Bileşenleri (ICU) UScriptCode değerlerine karşılık gelir. Bkz: http://icu-project.org/apiref/icu4c/uscript_8h.html

Uygulamada bu benzer WhitespaceTokenizer o dil metinleri (örneğin. USCRIPT_LATIN, USCRIPT_CYRILLIC, vs) da birbirinden dil metinleri ayıran ederken gelen noktalama işaretlerini (USCRIPT_COMMON) bölünmüş olacağını en belirgin fark, varlık ile. Bunun aynı zamanda daralma sözcüklerini ayrı belirteçlere böleceğini unutmayın.

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'.']]

Alt kelime belirteçleri

Alt kelime belirteçleri daha küçük bir kelime hazinesi ile kullanılabilir ve modelin onu oluşturan alt kelimelerden yeni kelimeler hakkında bazı bilgilere sahip olmasına izin verir.

Biz aşağıda kısaca alt-kelime dizgeciklere seçeneklerini tartışmak, ancak alt-kelime sembolleştirmeyi öğretici daha derinlere iner ve ayrıca vocab dosyalarını oluşturmak için açıklar.

WordpieceTokenizer

WordPiece belirteçleştirme, bir dizi alt belirteç oluşturan, veriye dayalı bir belirteçleştirme şemasıdır. Bu alt belirteçler, dilsel biçimbirimlere karşılık gelebilir, ancak bu genellikle böyle değildir.

WordpieceTokenizer, girdinin zaten belirteçlere bölünmesini bekler. Bu ön koşul gerektiğinden, genellikle kullanarak bölmek isteyeceksiniz WhitespaceTokenizer veya UnicodeScriptTokenizer önceden.

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.']]

Dize jeton ayrılmıştır sonra WordpieceTokenizer subtokens içine bölünmüş için kullanılabilir.

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

BertTokenizer, BERT kağıdındaki orijinal tokenleştirme uygulamasını yansıtır. Bu, WordpieceTokenizer tarafından desteklenir, ancak önce sözcüklere normalleştirme ve simgeleştirme gibi ek görevleri de gerçekleştirir.

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'.']]]

Cümle Parçası Belirteç

SentencepieceTokenizer, son derece yapılandırılabilir bir alt belirteç belirtecidir. Bu, Cümle parçası kitaplığı tarafından desteklenir. BertTokenizer gibi, alt belirteçlere bölünmeden önce normalleştirme ve belirteç ayırmayı içerebilir.

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'.']]

Diğer ayırıcılar

UnicodeCharTokenizer

Bu, bir dizeyi UTF-8 karakterlerine böler. Sözcükler arasında boşluk olmayan CJK dilleri için kullanışlıdır.

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]]

Çıktı, Unicode kod noktalarıdır. Bu, bigramlar gibi karakter ngramları oluşturmak için de yararlı olabilir. UTF-8 karakterlerine geri dönüştürmek için.

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.']]

HubModuleTokenizer

Bu, TF Hub şu anda düzensiz tensörleri desteklemediğinden çağrıları kolaylaştırmak için TF Hub'a dağıtılan modellerin etrafındaki bir sarmalayıcıdır. Belirteçleştirme gerçekleştiren bir modele sahip olmak, özellikle sözcüklere bölmek istediğinizde ancak buluşsal bir kılavuz sağlamak için boşluklarınız olmadığında CJK dilleri için kullanışlıdır. Şu anda Çince için tek bir segmentasyon modelimiz var.

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 ile kodlanmış bayt dizilerinin sonuçlarını görüntülemek zor olabilir. Görüntülemeyi kolaylaştırmak için liste değerlerinin kodunu çözün.

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 dize bölünmüş olması gereken yerde belirtmek sağlanan değerlere dayalı bölme hedeflenen amaçla son bir dize var. Bu, önceki Segmentasyon örneğinde olduğu gibi kendi segmentasyon modellerinizi oluştururken kullanışlıdır.

İçin SplitMergeTokenizer , 0 değeri yeni dize başlangıcını belirtmek için kullanılır ve 1 değeri karakteri geçerli dize parçası olduğunu gösterir.

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

SplitMergeFromLogitsTokenizer benzer, ancak bunun yerine her karakter yeni bir dize bölünmüş veya geçerli bir birleştirilecek gerekip gerekmediğini tahmin nöral ağdan logit değer çiftleri kabul eder.

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))
[['新华社', '北京']]

Normal İfade Bölücü

RegexSplitter bir mesafede normal ifade tarafından tanımlandığı rasgele kopma noktalarında kademeli dizeleri edebilmektedir.

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.']]

Ofsetler

Dizeleri simgeleştirirken, genellikle belirtecin orijinal dizide nereden geldiğini bilmek istenir. Bu nedenle, gerçekleştirdiği her simgeleştiricisine için TokenizerWithOffsets jeton ile birlikte bayt uzaklıklar dönecektir bir tokenize_with_offsets yöntemi vardır. start_offsets, her belirtecin başladığı orijinal dizedeki baytları listeler ve end_offsets, her belirtecin bittiği noktadan hemen sonraki baytları listeler. Yeniden çerçevelemek için, başlangıç ​​ofsetleri dahil ve bitiş ofsetleri hariçtir.

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]]

detokenizasyon

Uygulamak Tokenizers Detokenizer bir sağlamak detokenize yöntemi dizeleri birleştirmek için girişimleri. Bunun kayıp olma şansı vardır, bu nedenle detokenize edilmiş dize her zaman orijinal, önceden belirtilmiş dizeyle tam olarak eşleşmeyebilir.

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 Verileri

TF Data, eğitim modelleri için bir girdi ardışık düzeni oluşturmaya yönelik güçlü bir API'dir. Belirteçler, API ile beklendiği gibi çalışır.

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!']]