Как извлечь ключевые слова с помощью 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:) функция.

Другие вопросы по тегам