首页 > 其他分享 >错误合集

错误合集

时间:2023-04-12 21:00:13浏览次数:26  
标签:words 错误 filePath pickle list file mailContent 合集

我最开始为什么会搞这些问题,都是因为这个错误:

 

所以我去百度了empty vocabulary; perhaps the documents only contain stop words,但是这个错误真的很难搞,百度了一圈也没搞明白解决办法,真的无语。

所以我开始想会不会是我的cutWords.pickle文件出了问题,于是开始打开文件输出:

我的pickle文件你咋了,昨天明明还好好的,咋变红了,好吓人,去搜了一下:

 

应该是文件太大了,所以我只输出了一个就没问题了:

 

所以pickle文件没有问题。

是不是我不该替换为空格呀,因为下面这个就没有分词且替换为空格,当时我为什么替换呀。

 

 它这里的fit_transform(corpus)中的corpus可以是这种吗,然后我突然想起来我之前看到的逻辑回归的博主好像就是这样写的,我要回去看看。而且vectorizer = TfidfVectorizer(tokenizer=preprocess)中的tokenizer=preprocess这个作用是什么啊。

 因为这里要用到mailContent_list,但每次再运行太麻烦了,所以我也把它生成pickle文件了,但是我是pycharm生成的:

 1 import jieba
 2 import re
 3 import os
 4 import pickle
 5 
 6 def getFilePathList2(rootDir):
 7     filePath_list = []
 8     for walk in os.walk(rootDir):
 9         part_filePath_list = [os.path.join(walk[0], file) for file in walk[2]]
10         filePath_list.extend(part_filePath_list)
11     return filePath_list
12 filePath_list = getFilePathList2('./trec06c/data')
13 
14 mailContent_list = []
15 for filePath in filePath_list:
16     with open(filePath, errors='ignore') as file:
17         file_str = file.read()
18         mailContent = file_str.split('\n\n', maxsplit=1)[1]
19         mailContent_list.append(mailContent)
20 mailContent_list = [re.sub('\s+', '', k) for k in mailContent_list]
21 mailContent_list = [re.sub("([^\u4e00-\u9fa5])", '', k) for k in mailContent_list]
22 
23 with open('mailContent_list.pickle', 'wb') as file:
24     pickle.dump(mailContent_list, file)

现在我要试一下博主的代码,就是没有这句:mailContent_list = [re.sub("([^\u4e00-\u9fa5])", '', k) for k in mailContent_list],这时候的输出结果是3241

然后输出看一下这3241个特征词,都是句子,并不是词。

 然后我如果加上了这句:mailContent_list = [re.sub("([^\u4e00-\u9fa5])", '', k) for k in mailContent_list],这时候的输出结果是44

 

 然后也输出看一下这44个特征词,如下图,这哪是特征词,明明是句子:

 

 

 还是按我之前的来,嗯。

 总共有7842个特征词,看下能不能输出来特征词。

 可以欸,可是我在pycharm输不出来欸,就是下面这个错误:

 

 

 

 

 

 

 

 

 怀疑人生了,难道刚刚不能运行是假的。

第二天我又试着运行了一下,也是可以运行的。

于是就到了下面这个问题,特征个数不符,即我分完后只有54个词,而predict()中的参数需要7842个词:

 

于是我想到把特征数扩为相同的,就是下面这个代码:

        # 获取两个列表中的相同元素
        common_elements = np.intersect1d(features, cutWords)
        # 创建一个和features长度相同的全0数组
        words = np.zeros_like(features)  
        for element in common_elements:
            # 获取相同元素在features中的下标
            indices = np.where(np.array(features) == element)
            # 将相同元素在words中的下标设为1
            words[indices] = 1  

并且也实现了,没有任何问题,就是[1,0,0...]这种,我想着改成这种形式了应该不会出错了吧,但我用predict时又提示我出错。

就是这个错误:ValueError: Expected 2D array, got 1D array instead: array=[0. 0. 0. ... 0. 0. 0.]. Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.但是这个错搜都搜不到。

翻译成中文是应该是二维的数组,但我输入的是一维的。

 

 

 根本不会解决。

 

 

 这个错误到底怎么回事啊。

搜了一下二维数组:

于是我去chatGPT上搜到了解决办法,改完之后又出现了下面这个错误:

ValueError: Shape of passed values is (7842, 1), indices imply (7842, 7842),然后又胡搞瞎搞,根本不会。

然后我想到之前看过的一篇文章里有介绍怎么对一封邮件分类,于是我去看他的文章。

 

 好像是这一步:

 

 

 就是将上面扩的列表words改成二维的:words_martrix =pd.DataFrame([words],columns = features)

这样再使用predict函数就不会再出现问题了。下面是使用代码:

 

但是有一个疑问就是我忘记了0和1哪个是正常邮件和垃圾邮件。

于是我print:

 

 

 

 

 与index对比,发现spam垃圾邮件是1:

 

然后这是我的运行结果:

 

 完美!perfect!

 

标签:words,错误,filePath,pickle,list,file,mailContent,合集
From: https://www.cnblogs.com/liuyujie-zhang/p/17308425.html

相关文章