已解决ValueError: Incompatible dimension for X and Y matrices: X.shape[1] == 11 while Y.shape[1] == 1

已解决ValueError: Incompatible dimension for X and Y matrices: X.shape[1] == 11 while Y.shape[1] == 1

在使用CountVectorizer时进行文本特征提取,将新闻表示为向量之后,在使用KNN训练数据时出现报错
ValueError: Incompatible dimension for X and Y matrices: X.shape[1] == 11 while Y.shape[1] == 1
原代码如下:

from sklearn.feature_extraction.text import CountVectorizer
vectorizer=CountVectorizer(stop_words=stop_words)
X_train=vectorizer.fit_transform(data_train[3])
X_test=vectorizer.fit_transform(data_test[1])

发现是矩阵不兼容出现的问题,通过查询当前X_train和X_test的shape发现,二者的shape维度列不相同:
在这里插入图片描述

解决方案

将源代码改为:

from sklearn.feature_extraction.text import CountVectorizer
vectorizer=CountVectorizer(stop_words=stop_words)
X_train=vectorizer.fit_transform(data_train[3])
X_test=vectorizer.transform(data_test[1])

此时再次查询shape维度,发现二者维度中列相同,此时重新进行训练,问题成功被解决。
在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据报错信息来看,似乎是因为种子词的编码长度不同导致的维度不匹配错误。你可以尝试使用`tokenizer.encode_plus()`方法来获取种子词的编码和相应的attention mask,然后将编码和attention mask传递给Bert模型,获取词向量。同时,由于种子词的数量较少,所以维度不对的问题可以通过扩展向量维度解决。 以下是修改后的代码: ```python from transformers import BertTokenizer, BertModel import torch import numpy as np from sklearn.metrics.pairwise import cosine_similarity # 人工选取的隐私词列表 seed_words = ['个人信息', '身份证', '手机号码', '银行卡', '密码', '账号', '地址', '社保', '职业', '学历', '收入', '家庭情况'] # 加载Bert tokenizer和模型 tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = BertModel.from_pretrained('bert-base-chinese') model.eval() # 读取微博博文文本语料 with open('weibo_corpus.txt', 'r', encoding='utf-8') as f: corpus = f.readlines() # 对每个词汇获取词向量 vectors = [] for text in corpus: # 对文本进行tokenize和padding inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True) # 获取Bert模型的输出 with torch.no_grad(): outputs = model(**inputs) # 获取隐层输出(即词向量) hidden_states = outputs[0] # 对所有隐层输出取平均得到文本向量 text_vector = torch.mean(hidden_states, dim=1) # 将文本向量转换为numpy数组 text_vector = text_vector.numpy()[0] # 将文本向量添加到向量列表中 vectors.append(text_vector) # 将种子词的词向量与所有词汇的词向量计算余弦相似度 similarities = cosine_similarity(vectors, np.array([model(tokenizer.encode_plus(word, return_tensors='pt')['input_ids'], attention_mask=tokenizer.encode_plus(word, return_tensors='pt')['attention_mask']).last_hidden_state[0].numpy() for word in seed_words])) # 获取每个种子词的关联词汇 related_words = {} for i, word in enumerate(seed_words): # 获取与该种子词余弦相似度大于阈值的词汇 sim_words = [corpus[j] for j in range(len(corpus)) if similarities[j][i] > q] # 合并、去重 related_words[word] = list(set(sim_words)) # 人工筛选 privacy_words = [] for word in seed_words: # 将种子词添加到结果列表中 privacy_words.append(word) # 将关联词汇添加到结果列表中 for related_word in related_words[word]: # 如果关联词汇与已添加的词汇重复,则不加入结果列表 if related_word not in privacy_words: privacy_words.append(related_word) # 对结果列表进行去重 privacy_words = list(set(privacy_words)) ``` 在修改后的代码中,我们使用`model()`方法获取种子词的词向量,同时使用`last_hidden_state`属性获取隐层输出,然后将隐层输出转换为numpy数组。此外,我们还将向量的维度从4扩展到768,以解决维度不匹配问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值