Ошибка типа NLTK: нехешируемый тип: ‘список’

#python #nltk #lemmatization

#python #nltk #лемматизация

Вопрос:

В настоящее время я работаю над лемантизацией слова из файла csv, где впоследствии я передал все слова строчными буквами, удалил все знаки препинания и разделил столбец.

Я использую только два столбца CSV: analyze.info() :

 <class 'pandas.core.frame.DataFrame'> RangeIndex: 4637 entries, 0 to 4636. Data columns (total 2 columns):
#   Column          Non-Null Count  Dtype
0   Comments        4637 non-null   object
1   Classification  4637 non-null   object

import string
import pandas as pd
from nltk.corpus import stopwords
from nltk.stem import 

analyze = pd.read_csv('C:/Users/(..)/Talk London/ALL_dataset.csv', delimiter=';', low_memory=False, encoding='cp1252', usecols=['Comments', 'Classification'])

lower_case = analyze['Comments'].str.lower()

cleaned_text = lower_case.str.translate(str.maketrans('', '', string.punctuation))

tokenized_words = cleaned_text.str.split()

final_words = []
for word in tokenized_words:
    if word not in stopwords.words('english'):
       final_words.append(word)

wnl = WordNetLemmatizer()
lemma_words = []
lem = ' '.join([wnl.lemmatize(word) for word in tokenized_words])
lemma_words.append(lem)
  

Когда я запускаю код, возвращаю эту ошибку:

Обратная трассировка (последний последний вызов):
файл «C:/Users/suiso/PycharmProjects/SA_working/SA_Main.py «, строка 52, в lem = ‘ ‘.join([wnl.lemmatize(word) для слова в tokenized_words])
Файл «C:/Users/suiso/PycharmProjects/SA_working/SA_Main.py «, строка 52, в lem = ‘ ‘.join([wnl.lemmatize(word) для слова в tokenized_words])
Файл «C:UserssuisoPycharmProjectsSA_workingvenvlibsite-packagesnltkstemwordnet.py «, строка 38, в файле lemmatize lemmas = wordnet._morphy(word, pos)
«C:UserssuisoPycharmProjectsSA_workingvenvlibsite-packagesnltkcorpusreaderwordnet.py «, строка 1897, в _morphy,
если форма в исключениях:
TypeError: unhashable тип: ‘список’

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

1. какой тип данных word при вызове wnl.lemmatize(word) ? . сделать print(type(word))

2. print(type(word)) возвращает: <класс ‘список’>

3. Это означает, что вы передаете list в lemmatize , и он пытается добавить его в dict или set . Это суть проблемы, с которой вы столкнулись. Прочитайте документы WordNetLemmatizer и посмотрите, какие значения вы можете использовать. см. machinelearningplus.com/nlp/lemmatization-examples-python /…

Ответ №1:

tokenized_words представляет собой столбец списков. Причина, по которой это не столбец строк, заключается в том, что вы использовали split метод. Итак, вам нужно использовать цикл double for следующим образом

 lem = ' '.join([wnl.lemmatize(word) for word_list in tokenized_words for word in word_list])