【问题标题】:use tf–idf in keras Tokenizer在 keras Tokenizer 中使用 tf-idf
【发布时间】:2019-02-12 22:23:24
【问题描述】:

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

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]

使用这个:

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

增加词汇量大小也会标记不太常见的单词,例如:

hydrocolloids

我打算在下游使用 glove 进行分类任务。保持频繁使用从而可能减少歧视性的词语是否有意义,例如:

use

在吗?也许是的,因为 glove 也会查看上下文,这与我过去使用的词袋方法形成对比。这里 tf–idf 有意义。

【问题讨论】:

    标签: python python-3.x keras nlp


    【解决方案1】:

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

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

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

    当您构建分词器时,您真正需要的是考虑文档频率,即单词出现在文档中的数量。tf-idf 尚不适用,因为词频指的是一个词在特定文档中出现的次数。

    【讨论】:

      【解决方案2】:

      直到现在(因为 Keras 总是在更新它的功能),没有什么可以产生你想要的..

      但它有一个使用 Tf-Idf 方案而不是频率来表示序列的函数。:

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

      代替:

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

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

      【讨论】:

      • 但是这是通过 tf-idf 分数过滤到最上面的单词还是简单地使用 tf-idf 对矩阵进行编码?
      猜你喜欢
      • 2020-05-28
      • 2020-11-08
      • 2019-02-10
      • 2015-05-07
      • 2021-04-30
      • 2019-05-24
      • 2017-11-14
      • 1970-01-01
      • 2018-09-19
      相关资源
      最近更新 更多