code: def make_module_spec(
      vocabulary_file,
      vocab_size,
      embeddings_dim,
      num_oov_buckets,
      preprocess_text,
  ):
      """Makes a module spec to simply perform token to embedding lookups.
  
      Input of this module is a 1-D list of string tokens. For T tokens input and
      an M dimensional embedding table, the lookup result is a [T, M] shaped Tensor.
  
      Args:
        vocabulary_file: Text file where each line is a key in the vocabulary.
        vocab_size: The number of tokens contained in the vocabulary.
        embeddings_dim: The embedding dimension.
        num_oov_buckets: The number of out-of-vocabulary buckets.
        preprocess_text: Whether to preprocess the input tensor by removing
          punctuation and splitting on spaces.
  
      Returns:
        A module spec object used for constructing a TF-Hub module.
      """
  
      def module_fn():
          """Spec function for a token embedding module."""
          tokens = tf.placeholder(
              shape=[None], dtype=tf.string, name="tokens"
          )
  
          embeddings_var = tf.get_variable(
              initializer=tf.zeros(
                  [vocab_size + num_oov_buckets, embeddings_dim]
              ),
              name=EMBEDDINGS_VAR_NAME,
              dtype=tf.float32,
          )
  
          table_initializer = tf.lookup.TextFileInitializer(
              vocabulary_file,
              tf.string,
              tf.lookup.TextFileIndex.WHOLE_LINE,
              tf.int64,
              tf.lookup.TextFileIndex.LINE_NUMBER,
          )
          lookup_table = tf.lookup.StaticVocabularyTable(
              table_initializer, num_oov_buckets=num_oov_buckets
          )
          ids = lookup_table.lookup(tokens)
          combined_embedding = tf.nn.embedding_lookup(
              params=embeddings_var, ids=ids
          )
          hub.add_signature(
              "default",
              {"tokens": tokens},
              {"default": combined_embedding},
          )
  
      def module_fn_with_preprocessing():
          """Spec function for a full-text embedding module with preprocessing."""
          sentences = tf.placeholder(
              shape=[None], dtype=tf.string, name="sentences"
          )
          # Perform a minimalistic text preprocessing by removing punctuation and
          # splitting on spaces.
          normalized_sentences = tf.regex_replace(
              input=sentences, pattern=r"\pP", rewrite=""
          )
          tokens = tf.string_split(normalized_sentences, " ")
  
          embeddings_var = tf.get_variable(
              initializer=tf.zeros(
                  [vocab_size + num_oov_buckets, embeddings_dim]
              ),
              name=EMBEDDINGS_VAR_NAME,
              dtype=tf.float32,
          )
          table_initializer = tf.lookup.TextFileInitializer(
              vocabulary_file,
              tf.string,
              tf.lookup.TextFileIndex.WHOLE_LINE,
              tf.int64,
              tf.lookup.TextFileIndex.LINE_NUMBER,
          )
          lookup_table = tf.lookup.StaticVocabularyTable(
              table_initializer, num_oov_buckets=num_oov_buckets
          )
          sparse_ids = tf.SparseTensor(
              indices=tokens.indices,
              values=lookup_table.lookup(tokens.values),
              dense_shape=tokens.dense_shape,
          )
  
          # In case some of the input sentences are empty before or after
          # normalization, we will end up with empty rows. We do however want to
          # return embedding for every row, so we have to fill in the empty rows with
          # a default.
          sparse_ids, _ = tf.sparse_fill_empty_rows(
              sparse_ids, lookup_table.lookup(tf.constant(""))
          )
          # In case all of the input sentences are empty before or after
          # normalization, we will end up with a SparseTensor with shape [?, 0]. After
          # filling in the empty rows we must ensure the shape is set properly to
          # [?, 1]. At this point, there are no empty rows, so the new shape will be
          # [sparse_ids.dense_shape[0], max(1, sparse_ids.dense_shape[1])].
          sparse_ids = tf.sparse_reset_shape(sparse_ids)
  
          combined_embedding = tf.nn.embedding_lookup_sparse(
              params=embeddings_var,
              sp_ids=sparse_ids,
              sp_weights=None,
              combiner="sqrtn",
          )
  
          hub.add_signature(
              "default",
              {"sentences": sentences},
              {"default": combined_embedding},
          )
  
      if preprocess_text:
          return hub.create_module_spec(module_fn_with_preprocessing)
      else:
          return hub.create_module_spec(module_fn)
  
file_path: hub/examples/text_embeddings/export.py
imports: import argparse
  import os
  import shutil
  import sys
  import tempfile
  import numpy
  import tensorflow.compat.v1
  import tensorflow_hub
label_desc: Use image node_id 3 for calling a global function with example usage: make_module_spec(vocabulary_file, vocab_size, embeddings_dim, num_oov_buckets, preprocess_text) and returns: hub, hub