Вопрос или проблема
Я хочу токенизировать текстовые данные, но не могу продолжить из-за ошибки типа и не знаю, как исправить ошибку. Чтобы дать немного контекста — все столбцы — ‘Код решения’, ‘Заметка о решении’, ‘Описание’, ‘Краткое описание’ содержат текстовые данные на английском языке. Вот код, который я написал:
# Удаление стоп-слов:
from nltk.tokenize import sent_tokenize, word_tokenize
from nltk.corpus import stopwords
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'\w+')
stop_words = set(stopwords.words('english'))
tokenizer = RegexpTokenizer(r'\w+')
dfclean_imp_netc=pd.DataFrame()
for column in ['Код решения','Заметка о решении','Описание','Краткое описание']:
dfimpnetc[column] = dfimpnetc[column].apply(tokenizer.tokenize)
for column in ['Код решения','Заметка о решении','Описание','Краткое описание']:
dfclean_imp_netc[column] = dfimpnetc[column].apply(lambda vec: [word for word in vec if word not in stop_words])
dfimpnetc['Заметка о решении'] = dfclean_imp_netc['Заметка о решении']
dfimpnetc['Описание'] = dfclean_imp_netc['Описание']
dfimpnetc['Краткое описание'] = dfclean_imp_netc['Краткое описание']
dfimpnetc['Код решения'] = dfclean_imp_netc['Код решения']
w_tokenizer = nltk.tokenize.WhitespaceTokenizer()
dfimpnetc[column] = dfimpnetc[column].apply(lambda x: [lemmatizer.lemmatize(w) for w in w_tokenizer.tokenize(x)])
Попробуйте указанный выше код.
Отметьте как верный, если это поможет 😉
Согласен с S van Balen
, что неясно, где и загружаете ли вы фактически данные. Даже если вы загрузили их ранее, инициализация нового объекта DataFrame
может стереть его из памяти, если вы используете одно и то же имя переменной для его хранения.
В любом случае, предполагая, что строки и столбцы DataFrame 'dfclean_imp_netc'
действительно были заполнены значениями, то я думаю, что проблема в том, что вы инициализируете фрейм как dfclean_imp_netc
, но затем применяете токенизатор к другой переменной, dfimpnetc
. Мне кажется, вам нужно переместить присваивание значений к dfimpnetc
перед циклами for
, как показано в фрагменте кода ниже.
Обратите внимание также, что два цикла for
не присваивают значения одной и той же переменной: первый цикл
обновляет dfimpnetc
, а второй цикл обновляет dfclean_imp_netc
. У меня есть ощущение, что вы хотите обновлять одну и ту же переменную в обоих случаях.
from nltk.tokenize import sent_tokenize, word_tokenize
from nltk.corpus import stopwords
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'\w+')
stop_words = set(stopwords.words('english'))
tokenizer = RegexpTokenizer(r'\w+')
dfclean_imp_netc=pd.DataFrame()
dfimpnetc['Заметка о решении'] = dfclean_imp_netc['Заметка о решении']
dfimpnetc['Описание'] = dfclean_imp_netc['Описание']
dfimpnetc['Краткое описание'] = dfclean_imp_netc['Краткое описание']
dfimpnetc['Код решения'] = dfclean_imp_netc['Код решения']
for column in ['Код решения','Заметка о решении','Описание','Краткое описание']:
dfimpnetc[column] = dfimpnetc[column].apply(tokenizer.tokenize)
for column in ['Код решения','Заметка о решении','Описание','Краткое описание']:
dfclean_imp_netc[column] = dfimpnetc[column].apply(lambda vec: [word for word in vec if word not in stop_words])
Ответ или решение
Для решения проблемы с ошибкой типа, возникающей при использовании метода Tokenizer.tokenize
из библиотеки NLTK, важно внимательно взглянуть на структуру вашего кода и на то, как вы обрабатываете данные в DataFrame. Рассмотрим шаги по исправлению ошибок и упрощению вашего кода.
-
Проверка наличия данных: Убедитесь, что DataFrame
dfimpnetc
и содержащиеся в нем столбцы действительно загружены до выполнения токенизации. В противном случае это может привести к ошибкам. -
Правильное использование DataFrame: Убедитесь, что вы не инициализируете новый DataFrame
dfclean_imp_netc
без необходимости. Вместо этого вы можете использовать один DataFrame и обновлять его непосредственно. -
Согласование названий столбцов: В вашем коде есть небольшие несоответствия в названиях столбцов, например, ‘Shortdescription’ и ‘Short description’. Убедитесь, что названия совпадают.
-
Оптимизация кода: Группируйте обработку в одном цикле, чтобы избежать дублирования кода.
Вот исправленный код с учетом этих моментов:
import pandas as pd
from nltk.tokenize import RegexpTokenizer
from nltk.corpus import stopwords
# Инициализация токенизатора и стоп-слов
tokenizer = RegexpTokenizer(r'\w+')
stop_words = set(stopwords.words('english'))
# Предполагаем, что dfimpnetc уже загружен и содержит необходимые данные
# Проверим название столбцов и убедимся, что они правильные
columns_to_process = ['Resolution code', 'Resolution Note', 'Description', 'Short description']
# Токенизация и удаление стоп-слов
for column in columns_to_process:
dfimpnetc[column] = dfimpnetc[column].apply(lambda x: tokenizer.tokenize(x.lower()) if isinstance(x, str) else [])
dfimpnetc[column] = dfimpnetc[column].apply(lambda words: [word for word in words if word not in stop_words])
# Подробнее по обработке:
# 1. Применяем токенизацию
# 2. Удаляем стоп-слова
Объяснение:
- Инициализация стоп-слов и токенизатора: Мы создали токенизатор и набор стоп-слов один раз в начале.
- Цикл по столбцам: В одном цикле мы токенизируем текст и убираем стоп-слова. Я также добавил условие для проверки, что значение в ячейке — это строка, чтобы избежать ошибок, если есть пустые значения или другие несоответствующие типы.
- Приведение к нижнему регистру: Для улучшения токенизации добавил
.lower()
, чтобы избавиться от различий в регистрах.
Заключение
Пожалуйста, протестируйте обновленный код и убедитесь, что он решает вашу проблему с ошибками типов. Правильное управление данными и структурированная обработка текста помогут избежать подобных проблем в будущем.