如何正确使用Keras TextVectorization函数对推特文本向量化?
使用Keras TextVectorization实现推特文本TF-IDF向量化(用于二分类)
我在使用Keras的TextVectorization函数处理推特数据集时遇到了困难,查阅文档和相关代码后仍无法解决问题。目前我已经成功用sklearn的TfidfVectorizer完成了推特二分类预测,对应的代码如下:
from sklearn.feature_extraction.text import TfidfVectorizer import numpy as np vectorizer_tfidf = TfidfVectorizer(stop_words='english', max_df=0.5, min_df=0.01) X_train = np.array(X_train).tolist() X_train = list(map(''.join, X_train)) X_val = np.array(X_val).tolist() X_val = list(map(''.join, X_val)) X_train_tfIdf = vectorizer_tfidf.fit_transform(X_train).toarray() X_val_tfIdf = vectorizer_tfidf.transform(X_val).toarray() print(vectorizer_tfidf.get_feature_names_out()[:5])
希望有人能展示用Keras完成该任务的正确方法,我已经查阅了多个网站和教程,但仍未找到合适的解决方案。
解决方案
Keras的TextVectorization可以通过两种方式实现和sklearn TfidfVectorizer一致的TF-IDF向量化,以下是对应你需求的具体实现:
方式1:直接使用TextVectorization的TF-IDF模式(Keras 2.10+支持)
这种方式无需额外计算,直接通过参数配置实现TF-IDF输出:
import tensorflow as tf from tensorflow.keras.layers import TextVectorization import numpy as np # 保持和你原有代码一致的文本预处理步骤 X_train = np.array(X_train).tolist() X_train = list(map(''.join, X_train)) X_val = np.array(X_val).tolist() X_val = list(map(''.join, X_val)) # 初始化向量器,对齐sklearn的参数配置 vectorizer = TextVectorization( stop_words='english', max_tokens=None, max_df=0.5, min_df=0.01, output_mode='tf_idf', output_sequence_length=None ) # 用训练数据拟合向量器 vectorizer.adapt(X_train) # 转换训练集和验证集为TF-IDF矩阵 X_train_tfidf = vectorizer(np.array(X_train)).numpy() X_val_tfidf = vectorizer(np.array(X_val)).numpy() # 查看前5个特征词,对应sklearn的get_feature_names_out() print(vectorizer.get_vocabulary()[:5])
方式2:手动计算TF-IDF(兼容低版本Keras)
如果你的Keras版本不支持output_mode='tf_idf',可以先获取词频计数,再手动计算TF-IDF:
import tensorflow as tf from tensorflow.keras.layers import TextVectorization import numpy as np from sklearn.preprocessing import normalize # 文本预处理步骤不变 X_train = np.array(X_train).tolist() X_train = list(map(''.join, X_train)) X_val = np.array(X_val).tolist() X_val = list(map(''.join, X_val)) # 初始化向量器,输出词频计数 vectorizer = TextVectorization( stop_words='english', max_tokens=None, max_df=0.5, min_df=0.01, output_mode='count' ) vectorizer.adapt(X_train) # 获取词频矩阵 X_train_count = vectorizer(np.array(X_train)).numpy() X_val_count = vectorizer(np.array(X_val)).numpy() # 计算IDF(和sklearn逻辑一致) document_count = X_train_count.shape[0] idf = np.log((document_count + 1) / (np.sum(X_train_count > 0, axis=0) + 1)) + 1 # 计算TF-IDF并做L2归一化 X_train_tfidf = normalize(X_train_count * idf) X_val_tfidf = normalize(X_val_count * idf) # 查看特征词 print(vectorizer.get_vocabulary()[:5])
端到端接入神经网络(可选)
如果后续要训练二分类模型,可以直接把TextVectorization作为模型的第一层,实现端到端流程:
model = tf.keras.Sequential([ vectorizer, tf.keras.layers.Dense(64, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ]) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=10)
内容的提问来源于stack exchange,提问作者Tracyrenee
相关产品推荐
相关产品推荐

