ошибка re.sub с «ожидаемой строкой или байтоподобным объектом»

#pandas #dataframe #nlp #nltk

Вопрос:

Я прочитал несколько сообщений об этой ошибке, но я все еще не могу ее понять. Когда я пытаюсь выполнить цикл через свою функцию:

 def fix_Plan(location):
    letters_only = re.sub("[^a-zA-Z]",  # Search for all non-letters
                          " ",          # Replace all non-letters with spaces
                          location)     # Column and row to search    

    words = letters_only.lower().split()     
    stops = set(stopwords.words("english"))      
    meaningful_words = [w for w in words if not w in stops]      
    return (" ".join(meaningful_words))    

col_Plan = fix_Plan(train["Plan"][0])    
num_responses = train["Plan"].size    
clean_Plan_responses = []

for i in range(0,num_responses):
    clean_Plan_responses.append(fix_Plan(train["Plan"][i]))
 

Вот ошибка:

 Traceback (most recent call last):
  File "C:/Users/xxxxx/PycharmProjects/tronc/tronc2.py", line 48, in <module>
    clean_Plan_responses.append(fix_Plan(train["Plan"][i]))
  File "C:/Users/xxxxx/PycharmProjects/tronc/tronc2.py", line 22, in fix_Plan
    location)  # Column and row to search
  File "C:UsersxxxxxAppDataLocalProgramsPythonPython36libre.py", line 191, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object
 

Комментарии:

1. Если вы получаете ошибку, всегда публикуйте полную ошибку, включая трассировку стека .

2. Пожалуйста print(train["Plan"][i]) , посмотрите, что это такое. Сделайте это перед вызовом fix_Plan() в цикле for . Я не думаю train["Plan"][i] , что это то, чего вы ожидали.

3. можете ли вы добавить try: except в fix_Plan также, если местоположение:

4. Это строка из документа Excel, отформатированного следующим образом: Редактирование видео: дальнейшее развитие навыков создания видео с использованием таких инструментов, как Wochit, Videolicious и iMovie. Разработайте производственный план, специфичный для спорта, который соответствует усилиям потенциальной аудитории / воздействию. Расширьте навыки HTML / CSS и определите один-два проекта в спорте, которые могли бы выиграть от представления в HTML-истории, а затем реализовать.

5. Вы уверены , что это строка? Попробуйте распечатать type(train['Plan'][i])

Ответ №1:

Как вы указали в комментариях, некоторые значения оказались плавающими, а не строками. Перед передачей вам нужно будет изменить его на strings re.sub . Самый простой способ — изменить location str(location) при использовании re.sub . В любом случае это не помешало бы сделать, даже если это уже a str .

 letters_only = re.sub("[^a-zA-Z]",  # Search for all non-letters
                          " ",          # Replace all non-letters with spaces
                          str(location))
 

Комментарии:

1. Я написал две записные книжки на Jupyter и одну на Kaggle Kernels. Jupyter one работает нормально и выдает правильный вывод. Kaggle Notebook выдает мне ошибку, и я последовал вашему решению, и ошибка была удалена, но теперь предсказание настроений приводит к неправильному результату.

Ответ №2:

Самое простое решение — применить функцию Python str к столбцу, который вы пытаетесь просмотреть.

Если вы используете pandas , это может быть реализовано как:

 dataframe['column_name']=dataframe['column_name'].apply(str)
 

Комментарии:

1. Я бы предложил заполнить значения nan с помощью » dataframe['column_name'] = dataframe['column_name'].fillna('').apply(str) потому что в большинстве случаев люди не захотят, чтобы nan был буквальным «nan»

Ответ №3:

У меня была та же проблема. И очень интересно, что каждый раз, когда я что-то делал, проблема не решалась, пока я не понял, что в строке есть два специальных символа.

Например, для меня текст состоит из двух символов:

amp;lrm; (Метка слева направо) и amp;zwnj; (не соединитель нулевой ширины)

Решением для меня было удалить эти два символа, и проблема была решена.

 import re
mystring = "amp;lrm;Some Time Wamp;zwnj;e"
mystring  = re.sub(r"amp;lrm;", "", mystring)
mystring  = re.sub(r"amp;zwnj;", "", mystring)
 

Я надеюсь, что это помогло кому-то, у кого есть такая проблема, как у меня.

Ответ №4:

Я полагаю, лучше было бы использовать функцию re.match() . вот пример, который может вам помочь.

 import re
import nltk
from nltk.tokenize import word_tokenize
nltk.download('punkt')
sentences = word_tokenize("I love to learn NLP n 'a :(")
#for i in range(len(sentences)):
sentences = [word.lower() for word in sentences if re.match('^[a-zA-Z] ', word)]  
sentences
 

Комментарии:

1. Почему лучше использовать функцию re.match()?

Ответ №5:

по моему опыту в Python, это вызвано значением None во втором аргументе, используемом в функции re.findall() .

 import re
x = re.findall(r"[(.*?)]", None)
 

Можно воспроизвести ошибку с помощью этого примера кода.

Чтобы избежать этого сообщения об ошибке, можно отфильтровать значения null или добавить условие, чтобы исключить их из обработки

Комментарии:

1. Пожалуйста, не забудьте абстрагироваться от общего. Конечно: ничто не может быть проблемой, но это может быть float или int . Как говорится в ошибке: все, что не является строкой или байтоподобным объектом, вызывает ошибку. Если вы ограничите его конкретным случаем ошибки, это может оказаться бесполезным