Одно горячее предложение кодирования - PullRequest
0 голосов
/ 12 февраля 2019

Здесь моя реализация однонаправленной кодировки:

%reset -f

import numpy as np 
import pandas as pd

sentences = []
s1 = 'this is sentence 1'
s2 = 'this is sentence 2'

sentences.append(s1)
sentences.append(s2)

def get_all_words(sentences) : 

  unf = [s.split(' ') for s in sentences]

  all_words = []

  for f in unf : 
    for f2 in f : 
      all_words.append(f2)

  return all_words



def get_one_hot(s , s1 , all_words) : 
  flattened = []
  one_hot_encoded_df = pd.get_dummies(list(set(all_words)))
  for a in [np.array(one_hot_encoded_df[s]) for s in s1.split(' ')] : 
    for aa in a : 
      flattened.append(aa)

  return flattened

all_words = get_all_words(sentences)

print(get_one_hot(sentences , s1 , all_words))

print(get_one_hot(sentences , s2 , all_words))

, это возвращает:

[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0]
[1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]

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

Я думаю, что кодировки должны быть?:

s1 -> 1, 1, 1, 1
s2 -> 1, 1, 1, 0

1 Ответ

0 голосов
/ 12 февраля 2019

Кодировка на уровне символов

Это из-за цикла:

  for f in unf : 
    for f2 in f : 
      all_words.append(f2)

, что f2 зацикливается на символах строки f.Действительно, вы можете переписать всю функцию так:

def get_all_words(sentences) :
  unf = [s.split(' ') for s in sentences]
  return list(set([word for sen in unf for word in sen]))

правильное кодирование в горячем режиме

Этот цикл

  for a in [np.array(one_hot_encoded_df[s]) for s in s1.split(' ')] : 
    for aa in a : 
      flattened.append(aa)

фактически выполняеточень длинный вектор.Давайте посмотрим на вывод one_hot_encoded_df = pd.get_dummies(list(set(all_words))):

   1  2  is  sentence  this
0  0  1   0         0     0
1  0  0   0         0     1
2  1  0   0         0     0
3  0  0   1         0     0
4  0  0   0         1     0

, цикл выше выбирает соответствующие столбцы из этого кадра данных и добавляет к выводу flattened.Мое предложение будет заключаться в том, чтобы просто использовать функцию панд, чтобы вы могли выделить несколько столбцов, затем суммировать их и обрезать либо до 0, либо до 1, чтобы получить закодированный вектор в горячем виде:

def get_one_hot(s , s1 , all_words) :
  flattened = []
  one_hot_encoded_df = pd.get_dummies(list(set(all_words)))
  return one_hot_encoded_df[s1.split(' ')].T.sum().clip(0,1).values

вывод будет:

[0 1 1 1 1]
[1 1 0 1 1]

Для ваших двух предложений соответственно.Вот как их интерпретировать: из индексов строк one_hot_encoded_df dataframe мы знаем, что мы используем 0 для 2, 1 для this, 2 для 1 и т. Д. Таким образом, вывод [0 1 1 1 1] означает всепредметы в сумке слов, кроме 2, которые можно подтвердить вводом 'this is sentence 1'

...