Не удается устранить ошибку типа с использованием Tokenizer.tokenize из NLTK

Вопрос или проблема

Я хочу токенизировать текстовые данные, но не могу продолжить из-за ошибки типа и не знаю, как исправить ошибку. Чтобы дать немного контекста — все столбцы — ‘Код решения’, ‘Заметка о решении’, ‘Описание’, ‘Краткое описание’ содержат текстовые данные на английском языке. Вот код, который я написал:

# Удаление стоп-слов:

    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. Рассмотрим шаги по исправлению ошибок и упрощению вашего кода.

  1. Проверка наличия данных: Убедитесь, что DataFrame dfimpnetc и содержащиеся в нем столбцы действительно загружены до выполнения токенизации. В противном случае это может привести к ошибкам.

  2. Правильное использование DataFrame: Убедитесь, что вы не инициализируете новый DataFrame dfclean_imp_netc без необходимости. Вместо этого вы можете использовать один DataFrame и обновлять его непосредственно.

  3. Согласование названий столбцов: В вашем коде есть небольшие несоответствия в названиях столбцов, например, ‘Shortdescription’ и ‘Short description’. Убедитесь, что названия совпадают.

  4. Оптимизация кода: Группируйте обработку в одном цикле, чтобы избежать дублирования кода.

Вот исправленный код с учетом этих моментов:

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(), чтобы избавиться от различий в регистрах.

Заключение

Пожалуйста, протестируйте обновленный код и убедитесь, что он решает вашу проблему с ошибками типов. Правильное управление данными и структурированная обработка текста помогут избежать подобных проблем в будущем.

Оцените материал
Добавить комментарий

Капча загружается...