使用Tokenizer生成序列时遇numpy.ndarray无lower属性错误
解决Tokenizer处理时的AttributeError问题
嘿,这个错误我太熟了!咱们先搞明白为啥会出这个问题:
你调用tockenizer_left.texts_to_sequences(x_left)时触发了AttributeError: 'numpy.ndarray' object has no attribute 'lower',本质原因是Tokenizer的texts_to_sequences方法需要输入由字符串组成的可迭代对象(比如列表),但你的x_left是numpy数组,而且可能数组里的元素还不是字符串类型——当Tokenizer尝试对每个文本执行lower()转小写时,numpy数组本身没有这个方法,自然就报错了。
另外我还发现你代码里有几个小坑,一起给你修正:
具体解决步骤
1. 确保输入文本是字符串列表
先把numpy数组转成字符串类型的列表,这样Tokenizer才能正确处理:
# 假设x_left是numpy数组,先转成字符串列表 x_left = x_left.astype(str).tolist() x_right = x_right.astype(str).tolist()
2. 修正pad_sequences的参数错误
你代码里的pad_sequences调用有两处错误:
x_left_pad = pad_sequences(tockenizer_left, maxlen=max_seq_length):第一个参数应该是生成的tokens序列x_left_tokens,不是Tokenizer对象x_right_pad = pad_sequences(x_right_tokens,xlen=max_seq_length):参数名写错了,应该是maxlen而不是xlen
3. 统一使用一个Tokenizer(关键!)
你现在用了两个Tokenizer分别处理左右文本,这会导致两边的词汇表不统一——Manhattan LSTM需要左右文本共享同一个嵌入空间,否则模型没法正确计算语义相似度。所以应该用一个Tokenizer拟合所有训练文本(左+右):
修正后的完整代码示例
max_nb_words = 50000 # 计算最大序列长度,简化写法 seq_lengths = [len(s) for s in data_train['Data_Name_left'].values] + [len(s) for s in data_train['Data_Name_right'].values] max_seq_length = max(seq_lengths) # 只用一个Tokenizer,拟合所有训练文本 tokenizer = Tokenizer(num_words=max_nb_words, filters='!"#$%&()*+,-./:;<=>?@[\]^_`{|}~', lower=True) tokenizer.fit_on_texts(data_train['Data_Name_left'].values.tolist() + data_train['Data_Name_right'].values.tolist()) # 处理左文本 x_left = x_left.astype(str).tolist() x_left_tokens = tokenizer.texts_to_sequences(x_left) x_left_pad = pad_sequences(x_left_tokens, maxlen=max_seq_length) # 处理右文本 x_right = x_right.astype(str).tolist() x_right_tokens = tokenizer.texts_to_sequences(x_right) x_right_pad = pad_sequences(x_right_tokens, maxlen=max_seq_length) # 词汇表大小用统一的tokenizer计算 vocab_size = len(tokenizer.word_index) + 1
这样调整后,不仅能解决lower()的错误,还能保证左右文本使用相同的词汇映射,更符合Manhattan LSTM的建模需求。
内容的提问来源于stack exchange,提问作者Ivan Pozniak
相关产品推荐
相关产品推荐

