#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 . Как говорится в ошибке: все, что не является строкой или байтоподобным объектом, вызывает ошибку. Если вы ограничите его конкретным случаем ошибки, это может оказаться бесполезным