stackoverflow.com/q/49861235/1919374

отал с наборами данных и feature_columns в tenorflow (https://developers.googleblog.com/2017/11/introducing-tensorflow-feature-columns.html). Я вижу, что у них есть категориальные функции и способ создания встраиваемых функций из категориальных функций. Но когда мы работаем над задачами nlp, как мы можем создать единый поиск встраивания?

Например: рассмотрим задачу классификации текста. Каждая точка данных будет иметь много текстовых столбцов, но они не будут отдельными категориями. Как мы можем создать и использовать единый поиск для всех этих столбцов?

Ниже приведен пример того, как я в настоящее время использую функции встраивания. Я создаю категориальную функцию для каждого столбца и использую ее для создания встраивания. Проблема заключается в том, что вложения для одного и того же слова могут быть разными для разных столбцов.

def create_embedding_features(key, vocab_list=None, embedding_size=20):
    cat_feature = \
        tf.feature_column.categorical_column_with_vocabulary_list(
            key=key,
            vocabulary_list = vocab_list
            )
    embedding_feature = tf.feature_column.embedding_column(
            categorical_column = cat_feature,
            dimension = embedding_size
        )
    return embedding_feature

le_features_embd = [create_embedding_features(f, vocab_list=vocab_list)
                     for f in feature_keys]
 greeness28 нояб. 2017 г., 04:54
 Krishnaa29 нояб. 2017 г., 04:41
Спасибо за ответ. Я не смог выяснить, как выполнить классификацию текстовых данных с помощью оценщиков. Не могли бы вы указать мне рабочий пример? Примечание: я изменил вопрос, чтобы показать, как я в настоящее время использую функции встраивания для текстовых данных.

Ответы на вопрос(1)

у вас есть недоразумение. Для задачи классификации текста, если вы вводите фрагмент текста (предложение), вы должны рассматривать все предложение как один столбец объектов. Таким образом, каждая точка данных имеет только один текстовый столбецНЕ много столбцов. Значение в этом столбце обычно представляет собой объединенное вложение всех токенов. Таким способом мы преобразуем разреженный объект переменной длины (неизвестное количество текстовых токенов) в один плотный объект (например, фиксированный 256-мерный вектор с плавающей точкой).

Давайте начнем с_CategoricalColumn.

cat_column_with_vocab = tf.feature_column.categorical_column_with_vocabulary_list(
    key='my-text',
    vocabulary_list=vocab_list)

Обратите внимание, если ваш словарный запас огромен, вы должны использоватьcategorical_column_with_vocabulary_file.

Мы создаем столбец встраивания с помощью инициализатора для чтения из контрольной точки (если у нас есть предварительно обученное встраивание) или рандомизации.

embedding_initializer = None
if has_pretrained_embedding:     
  embedding_initializer=tf.contrib.framework.load_embedding_initializer(
        ckpt_path=xxxx)
else:
  embedding_initializer=tf.random_uniform_initializer(-1.0, 1.0)
embed_column = embedding_column(
    categorical_column=cat_column_with_vocab,
    dimension=256,   ## this is your pre-trained embedding dimension
    initializer=embedding_initializer,
    trainable=False)

Предположим, у вас есть еще одна плотная особенностьprice:

price_column = tf.feature_column.numeric_column('price')

Создайте свои столбцы объектов

columns = [embed_column, price_column]

Построить модель:

features = tf.parse_example(..., 
    features=make_parse_example_spec(columns))
dense_tensor = tf.feature_column.input_layer(features, columns)
for units in [128, 64, 32]:
  dense_tensor = tf.layers.dense(dense_tensor, units, tf.nn.relu)
prediction = tf.layers.dense(dense_tensor, 1)

Кстати, дляtf.parse_example работать, это предполагает, что ваши входные данныеtf.Example вот так (текст protobuf):

features {
  feature {
    key: "price"
    value { float_list {
      value: 29.0
    }}
  }
  feature {
    key: "my-text"
    value { bytes_list {
      value: "this"
      value: "product"
      value: "is"
      value: "for sale"
      value: "within"
      value: "us"
    }}
  }
}

То есть, я предполагаю, что у вас есть два типа функций: один - цена продукта, а другой - текстовое описание продукта. Ваш словарный список будет расширенным

["this", "product", "is", "for sale", "within", "us"].
 andrewm489416 апр. 2018 г., 19:50
PS Это вопрос, который я только что задал, но ваш ответ говорит о том, что я его обдумываю.stackoverflow.com/q/49861235/1919374
 andrewm489416 апр. 2018 г., 19:49
Знаете ли вы, работает ли это так, как вы говорите, если я просто читаю из CSV-файлов через набор данных API. Так что, если я передам строковую функцию типа «это комментарий», то при просмотре словарного файла он будет выделять слова, а не искать единственное «слово» «это комментарий». Я не вижу в документах ничего, что могло бы предложить это, так что, возможно, я обдумал это.

Ваш ответ на вопрос