Я делаю двоичную классификацию для заголовков в новостях.(Чтобы определить, является ли новое политически предвзятым) Я использую вложение Берта из https://pypi.org/project/bert-embedding/ для встраивания обучающих предложений (одно необработанное одно заглавное предложение) в кадры данных, а затем подает векторизованные данные в логистическую регрессию, но форма выходных данных извложение Берта не поддерживает модель логистической регрессии.Как я могу проанализировать это, чтобы привести его в соответствие с моделью логистической регрессии?
До того, как я использовал tifdVectorizer, он работает отлично, и вывод представляет собой массив с пустым фрагментом, такой как
[[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
...
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]
[0. 0. 0. ... 0. 0. 0.]]
, каждая строка векторизовывает данные для одного предложенияИ это массив размером 1903. И у меня есть 516 названий в обучающих данных.Выходные формы:
train_x.shape: (516, 1903) test_x.shape (129, 1903)
train_y.shape: (516,) test_y.shape (129,)
Но после того, как я переключился на Bert_Embedding, выходной вектор для ОДНОЙ строки представляет собой список пустых массивов, например
[list([array([ 9.79349554e-01, -7.06475616e-01 ...... ]dtype=float32),
array([ ........ ],dtype=float32), ......................
array([ ........ ],dtype=float32)]
, выходная форма имеет вид: train_x.shape:(516, 1) test_x.shape (129, 1) train_y.shape: (516,) test_y.shape (129,)
def transform_to_Bert(articles_file: str, classified_articles_file: str):
df = get_df_from_articles_file(articles_file, classified_articles_file)
df_train, df_test, _, _ = train_test_split(df, df.label, stratify=df.label, test_size=0.2)
bert_embedding = BertEmbedding()
df_titles_values=df_train.title.values.tolist()
result_train = bert_embedding(df_titles_values)
result_test = bert_embedding(df_test.title.values.tolist())
train_x = pd.DataFrame(result_train, columns=['A', 'Vector'])
train_x = train_x.drop(columns=['A'])
test_x = pd.DataFrame(result_test, columns=['A', 'Vector'])
test_x=test_x.drop(columns=['A'])
test_x=test_x.values
train_x=train_x.values
print(test_x)
print(train_x)
train_y = df_train.label.values
test_y = df_test.label.values
return {'train_x': train_x, 'test_x': test_x, 'train_y': train_y, 'test_y': test_y, 'input_length': train_x.shape[1], 'vocab_size': train_x.shape[1]}
Столбец A представляет собой исходную строку заголовка в результате.Поэтому я просто опускаю его.
Ниже приведен код, в котором я использую векторный шаблон tifd, который работает для логистической модели.
def transform_to_tfid(articles_file: str, classified_articles_file: str):
df = get_df_from_articles_file(articles_file, classified_articles_file)
df_train, df_test, _, _ = train_test_split(df, df.label, stratify=df.label, test_size=0.2)
vectorizer = TfidfVectorizer(stop_words='english', )
vectorizer.fit(df_train.title)
train_x= vectorizer.transform(df_train.title)
train_x=train_x.toarray()
print(type(train_x))
print(train_x)
test_x= vectorizer.transform(df_test.title)
test_x=test_x.toarray()
print(test_x)
train_y = df_train.label.values
test_y = df_test.label.values
return {'train_x': train_x, 'test_x': test_x, 'train_y': train_y, 'test_y': test_y, 'input_length': train_x.shape[1], 'vocab_size': train_x.shape[1]}
model=LogisticRegression(solver='lbfgs')
model.fit(train_x, train_y)
ошибка ValueError: установка элемента массива с помощьюпоследовательность.Я ожидал, что выходная форма от Берта: train_x.shape: (516, 1) test_x.shape (129, 1)
такая же, как от tifd: train_x.shape: (516, 1903) test_x.shape (129, 1903)
, так что она соответствует логистической модели