0

我有一列只有文字。我需要使用 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 over raw text documents expected, string object received。

4

3 回答 3

1

TfidfVectorizer fit_transform 函数期望句子\文档的可迭代类型(例如集合、列表等)以适合 TfIdf 分数。

所以你实际上应该做的是——

Y = tfidf.fit_transform(df['Text'])
于 2020-04-20T07:34:39.913 回答
0

如果要标记句子,请尝试以下代码:

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
于 2020-04-20T07:39:20.050 回答
-1

正如一些人已经指出的那样,您的代码和方法存在几个问题,首先是您不应该将其TfIdf用于此任务(TfIdf 不适用于小型语料库)。你会更好地使用RAKEor flashtext KeywordExtractor

您的代码的另一个问题是您试图从文本中获取“unigrams”,但您已将ngram_range矢量化器中的.

如果您坚持使用您选择的方法执行此操作,首先您需要将 df['text'] 中的句子拆分为每行一个(您可以为此使用@ManojK 解决方案的一部分),然后将每行中的文本作为一个列表:

Y = df['Text'].apply(lambda x: tfidf.fit_transform([x]))

但是,如果您想提取特征名称(本质上是您的关键字),则需要在get_feature_names()矢量化器 ( lambda x:) 函数的每次迭代之后编写一个函数。

于 2020-08-19T08:58:28.433 回答