首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tf.keras.preprocessing.text.Tokenizer()和tfds.features.text.Tokenizer()的比较

tf.keras.preprocessing.text.Tokenizer()和tfds.features.text.Tokenizer()的比较
EN

Stack Overflow用户
提问于 2020-05-07 15:06:51
回答 1查看 1.7K关注 0票数 3

作为背景,我最近越来越多地研究NLP和文本处理。我更熟悉计算机视觉。我完全理解托肯化的概念。

我的困惑源于Tokenizer类的各种实现,这些实现可以在Tensorflow生态系统中找到。

Tokenizer类既存在于Tensorflow Datasets (tfds)中,也存在于Tensorflow本身中:tfds.features.text.Tokenizer() & tf.keras.preprocessing.text.Tokenizer()

我查看了源代码(链接在下面),但无法收集到任何有用的见解。

这里的tl;dr问题是:您使用哪个库来做什么?一个库比另一个库有什么好处呢?

注意事项

我和实践中的流动专业化以及这个教程一起跟踪。TF在实践中使用tf.Keras.preprocessing.text.Tokenizer()实现,文本加载教程使用tfds.features.text.Tokenizer()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-18 16:38:04

有许多包已经开始提供自己的API来进行文本预处理,但是,每个包都有自己的细微差别。

tf.keras.preprocessing.text.Tokenizer()由Keras实现,Tensorflow作为高级API支持.

tfds.features.text.Tokenizer()是由tensorflow自己开发和维护的。

两者都有自己的编码方法。你可以从下面的例子中看出。

代码语言:javascript
复制
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
import tensorflow_datasets as tfds  

让我们获取一些示例数据,并查看这两个API的编码输出:

代码语言:javascript
复制
text_data = ["4. Kurt Betschart - Bruno Risi ( Switzerland ) 22",
            "Israel approves Arafat 's flight to West Bank .",
            "Moreau takes bronze medal as faster losing semifinalist .",
            "W D L G / F G / A P",
            "-- Helsinki newsroom +358 - 0 - 680 50 248",
            "M'bishi Gas sets terms on 7-year straight ."]  

首先,让我们给出tf.keras.Tokenizer()的结果:

代码语言:javascript
复制
tf_keras_tokenizer = Tokenizer()
tf_keras_tokenizer.fit_on_texts(text_data)
tf_keras_encoded = tf_keras_tokenizer.texts_to_sequences(text_data)
tf_keras_encoded = pad_sequences(tf_keras_encoded, padding="post") 

对于我们输入的数据中的第一句,结果是:

代码语言:javascript
复制
tf_keras_encoded[0]  

数组(2,3,4,5,6,7,8,0,dtype=int32)

如果我们看看单词到索引映射。

代码语言:javascript
复制
tf_keras_tokenizer.index_word  


{1: 'g',
 2: '4',
 3: 'kurt',
 4: 'betschart',
 5: 'bruno',
 6: 'risi',
 7: 'switzerland',
 8: '22',
 9: 'israel',
 10: 'approves',
 11: 'arafat',
 12: "'s",
 13: 'flight',
 14: 'to',
 15: 'west',
 16: 'bank',
 17: 'moreau',
 18: 'takes',
 19: 'bronze',
 20: 'medal',
 21: 'as',
 22: 'faster',
 23: 'losing',
 24: 'semifinalist',
 25: 'w',
 26: 'd',
 27: 'l',
 28: 'f',
 29: 'a',
 30: 'p',
 31: 'helsinki',
 32: 'newsroom',
 33: '358',
 34: '0',
 35: '680',
 36: '50',
 37: '248',
 38: "m'bishi",
 39: 'gas',
 40: 'sets',
 41: 'terms',
 42: 'on',
 43: '7',
 44: 'year',
 45: 'straight'}  

现在让我们试试tfds.features.text.Tokenizer()

代码语言:javascript
复制
text_vocabulary_set = set()
for text in text_data:
    text_tokens = tfds_tokenizer.tokenize(text)
    text_vocabulary_set.update(text_tokens) 

tfds_text_encoder = tfds.features.text.TokenTextEncoder(text_vocabulary_set, tokenizer=tfds_tokenizer)  

对于我们输入的数据中的第一句,结果是:

代码语言:javascript
复制
tfds_text_encoder.encode(text_data[0]) 

35、19、44、38、32、2、14

如果我们看单词到索引映射(注意索引从0开始)。

代码语言:javascript
复制
tfds_text_encoder._token_to_id  

{'0': 0,
 '22': 13,
 '248': 17,
 '358': 23,
 '4': 34,
 '50': 9,
 '680': 6,
 '7': 26,
 'A': 19,
 'Arafat': 39,
 'Bank': 35,
 'Betschart': 43,
 'Bruno': 37,
 'D': 15,
 'F': 20,
 'G': 28,
 'Gas': 29,
 'Helsinki': 38,
 'Israel': 3,
 'Kurt': 18,
 'L': 44,
 'M': 5,
 'Moreau': 22,
 'P': 10,
 'Risi': 31,
 'Switzerland': 1,
 'W': 30,
 'West': 33,
 'approves': 4,
 'as': 7,
 'bishi': 2,
 'bronze': 12,
 'faster': 8,
 'flight': 27,
 'losing': 42,
 'medal': 32,
 'newsroom': 11,
 'on': 25,
 's': 24,
 'semifinalist': 40,
 'sets': 36,
 'straight': 45,
 'takes': 41,
 'terms': 16,
 'to': 14,
 'year': 21}  

您可以看到,两个结果中的编码差异以及两个API提供了一些可以根据需求使用和修改的超参数。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61661160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档