How to solve TypeError: iteration over a 0-d array and TypeError: cannot use a string pattern on a bytes-like object
How to solve TypeError: iteration over a 0-d array and TypeError: cannot use a string pattern on a bytes-like object
我正在尝试对我的数据应用预处理步骤。我有 6 个函数来预处理数据,我在预处理函数中调用这些函数。当我用例句一一尝试这些功能时,它起作用了。
data = "AN example 1 Sentence !!"
def preprocess(data):
data = convert_lower_case(data)
# data = convert_number(data)
# data = remove_punctuation(data)
# data = remove_stopwords(data)
# data = stem_words(data)
# data = lemmatize_word(data)
return data
processed_text = []
processed_text.append(word_tokenize(str(preprocess(data))))
print(processed_text)
但是当我注释掉另一个函数时,它会报错。当我一一注释掉功能时,它给出了不同的错误。
这些是错误:
AttributeError: 'numpy.ndarray' object has no attribute 'split'
TypeError: iteration over a 0-d array
TypeError: cannot use a string pattern on a bytes-like object
这些功能单独工作但不能一起工作的原因可能是什么?我该如何解决这个问题并使用这些函数来预处理我的数据?
提前致谢。
我用过的函数:
def convert_lower_case(data):
return np.char.lower(data)
def remove_stopwords(text):
stop_words = set(stopwords.words("english"))
word_tokens = word_tokenize(text)
filtered_text = [word for word in word_tokens if word not in stop_words]
return filtered_text
def remove_punctuation(data):
punctuationfree="".join([i for i in data if i not in string.punctuation])
return punctuationfree
def stem_words(data):
stemmer = PorterStemmer()
word_tokens = word_tokenize(data)
stems = [stemmer.stem(word) for word in word_tokens]
return stems
def convert_number(data):
temp_str = data.split()
new_string = []
for word in temp_str:
if word.isdigit():
temp = p.number_to_words(word)
new_string.append(temp)
else:
new_string.append(word)
temp_str = ' '.join(new_string)
return temp_str
def lemmatize_word(text):
lemmatizer = WordNetLemmatizer()
word_tokens = word_tokenize(text)
lemmas = [lemmatizer.lemmatize(word, pos ='v') for word in word_tokens]
return lemmas
可以确定的第一个问题是您的 convert_lower_case
return 与它接受的东西不同 - 如果处理得当 可以 完全没问题.但是你一直把你的 data
当作一个字符串,它不再是在 data = convert_lower_case(data)
之后
“但是当我打印它时它看起来像一个字符串”- 是的,但它 不是 一个字符串。你可以看到,如果你这样做:
def convert_lower_case(data):
print(type(data))
new_data = np.char.lower(data)
print(type(new_data))
return new_data
输出:
<class 'str'>
<class 'numpy.ndarray'>
老实说,你在这里有点重新发明轮子,因为 Python 已经有 built-in .lower() 函数,它将 return 你一个实际的 string
类型大写字母变为小写字母。
其他功能可能会出现类似问题。
我正在尝试对我的数据应用预处理步骤。我有 6 个函数来预处理数据,我在预处理函数中调用这些函数。当我用例句一一尝试这些功能时,它起作用了。
data = "AN example 1 Sentence !!"
def preprocess(data):
data = convert_lower_case(data)
# data = convert_number(data)
# data = remove_punctuation(data)
# data = remove_stopwords(data)
# data = stem_words(data)
# data = lemmatize_word(data)
return data
processed_text = []
processed_text.append(word_tokenize(str(preprocess(data))))
print(processed_text)
但是当我注释掉另一个函数时,它会报错。当我一一注释掉功能时,它给出了不同的错误。
这些是错误:
AttributeError: 'numpy.ndarray' object has no attribute 'split'
TypeError: iteration over a 0-d array
TypeError: cannot use a string pattern on a bytes-like object
这些功能单独工作但不能一起工作的原因可能是什么?我该如何解决这个问题并使用这些函数来预处理我的数据?
提前致谢。
我用过的函数:
def convert_lower_case(data):
return np.char.lower(data)
def remove_stopwords(text):
stop_words = set(stopwords.words("english"))
word_tokens = word_tokenize(text)
filtered_text = [word for word in word_tokens if word not in stop_words]
return filtered_text
def remove_punctuation(data):
punctuationfree="".join([i for i in data if i not in string.punctuation])
return punctuationfree
def stem_words(data):
stemmer = PorterStemmer()
word_tokens = word_tokenize(data)
stems = [stemmer.stem(word) for word in word_tokens]
return stems
def convert_number(data):
temp_str = data.split()
new_string = []
for word in temp_str:
if word.isdigit():
temp = p.number_to_words(word)
new_string.append(temp)
else:
new_string.append(word)
temp_str = ' '.join(new_string)
return temp_str
def lemmatize_word(text):
lemmatizer = WordNetLemmatizer()
word_tokens = word_tokenize(text)
lemmas = [lemmatizer.lemmatize(word, pos ='v') for word in word_tokens]
return lemmas
可以确定的第一个问题是您的 convert_lower_case
return 与它接受的东西不同 - 如果处理得当 可以 完全没问题.但是你一直把你的 data
当作一个字符串,它不再是在 data = convert_lower_case(data)
“但是当我打印它时它看起来像一个字符串”- 是的,但它 不是 一个字符串。你可以看到,如果你这样做:
def convert_lower_case(data):
print(type(data))
new_data = np.char.lower(data)
print(type(new_data))
return new_data
输出:
<class 'str'>
<class 'numpy.ndarray'>
老实说,你在这里有点重新发明轮子,因为 Python 已经有 built-in .lower() 函数,它将 return 你一个实际的 string
类型大写字母变为小写字母。
其他功能可能会出现类似问题。