Coursera深度学习NLP课程C3W2作业:tokenize_labels函数报错排查
问题排查与解决:tokenize_labels函数中的TypeError错误
问题场景
在Coursera深度学习专项课程NLP部分C3W2作业的tokenize_labels评分函数中,执行label_seq_np = np.array(label_seq)-1时触发如下错误:
TypeError: unsupported operand type(s) for -: 'list' and 'int'
函数代码如下:
def tokenize_labels(all_labels, split_labels): """ Tokenizes the labels Args: all_labels (list of string): labels to generate the word-index from split_labels (list of string): labels to tokenize Returns: label_seq_np (array of int): tokenized labels """ ### START CODE HERE # Instantiate the Tokenizer (no additional arguments needed) label_tokenizer = Tokenizer() # Fit the tokenizer on all the labels label_tokenizer.fit_on_texts(all_labels) # Convert labels to sequences label_seq = label_tokenizer.texts_to_sequences(split_labels) # Convert sequences to a numpy array. Don't forget to substact 1 from every entry in the array! label_seq_np = np.array(label_seq)-1 <----------- 出错位置 ### END CODE HERE return label_seq_np
错误原因
Tokenizer.texts_to_sequences()返回嵌套列表结构:每个标签对应一个单元素子列表(如[[1], [2], [3]]),若存在未在all_labels中定义的标签,还会生成空列表[]。- 直接将含空列表的嵌套列表转为numpy数组时,数组元素类型会变为
object(即列表类型),此时执行-1操作会触发“列表与整数无法运算”的类型错误。 - 即使无空列表,转换后的二维数组也不符合题目要求的一维整数数组返回格式。
解决方案
先将嵌套列表展平为一维列表,再转换为numpy数组并执行减1操作:
修改后的核心代码如下:
### START CODE HERE # Instantiate the Tokenizer (no additional arguments needed) label_tokenizer = Tokenizer() # Fit the tokenizer on all the labels label_tokenizer.fit_on_texts(all_labels) # Convert labels to sequences label_seq = label_tokenizer.texts_to_sequences(split_labels) # 展平嵌套列表(假设所有split_labels中的标签都在all_labels中,无空列表) flattened_labels = [seq[0] for seq in label_seq] # 转换为numpy数组并减1 label_seq_np = np.array(flattened_labels) - 1 ### END CODE HERE
若需兼容未在词汇表中的标签(空列表场景),可添加默认值处理:
flattened_labels = [seq[0] if seq else 0 for seq in label_seq]
说明
作业中all_labels应包含split_labels的所有标签,因此无需处理空列表。展平后的一维列表转为numpy数组后,减1操作可正常执行,且返回结果符合题目要求的一维整数数组格式。
内容的提问来源于stack exchange,提问作者Kareem Osman
相关产品推荐
相关产品推荐

