运行错误 帮我看一下
来源:11-7 文本情感分类-dataset类定义

Insing
2023-09-04
data_path = r"G:\AI\datafile\weibo_senti_100k.csv"
data_stop_path = r"G:\AI\datafile\hit_stopword" # 进行过滤
dict_path = r"G:\AI\datafile\dict"
#利用分词的字典 以及分词的工具搭建dataset
#自定义在训练模型的时候的用到的数据类
from torch.utils.data import Dataset,DataLoader
import jieba
import numpy as np
#写一个方法 读取字典
def read_dict(voc_dict_path):
# 遍历的数据给新的字典
voc_dict = {}
dict_list = open(voc_dict_path, encoding=‘utf-8’).readlines()
#字典中的文本数据进行遍历
for item in dict_list:
#通过都好进行分割
item = item.split(",")
#0是key 1是索引 数据因为是字符串 需要转换
voc_dict[item[0]] = int(item[1].strip())
return voc_dict
#分词的py文件的内容copy过来 需要2个路径
def load_data(data_path,data_stop_path):
data_list = open(data_path, encoding=‘utf-8’).readlines()[1:]
stops_word = open(data_stop_path, encoding=‘utf-8’).readlines() # 分词
stops_word = [line.strip() for line in stops_word] # 获取到了停用词字典
stops_word.append(" “) # 空格不能在停用词里面
stops_word.append(”\n") # 换行也一样 注意感叹号不能放在停用词中 因为感叹号是情感的一部分
# 获定义一个字典
voc_dict = {}
max_len_seq = 0 #定义一个最长句子的变量
#最终的数据
data = []
for item in data_list[:1000]:
label = item[0] #
content = item[2:].strip()
seg_list = jieba.cut(content, cut_all=False)
# 不在的放到列表汇总
seg_res = []
for seg_item in seg_list:
# 判断分词结果是否在停用词字典中
if seg_item in stops_word:
# 如果在字典中
continue
seg_res.append(seg_item)
# 判断词是否在字典中 此时此刻的数据是通过jieba分词之后且用停用词过滤的数据
if seg_item in voc_dict.keys():
# 如果在当前的词在字典里面就对当前的字典的kye的值进行+1
voc_dict[seg_item] = voc_dict[seg_item] + 1
else:
# 否则就把次加进来
voc_dict[seg_item] = 1
# 在进行数据的处理中 需要将pad到固定的长度 最长的作为分界线 我们需要统计一下最长的句子的长度
if len(seg_res) > max_len_seq:
max_len_seq = len(seg_res)
#分词后的标签和数据放入data这个列表中 data中的数据是标签和队友的分词数量
data.append([label,seg_res])
#最终返回 数据 和 最长句子的长度
return data, max_len_seq
#写一个类 继承dataset
class text_CLS(Dataset):
def init(self,voc_dict_path,data_path,data_stop_path):
self.data_path =data_path
self.data_stop_path = data_stop_path # 进行过滤
#初始化 加载字典voc_dict就是读取到的数据
self.voc_dict = read_dict(voc_dict_path)
#定义好字典以后 加载训练数据 在放入第三个参数 训练数据 需要进行分词处理
#z最终返回的是分词后的数据和最长句子的长度
self.data,self.max_len_seq = load_data(self.data_path,self.data_stop_path)
#拿到数据之后定义 对数据进行打乱
np.random.shuffle(self.data)
def __len__(self):
return len(self.data)
def __getitem__(self, item):
data = self.data[item]
label = data[0]
word_list = data[1]
inpu_udx = []
#对word进行遍历 转化为对应的ID
for word in word_list:
#word是不是在当前的字典中 如果在就取到字典中对应的索引
if word in self.voc_dict.keys():
inpu_udx.append(self.voc_dict[word])
else:#如果不在 传入一个unk
inpu_udx.append(self.voc_dict["<UNK>"])
#之后在判断长度是否是最大 不是最大就传入循环填入PAD 占据位置 使其每个patch的大小相同
if len(inpu_udx) < self.max_len_seq:
inpu_udx+=[self.voc_dict["<PAD>"] for _ in range(self.max_len_seq - len(inpu_udx))]
#最后把它转换一下 放到数组 在返回它
data = np.array(inpu_udx)
return label,data
#定义一个dataloader
def data_loader(dict_path,data_path,data_stop_path):
dataset = text_CLS(dict_path,data_path,data_stop_path)
return DataLoader(dataset,batch_size=10,shuffle=True)
#通过maain调用定义的方法
if name == ‘main’:
data_path = r"G:\AI\datafile\weibo_senti_100k.csv"
data_stop_path = r"G:\AI\datafile\hit_stopword" # 进行过滤
dict_path = r"G:\AI\datafile\dict"
# 实例化一个data_loader
train_dataloader = data_loader(data_path,data_stop_path,dict_path)
#遍历data_loader
for i,batch in enumerate(train_dataloader):
print(batch)
报错:Traceback (most recent call last):
File “D:\bigdata\PythonProject\classfile\jieba情感分析_搭建dataset2.py”, line 118, in
train_dataloader = data_loader(data_path,data_stop_path,dict_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “D:\bigdata\PythonProject\classfile\jieba情感分析_搭建dataset2.py”, line 107, in data_loader
dataset = text_CLS(dict_path,data_path,data_stop_path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “D:\bigdata\PythonProject\classfile\jieba情感分析_搭建dataset2.py”, line 72, in init
self.voc_dict = read_dict(voc_dict_path)
^^^^^^^^^^^^^^^^^^^^^^^^
File “D:\bigdata\PythonProject\classfile\jieba情感分析_搭建dataset2.py”, line 20, in read_dict
voc_dict[item[0]] = int(item[1].strip())
^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: ‘review’
1回答
-
会写代码的好厨师
2023-09-07
voc_dict = {}
dict_list = open(voc_dict_path, encoding=‘utf-8’).readlines()
#字典中的文本数据进行遍历
for item in dict_list:
#通过都好进行分割
item = item.split(",")
#0是key 1是索引 数据因为是字符串 需要转换
voc_dict[item[0]] = int(item[1].strip())这几行代码的意思是按照行读取文件中的数据,然后,按照逗号切分成字符串,然后,在去掉字符串中的空格,之后转成int。这里的报错看起来是是切分出来的字符串没办法转int,所以可以把item[1]打出来看看是不是数字
00
相似问题