如何解析Bert嵌入后的数据?

2021-04-12 00:52:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在对新闻标题句进行二元分类。(以确定新的是否有政治偏见) 我使用的是从https://pypi.org/project/bert-embedding/嵌入训练句(一个原始的一个标题句)在数据帧中嵌入训练句,然后将向量化的数据输入logistic回归,但是Bert嵌入的输出数据形状不支持logistic回归模型。我如何分析这个逻辑回归模型?在

在我使用tifdevectorizer之前,它工作得很好,输出的是numpy数组

[[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个培训数据。 输出形状包括:

^{pr2}$

但当我换上贝特·安 一行的输出向量是numpy数组列表

[list([array([ 9.79349554e-01, -7.06475616e-01 ...... ]dtype=float32),
 array([ ........ ],dtype=float32), ......................
 array([ ........ ],dtype=float32)]

输出形状如下: 列车形状:(516,1)试验形状(129,1) 列车形状:(516,)试验形状(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:用序列设置数组元素。 我期望Bert:train_x.shape: (516, 1) test_x.shape (129, 1)的输出形状与tifd:train_x.shape: (516, 1903) test_x.shape (129, 1903)的输出形状相似,因此它适合logistic模型