在keras Tokenizer中使用tf–idf

cs0*_*815 3 python nlp python-3.x keras

我有一个数据框,其中第一行的标题列包含以下文本:

Use of hydrocolloids as cryoprotectant for frozen foods
Run Code Online (Sandbox Code Playgroud)

使用此代码:

vocabulary_size = 1000
tokenizer = Tokenizer(num_words=vocabulary_size)
tokenizer.fit_on_texts(df['Title'])
sequences = tokenizer.texts_to_sequences(df['Title'])
print(sequences[0])
Run Code Online (Sandbox Code Playgroud)

我得到这个序列:

[57, 1, 21, 7]
Run Code Online (Sandbox Code Playgroud)

使用这个:

index_word = {v: k for k, v in tokenizer.word_index.items()}
print(index_word[57])
print(index_word[1])
print(index_word[21])
print(index_word[7])
Run Code Online (Sandbox Code Playgroud)

我得到:

use
of
as
for
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为这些是更常用的词。也可以使用分词器将分词基于tf–idf进行吗?

增加vocabularyary_size还会标记频率较低的单词,例如:

hydrocolloids
Run Code Online (Sandbox Code Playgroud)

我打算在下游使用手套进行分类任务。保持频繁,从而减少歧视性的词语,例如:

use
Run Code Online (Sandbox Code Playgroud)

在?也许是的,因为手套也着眼于上下文,这与我过去使用的一揽子单词方法相反。在这里,tf–idf是有意义的。

Gha*_*nem 5

到现在为止(因为Keras总是在更新其功能),所以没有什么可以满足您的需求。

但是它具有使用Tf-Idf方案而不是频率来表示序列的功能:

sequences = tokenizer.texts_to_matrix(df['Title'], mode='tfidf')
Run Code Online (Sandbox Code Playgroud)

代替:

sequences = tokenizer.texts_to_sequences(df['Title'])
Run Code Online (Sandbox Code Playgroud)

另外,作为建议,您可以使用sklearn TfidfVectorizer过滤低频率单词中的文本,然后将其传递给Keras模型。