Как преобразовать твиты в файл .pickle таким же образом, как и в ATAT - PullRequest
0 голосов
/ 08 апреля 2020

Я следую учебному пособию, указанному по ссылке ниже:

https://towardsdatascience.com/bert-for-dummies-step-by-step-tutorial-fb90890ffe03

В учебном пособии используется набор данных Atis, доступный по следующей ссылке:

https://www.kaggle.com/siddhadev/ms-cntk-atis

Этот набор данных содержит 4978 поездных и 893 тестовых речевых высказывания (текст), классифицированных в одно из 26 намерений. Каждый токен в высказывании запроса выравнивается по метке IOB, заполняющей слот

В соответствии с руководством, код для загрузки набора данных ATIS в записную книжку Google Colab:

DATA_DIR="."

# load Pickle file 
def load_ds(fname, verbose=True):
    with open(fname, 'rb') as stream:
        ds,dicts = pickle.load(stream)
    if verbose:
      print('Done  loading: ', fname)
      print('      samples: {:4d}'.format(len(ds['query'])))
      print('   vocab_size: {:4d}'.format(len(dicts['token_ids'])))
      print('   slot count: {:4d}'.format(len(dicts['slot_ids'])))
      print(' intent count: {:4d}'.format(len(dicts['intent_ids'])))
    return ds,dicts

# convert Pickle file to arrays
def load_atis(filename, add_start_end_token=False, verbose=True):
    train_ds, dicts = load_ds(os.path.join(DATA_DIR,filename), verbose)
    t2i, s2i, in2i = map(dicts.get, ['token_ids', 'slot_ids','intent_ids'])
    i2t, i2s, i2in = map(lambda d: {d[k]:k for k in d.keys()}, [t2i,s2i,in2i])
    query, slots, intent =  map(train_ds.get, ['query', 'slot_labels', 'intent_labels'])

    if add_start_end_token:
        i2s[178] = 'BOS'
        i2s[179] = 'EOS'
        s2i['BOS'] = 178
        s2i['EOS'] = 179

    input_tensor = []
    target_tensor = []
    query_data = []
    intent_data = []
    slot_data = []
    to_show = np.random.randint(0, len(query)-1, 5)
    for i in range(len(query)):
        input_tensor.append(query[i])
        slot_text = []
        slot_vector = []
        for j in range(len(query[i])):
            slot_text.append(i2s[slots[i][j]])
            slot_vector.append(slots[i][j])
        if add_start_end_token:
            slot_text[0] = 'BOS'
            slot_vector[0] = 178
            slot_text[-1] = 'EOS'
            slot_vector[-1]= 179
        target_tensor.append(slot_vector)
        q = ' '.join(map(i2t.get, query[i]))
        query_data.append(q.replace('BOS', '').replace('EOS',''))
        intent_data.append(i2in[intent[i][0]])
        slot = ' '.join(slot_text)
        slot_data.append(slot[1:-1])
        if i in to_show and verbose:
          print('Query text:', q)
          print('Query vector: ', query[i])
          print('Intent label: ', i2in[intent[i][0]])
          print('Slot text: ', slot)
          print('Slot vector: ', slot_vector)
          print('*'*74)
    query_data = np.array(query_data)
    intent_data = np.array(intent_data)
    slot_data = np.array(slot_data)
    intent_data_label = np.array(intent).flatten()
    return t2i, s2i, in2i, i2t, i2s, i2in, input_tensor, target_tensor, query_data, intent_data, intent_data_label, slot_data

# load ATIS training dataset
t2i_train, s2i_train, in2i_train, i2t_train, i2s_train, i2in_train, input_tensor_train, target_tensor_train, query_data_train, intent_data_train, intent_data_label_train, slot_data_train = load_atis('atis.train.pkl')

# load ATIS testing dataset
t2i_test, s2i_test, in2i_test, i2t_test, i2s_test, i2in_test, input_tensor_test, target_tensor_test, query_data_test, intent_data_test, intent_data_label_test, slot_data_test = load_atis('atis.test.pkl')

Я хочу заменить ' atis.training.pkl 'и' atis.test.pkl 'с моим набором обучающих и тестовых данных. Теперь проблема заключается в том, чтобы отформатировать мои данные аналогично «atis.test.pkl» и «atis.train.pkl»

. Я использовал следующий код для чтения содержимого atis.test.pkl:

import pickle
pickle_in = open("atis.test.pkl","rb")
example = pickle.load(pickle_in)
print(example)

Я не мог понять вывод. Как отформатировать мои данные как набор данных ATIS? Несколько образцов из моего набора данных:

  1. @ FansMotorola Когда выйдет обновление moto g4 plus oreo?

  2. @ FansMotorola Не видели Обновить. Уже февраль

  3. @ FansMotorola Получено и сегодня в Moto G6.

...