Как go о создании вложений (особенно, сопоставление токена с Id) для категориальных столбцов в tenorflow 2.0+? - PullRequest
1 голос
/ 26 апреля 2020

У меня есть csv с категориальным типом и типом float. Я хочу сделать следующее:

  1. Для каждого категориального столбца я буду использовать pandas для вычисления уникальных значений (pd.unique()), которые присутствуют в столбце. скажем u_l для столбца
  2. Я буду использовать len(u_l), чтобы определить размер вложений, который я использую для определенного категориального столбца, который я хочу встраивать (этот шаг - причина, по которой я не могу использовать tennsflow_transform )
  3. Я хочу создать некоторый узел с состоянием, который может сопоставить значение category (token) с индексом вложений, таким образом впоследствии я могу искать матрицу вложений из вложений, которую я создал на шаге 2

I не знаю, как go сделать это сейчас. Очень не элегантное решение, которое я вижу, это использовать tenorflow_daseasets:

  1. encoder = tfds.features.text.TokenTextEncoder(u_l,decode_token_separator=' ')
  2. объединить весь столбец, используя разделитель пробелов (c_l) (c_l теперь является одной строкой) и затем с помощью encoder.encode(c_l)

Это очень базовая c вещь, которую я думаю, с помощью tenorflow можно сделать относительно легко. Пожалуйста, направьте меня к правильному решению

1 Ответ

0 голосов
/ 27 апреля 2020

Если вы хотите использовать ваше слово корпус в качестве встраивания, например, если у вас есть корпус как этот:

корпус:

  1. "Эта паста хороша"
  2. «Эта паста очень хорошая»

, и вы хотите использовать встраивание, вы можете использовать Tokenizer из TF, см. this . Он создаст dict, содержащий слова в качестве ключей и индекс в качестве значения, как в приведенном выше корпусе. Dict выглядит так:

word_index = {"this": 1, "pasta": 2, "good": 3, «очень»: 4} вы можете избежать стоп-слов.

Теперь вы можете сделать вектор встраивания слов, используя эти слова word_index, чтобы он выглядел как

  1. Для корпуса 1: [1, 2 , 3]
  2. Для корпуса 2: [1, 2, 4, 3]

Достаточно разговора, давайте посмотрим код: Также определим oov_token для словарных слов.

Вы можете сделать так:


vocab_size = 10000
embedding_dim = 16
max_length = 120
trunc_type='post'
oov_tok = "<OOV>"

from tensorflow.keras.preprocessing.text import Tokenizer


tokenizer = Tokenizer(num_words = vocab_size, oov_token=oov_tok)
tokenizer.fit_on_texts(training_sentences)
word_index = tokenizer.word_index 
sequences = tokenizer.texts_to_sequences(training_sentences) # This will create word embedding vector
padded = pad_sequences(sequences,maxlen=max_length, truncating=trunc_type) # This will padd zeros according to `trunc_type`, here add zeros in last

testing_sequences = tokenizer.texts_to_sequences(testing_sentences)
testing_padded = pad_sequences(testing_sequences,maxlen=max_length)

Также посмотрите этот GitHub код , надеюсь, это поможет

...