ValueError: TextEncodeInput должен быть Union[TextInputSequence, Tuple[InputSequence, InputSequence]] - ошибка токенизации BERT / Distilbert

def split_data(path):
  df = pd.read_csv(path)
  return train_test_split(df , test_size=0.1, random_state=100)

train, test = split_data(DATA_DIR)
train_texts, train_labels = train['text'].to_list(), train['sentiment'].to_list() 
test_texts, test_labels = test['text'].to_list(), test['sentiment'].to_list() 

train_texts, val_texts, train_labels, val_labels = train_test_split(train_texts, train_labels, test_size=0.1, random_state=100)

from transformers import DistilBertTokenizerFast
tokenizer = DistilBertTokenizerFast.from_pretrained('distilbert-base-uncased

train_encodings = tokenizer(train_texts, truncation=True, padding=True)
valid_encodings = tokenizer(valid_texts, truncation=True, padding=True)
test_encodings = tokenizer(test_texts, truncation=True, padding=True)

Когда я попытался отделиться от фрейма данных с помощью токенизаторов BERT, я получил такую ​​ошибку.

5 ответов

У меня была такая же ошибка. Проблема заключалась в том, что в моем списке не было ни одного, например:

from transformers import DistilBertTokenizerFast

tokenizer = DistilBertTokenizerFast.from_pretrained('distilbert-base-german-cased')

# create test dataframe
texts = ['Vero Moda Damen Übergangsmantel Kurzmantel Chic Business Coatigan SALE',
         'Neu Herren Damen Sportschuhe Sneaker Turnschuhe Freizeit 1975 Schuhe Gr. 36-46',
         'KOMBI-ANGEBOT Zuckerpaste STRONG / SOFT / ZUBEHÖR -Sugaring Wachs Haarentfernung',
         None]

labels = [1, 2, 3, 1]

d = {'texts': texts, 'labels': labels} 
test_df = pd.DataFrame(d)

Итак, прежде чем преобразовать столбцы Dataframe в список, я удаляю все строки None.

test_df = test_df.dropna()
texts = test_df["texts"].tolist()
texts_encodings = tokenizer(texts, truncation=True, padding=True)

Это сработало для меня.

В моем случае мне пришлось установить is_split_into_words=True

https://huggingface.co/transformers/main_classes/tokenizer.html

Последовательность или пакет последовательностей, которые нужно кодировать. Каждая последовательность может быть строкой или списком строк (предварительно токенизированной строкой). Если последовательности представлены в виде списка строк (предварительно токенизированных), вы должны установить is_split_into_words=True (чтобы снять неоднозначность с пакетом последовательностей).

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

      train_texts = train['text'].astype(str).values.to_list()

в токенизаторе первый текст должен быть STR, например: train_encodings = tokenizer(str(train_texts), truncation=True, padding=True)

def split_data(path):
  df = pd.read_csv(path)
  return train_test_split(df , test_size=0.2, random_state=100)

train, test = split_data(DATA_DIR)
train_texts, train_labels = train['text'].to_list(), train['sentiment'].to_list() 
test_texts, test_labels = test['text'].to_list(), test['sentiment'].to_list() 

train_texts, val_texts, train_labels, val_labels = train_test_split(train_texts, train_labels, test_size=0.2, random_state=100)

from transformers import DistilBertTokenizerFast
tokenizer = DistilBertTokenizerFast.from_pretrained('distilbert-base-uncased

train_encodings = tokenizer(train_texts, truncation=True, padding=True)
valid_encodings = tokenizer(valid_texts, truncation=True, padding=True)
test_encodings = tokenizer(test_texts, truncation=True, padding=True)

Попробуйте изменить размер разделения. Это сработает. Это означает, что разделенных данных было недостаточно для токенизации токенизатора.