我有一个数据框,其中第一行的标题列包含以下文本:
<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很有意义。
答案 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 尚不适用,因为词频是指单词在特定文档中出现的次数。