我最开始为什么会搞这些问题,都是因为这个错误:
所以我去百度了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