【问题标题】:How to apply tokenization to a TensorFlow Dataset?如何将标记化应用于 TensorFlow 数据集?
【发布时间】:2019-05-28 10:07:40
【问题描述】:

我正在使用cnn_dailymail 数据集,它是@​​987654322@ 的一部分。我的目标是在对数据集应用一些文本预处理步骤后对其进行标记。

我按如下方式访问和预处理数据集:

!pip install tensorflow-gpu==2.0.0-alpha0
import tensorflow as tf
import tensorflow_datasets as tfds

data, info = tfds.load('cnn_dailymail', with_info=True)
train_data, test_data = data['train'], data['test']

def map_fn(x, start=tf.constant('<start>'), end=tf.constant('<end>')):
   strings = [start, x['highlights'], end]
   x['highlights'] = tf.strings.join(strings, separator=' ')
   return x

train_data_preproc = train_data.map(map_fn)
elem, = train_data_preproc.take(1)
elem['highlights'].numpy()
# b'<start> mother announced as imedeen ambassador . ...

为了标记数据集,我遇到了tfds.features.text.Tokenizer 函数(另请参见here)。但是,这并不像我想要的那样:

tokenizer = tfds.features.text.Tokenizer(alphanum_only=False, reserved_tokens=['<start>', '<end>'])
tokenizer.tokenize(elem['highlights'].numpy())
# ['<start>', ' ', 'mother', ' ', 'announced', ' ', 'as', ' ', 'imedeen', ' ', 'ambassador', ' . ',...]

我希望分词器仅在空格上进行拆分,而不是将空格视为单独的令牌。有没有办法做到这一点?如果我创建自己的标记器函数然后使用dataset.map() 函数应用它会更好吗?谢谢!

【问题讨论】:

  • 添加此行[x for x in a if x != ' '],它将从您的列表中删除所有空间元素。这里a 是您在其中获取标记器结果输出的变量。
  • 感谢@Vishal 的提示。如果我使用[x for x in tokenizer.tokenize(elem['highlights'].numpy()) if x != ' '] 作为我的最后一行代码,那么我得到:['&lt;start&gt;', 'mother', 'announced', 'as', 'imedeen', 'ambassador', ' . ', ...。这仍然与基于空格的拆分结果不完全相同(因为在这种情况下是 ' . ' 标记)。我只是想知道tfds.features.text.Tokenizer 是否可以进一步定制。
  • 对于像 ' 这样的标记。 ',您可以修改为[x.strip() for x in a if x != ' '],这将删除标记开头和结尾的多余空格。由于 tfds.features.text.Tokenizer 中只有 2 个参数,我认为不能自定义。但是如果您愿意使用它们,还有其他标记器。
  • 好的,谢谢。我已经对tokenizer = tf.keras.preprocessing.text.Tokenizer(filters='') 进行了一些实验。我只是想避免遍历每个(句子和)标记,因为我的语料库非常大。我将继续尝试其他标记器。

标签: python-3.x tensorflow tokenize tensorflow-datasets


【解决方案1】:

对于在这方面苦苦挣扎的人,Tensorflow 明确表示:https://www.tensorflow.org/tutorials/load_data/text#encode_text_lines_as_numbers

import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer

X = ... # list of string
y = ... # list of corresponding labels

train_data = tf.data.Dataset.from_tensor_slices((X, y))

# Building vocabulary set for tokenizer
tokenizer = tfds.features.text.Tokenizer()

vocabulary_set = set()
for text_tensor, _ in train_data:
  some_tokens = tokenizer.tokenize(text_tensor.numpy())
  vocabulary_set.update(some_tokens)

# Encoding functions
def encode(text_tensor, label):
  encoded_text = encoder.encode(text_tensor.numpy())
  return encoded_text, label

def encode_map_fn(text, label):
  # py_func doesn't set the shape of the returned tensors.
  encoded_text, label = tf.py_function(encode, 
                                       inp=[text, label], 
                                       Tout=(tf.int64, tf.int64))

  # `tf.data.Datasets` work best if all components have a shape set
  #  so set the shapes manually: 
  encoded_text.set_shape([None])
  label.set_shape([])

  return encoded_text, label


train_data_tokenized = train_data.map(encode_map_fn)

其中train_data 是由句子和标签组成的tf.data.Dataset 对象。

【讨论】:

    【解决方案2】:

    对于点击此链接的读者...

    请找到我的要点,这可能有助于在 Tensorlfow 中进行标记化。

    链接:https://gist.github.com/Mageswaran1989/70fd26af52ca4afb86e611f84ac83e97#file-text_preprocessing-ipynb

    有不同的选择:

    【讨论】:

      猜你喜欢
      • 2020-09-08
      • 2022-01-04
      • 1970-01-01
      • 2019-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      • 2022-11-30
      相关资源
      最近更新 更多