Как токенизировать список списков списков строк - PullRequest
0 голосов
/ 22 января 2020

У меня есть текстовый набор данных, который представляет собой список списков списков строк. Мне нужно Tokenize эти данные, чтобы вписать их в модель классификации. Я очень хорошо знаю, как использовать keras.preprocessing.text.Tokenizer, и часто делаю это с помощью приведенного ниже кода:

data = 
    [[['not'],
      ['ahead'],
      ['um let me think'],
      ['thats not very encouraging if they had a cast of thousands on the other end']],
      [['okay civil liberties tell me your position'],
     ['probably would go ahead']],
     [['oh'],
     ['it up so i dont know where you really go'],
     ['well most of my problem with this latest task'],
     ['its some i kind of dont want to put in the time to do it'],
     ['right so im saying ive got a lot of other things to do']]]

tokenizer = Tokenizer()
tokenizer.fit_on_texts(data)
sequences = tokenizer.texts_to_sequences(data)

Когда я запускаю этот код для своих данных, я получаю следующую ошибку:

2 frames
<ipython-input-44-1da804f42cc8> in main()
     12     # tokenize and vectorize text data to prepare for embedding
     13     tokenizer = Tokenizer()
---> 14     tokenizer.fit_on_texts(new_corpus)
     15     sequences = tokenizer.texts_to_sequences(new_corpus)
     16     word_index = tokenizer.word_index

/usr/local/lib/python3.6/dist-packages/keras_preprocessing/text.py in fit_on_texts(self, texts)
    213                 if self.lower:
    214                     if isinstance(text, list):
--> 215                         text = [text_elem.lower() for text_elem in text]
    216                     else:
    217                         text = text.lower()

/usr/local/lib/python3.6/dist-packages/keras_preprocessing/text.py in <listcomp>(.0)
    213                 if self.lower:
    214                     if isinstance(text, list):
--> 215                         text = [text_elem.lower() for text_elem in text]
    216                     else:
    217                         text = text.lower()

AttributeError: 'list' object has no attribute 'lower'

Это имеет смысл для меня, потому что функция Tokenizer ожидает строку, но получает список. Обычно я бы выравнивал структуру списка, чтобы передать его через функцию Tokenizer.

Однако я не могу этого сделать, потому что структура моего вложенного списка важна для моего моделирования .

Как тогда я могу Tokenize мои данные при сохранении структуры списка? Я хочу рассматривать все это как мой корпус и получать уникальные целочисленные токены слов во всех списках.

Это должно выглядеть примерно так (токенизация выполняется здесь, так что извините, если есть опечатка):

data = 
    [[[0],
      ['1'],
      ['2, 3, 4, 5'],
      ['6, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19']],
      [['20, 21, 22, 23, 3, 24, 25'],
     ['26, 27, 28, 29']],
     [['30'],
     ['31, 32, 33, 34, 35, 36, 37, 38, 39, 40'],
     ['41, 42, 43, 44, 45, 46, 47, 48, 49'],
     ['50, 51, 34, 52, 14, 35, 53, 54, 55, 56, 17, 57, 58, 59, 31'],
     ['60, 61, 62, 63, 64, 65, 12, 66, 14, 67, 68, 59, 31']]]

1 Ответ

2 голосов
/ 22 января 2020

Для сохранения структуры и индексации вы можете сделать следующее:

tok_data = [y[0] for x in data for y in x]

tokenizer = Tokenizer()
tokenizer.fit_on_texts(tok_data)

sequences = []
for x in data:
  tmp = []
  for y in x:
    tmp.append(tokenizer.texts_to_sequences(y)[0])
  sequences.append(tmp)
...