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