在keras Tokenizer中使用tf–idf

时间:2018-09-07 14:28:34

标签: python python-3.x keras nlp

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

<Context reloadable="true" path="" docBase="${catalina.home}/webapps/app.war" useNaming="true">
    <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />

使用此代码:

IUserStore

我得到以下顺序:

Use of hydrocolloids as cryoprotectant for frozen foods

使用此:

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])

我获得:

[57, 1, 21, 7]

这是有道理的,因为这些是更常用的词。是否可以使用分词器将分词化基于tf–idf

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

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])

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

use
of
as
for

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

2 个答案:

答案 0 :(得分:3)

直到现在(因为Keras总是在更新其功能),没有什么可以产生您想要的东西。

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

sequences = tokenizer.texts_to_matrix(df['Title'], mode='tfidf')

代替:

sequences = tokenizer.texts_to_sequences(df['Title'])

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

答案 1 :(得分:1)

Tokenizer()的num_words参数可以帮助您实现这一目标。

这是文档中的描述:“保留的最大单词数,基于单词频率。仅保留最常见的num_words-1个单词。”

您提供的num_words越小,它将排除的稀有单词越多。如果不指定该参数,则将包括所有单词,即使是最稀有的单词。

构建标记器时,您真正要寻找的是文档频率,即该单词出现在其中的文档数。< em> tf-idf 尚不适用,因为词频是指单词在特定文档中出现的次数。