Как извлечь ключевые слова с помощью TFIDF для каждой строки в Python?
У меня есть столбец, в котором есть только текст. Мне нужно извлечь ключевые слова из каждой строки с помощью TFIDF.
Пример ввода:
df['Text']
'I live in India',
'My favourite colour is Red',
'I Love Programming'
Ожидаемый результат:
df[Text] df[Keywords]
'I live in India' 'live','India'
'My favourite colour is Red' 'favourite','colour','red'
'I Love Programming' 'love','programming'
Как мне это получить? Я попытался написать приведенный ниже код
tfidf = TfidfVectorizer(max_features=300, ngram_range = (2,2))
Y = df['Text'].apply(lambda x: tfidf.fit_transform(x))
Я получаю следующую ошибку Iterable по ожидаемым необработанным текстовым документам, получен строковый объект.
3 ответа
Попробуйте код ниже, если вы хотите токенизировать свои предложения:
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
df = pd.DataFrame({'Text':['I live in India', 'My favourite colour is Red', 'I Love Programming']})
df['Keywords'] = df.Text.apply(lambda x: nltk.word_tokenize(x))
stops = list(stopwords.words('english'))
df['Keywords'] = df['Keywords'].apply(lambda x: [item for item in x if item.lower() not in stops])
df['Keywords'] = df['Keywords'].apply(', '.join)
print(df)
Text Keywords
0 I live in India live, India
1 My favourite colour is Red favourite, colour, Red
2 I Love Programming Love, Programming
Функция TfidfVectorizer fit_transform ожидает, что итеративный тип (например, набор, список и т. Д.) Предложений \ документов соответствует оценке TfIdf.
Итак, что вам нужно сделать на самом деле -
Y = tfidf.fit_transform(df['Text'])
Как уже отмечали некоторые люди, есть несколько проблем с вашим кодом и подходом, первая из них - это то, что вы не должны использовать TfIdf
для этой задачи (TfIdf не предназначен для использования в небольших корпусах). Тебе лучше использоватьRAKE
или flashtext KeywordExtractor
.
Другая проблема с вашим кодом заключается в том, что вы пытаетесь получить "униграммы" из своего текста, но при этом настроили ngram_range
в векторизаторе до (2,2), что означает, что он найдет только "биграммы" (фразы, состоящие из двух слов).
Если вы настаиваете на том, чтобы сделать это с выбранным вами подходом, сначала вам нужно разделить предложения в вашем df['text'] по одному на строку (для этого вы можете использовать часть решения @ManojK), а затем передать текст из каждой строки как список:
Y = df['Text'].apply(lambda x: tfidf.fit_transform([x]))
Однако, если вы хотите извлечь имена функций (которые, по сути, являются вашими ключевыми словами), вам нужно написать функцию для get_feature_names()
после каждой итерации вашего векторизатора (lambda x:
) функция.