Я знаю, что мои объяснения довольно длинные, но я посчитал это необходимым. Надеюсь, что кто-то терпелив и полезен для души :) Я занимаюсь анализом настроений в проекте и застрял в подготовительной части. Я сделал импорт файла CSV, превратил его в фрейм данных, преобразовал переменные / столбцы в нужные типы данных. Затем я проделал токенизацию следующим образом: я выбрал переменную, которую хотел токенизировать (твитнуть содержимое) в фрейме данных (df_tweet1):
# Tokenization
tknzr = TweetTokenizer()
tokenized_sents = [tknzr.tokenize(str(i)) for i in df_tweet1['Tweet Content']]
for i in tokenized_sents:
print(i)
В результате получается список со словами (токенами).
Затем я выполняю удаление стоп-слов:
# Stop word removal
from nltk.corpus import stopwords
stop_words = set(stopwords.words("english"))
#add words that aren't in the NLTK stopwords list
new_stopwords = ['!', ',', ':', '&', '%', '.', '’']
new_stopwords_list = stop_words.union(new_stopwords)
clean_sents = []
for m in tokenized_sents:
stop_m = [i for i in m if str(i).lower() not in new_stopwords_list]
clean_sents.append(stop_m)
Вывод такой же, но без стоп-слов
Следующие два шага сбивают меня с толку (часть маркировка речи и лемматизация). Я попробовал две вещи:
1) Преобразовать предыдущий вывод в список строк
new_test = [' '.join(x) for x in clean_sents]
, так как я думал, что это позволит мне использовать этот код для выполнения обоих шагов в одном:
from pywsd.utils import lemmatize_sentence
text = new_test
lemm_text = lemmatize_sentence(text, keepWordPOS=True)
Я получил эту ошибку: TypeError: ожидаемая строка или байтовоподобный объект
2) Выполнить POS и лемматизировать отдельно. Первый POS с использованием clean_sents в качестве входных данных:
# PART-OF-SPEECH
def process_content(clean_sents):
try:
tagged_list = []
for lst in clean_sents[:500]:
for item in lst:
words = nltk.word_tokenize(item)
tagged = nltk.pos_tag(words)
tagged_list.append(tagged)
return tagged_list
except Exception as e:
print(str(e))
output_POS_clean_sents = process_content(clean_sents)
Выходными данными является список списков со словами с прикрепленным тегом. Затем я хочу лемматизировать этот вывод, но как? Я попробовал два модуля, но оба дали мне ошибку:
from pywsd.utils import lemmatize_sentence
lemmatized= [[lemmatize_sentence(output_POS_clean_sents) for word in s]
for s in output_POS_clean_sents]
# AND
from nltk.stem.wordnet import WordNetLemmatizer
lmtzr = WordNetLemmatizer()
lemmatized = [[lmtzr.lemmatize(word) for word in s]
for s in output_POS_clean_sents]
print(lemmatized)
Ошибки были соответственно:
TypeError: ожидаемая строка или байтовоподобный объект
AttributeError: 'tuple 'объект не имеет атрибута' заканчивается с