(3-7)特征提取:TF-IDF特征

3.7  TF-IDF特征

TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于文本特征提取的常用方法,它结合了词频和逆文档频率,用于衡量单词在文本中的重要性。TF-IDF 考虑了一个单词在文本中的频率(TF),以及它在整个文集中的稀有程度(IDF)。

3.7.1  什么是TF-IDF

TF-IDF是“词频-逆文档频率”(Term Frequency-Inverse Document Frequency)的缩写,是一种用于信息检索和文本挖掘的常用文本特征提取方法。TF-IDF的目标是确定一个文档中词汇的重要性,以便帮助理解文档的主题或进行文本相关性排序。

TF-IDF基于如下两个关键概念:

  1. 词频(Term Frequency,TF):词频表示在文档中某个词汇出现的次数。通常,词频越高,该词汇在文档中的重要性越大。
  2. 逆文档频率(Inverse Document Frequency,IDF):逆文档频率表示某个词汇在整个文档集合中的稀有程度。它是一个用于衡量某个词汇在文档集合中的重要性的度量。常见的词汇(如“a”和“the”)在文档集合中出现频繁,因此其逆文档频率较低,而不常见的词汇在文档集合中出现较少,因此其逆文档频率较高。

TF-IDF的计算方式如下:

  1. 词频(TF):对于文档中的每个词汇,计算它在文档中的出现次数。常见的方式是使用原始词频(Raw Term Frequency)或词频的对数形式(Log Term Frequency)。
  2. 逆文档频率(IDF):对于每个词汇,计算它的逆文档频率。通常使用以下公式计算:

其中,N表示文档集合中的总文档数,n表示包含词汇w 的文档数。逆文档频率的目标是惩罚出现在较多文档中的词汇,提高不常见词汇的权重。

  1. TF-IDF:最后,计算每个词汇的TF-IDF分数,它是词汇的词频(TF)与逆文档频率(IDF)的乘积。

TF-IDF的主要思想是,一个词汇在文档中出现频繁(高TF)并且在整个文档集合中不常见(高IDF)时,其权重应该更高,因为它对于区分文档的内容更具信息性。TF-IDF被广泛用于信息检索、文本分类、主题建模、文本摘要等自然语言处理任务中,以提高文本特征的质量。

3.7.2  使用 TF-IDF提取文本特征

在 PyTorch 中,TF-IDF 特征提取需要借助 Scikit-learn 来计算 TF-IDF 值,然后将结果转换为 PyTorch 张量进行模型训练。例如下面是一个PyTorch使用 TF-IDF 特征进行文本特征提取的例子。

实例3-15:PyTorch使用 TF-IDF 特征进行文本特征提取(源码路径:daima\3\ti.py

实例文件ti.py的具体实现代码如下所示。

# 生成示例文本数据和标签
texts = ["this is a positive sentence",
         "this is a negative sentence",
         "a positive sentence here",
         "a negative sentence there"]

labels = [1, 0, 1, 0]

# 划分训练集和验证集
train_texts, val_texts, train_labels, val_labels = train_test_split(texts, labels, test_size=0.2, random_state=42)

# 创建 TF-IDF 特征表示
vectorizer = TfidfVectorizer()
train_features = vectorizer.fit_transform(train_texts).toarray()
val_features = vectorizer.transform(val_texts).toarray()

# 转换为 PyTorch 张量
train_features_tensor = torch.tensor(train_features, dtype=torch.float32)
train_labels_tensor = torch.tensor(train_labels, dtype=torch.float32)
val_features_tensor = torch.tensor(val_features, dtype=torch.float32)
val_labels_tensor = torch.tensor(val_labels, dtype=torch.float32)

# 创建朴素贝叶斯分类器
classifier = MultinomialNB()
classifier.fit(train_features, train_labels)

# 预测并评估模型性能
predictions = classifier.predict(val_features)
accuracy = accuracy_score(val_labels, predictions)
print(f'Validation accuracy: {accuracy:.2f}')

在这个例子中,首先使用 TfidfVectorizer 创建 TF-IDF 特征表示,然后将结果转换为 NumPy 数组,并将其转换为 PyTorch 张量。接着,我们创建了一个朴素贝叶斯分类器,对 TF-IDF 特征进行训练和预测,最后使用 accuracy_score 计算了模型在验证集上的准确率。

在 TensorFlow 中,TF-IDF 特征提取同样需要使用 Scikit-learn 来计算 TF-IDF 值,然后可以将结果转换为 TensorFlow 张量进行模型训练。例如下面是一个使用 TF-IDF 特征进行文本特征提取的 TensorFlow 例子。

实例3-16:TensorFlow使用 TF-IDF 特征进行文本特征提取(源码路径:daima\3\tti.py

实例文件tti.py的具体实现代码如下所示。

# 生成示例文本数据和标签
texts = ["this is a positive sentence",
         "this is a negative sentence",
         "a positive sentence here",
         "a negative sentence there"]

labels = [1, 0, 1, 0]

# 划分训练集和验证集
train_texts, val_texts, train_labels, val_labels = train_test_split(texts, labels, test_size=0.2, random_state=42)

# 创建 TF-IDF 特征表示
vectorizer = TfidfVectorizer()
train_features = vectorizer.fit_transform(train_texts).toarray()
val_features = vectorizer.transform(val_texts).toarray()

# 转换为 TensorFlow 张量
train_features_tensor = tf.convert_to_tensor(train_features, dtype=tf.float32)
train_labels_tensor = tf.convert_to_tensor(train_labels, dtype=tf.float32)
val_features_tensor = tf.convert_to_tensor(val_features, dtype=tf.float32)
val_labels_tensor = tf.convert_to_tensor(val_labels, dtype=tf.float32)

# 构建简单的分类模型
model = tf.keras.Sequential([
    tf.keras.layers.Input(shape=(train_features.shape[1],)),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# 训练模型
model.fit(train_features_tensor, train_labels_tensor, epochs=10, batch_size=2, validation_data=(val_features_tensor, val_labels_tensor))

# 在验证集上评估模型性能
val_predictions = model.predict(val_features_tensor)
val_predictions = (val_predictions >= 0.5).astype(np.int32)
accuracy = accuracy_score(val_labels, val_predictions)
print(f'Validation accuracy: {accuracy:.2f}')

在这个例子中,首先使用 TfidfVectorizer 创建 TF-IDF 特征表示,然后将结果转换为 NumPy 数组,并使用 tf.convert_to_tensor 将其转换为 TensorFlow 张量。接着,我们构建了一个简单的分类模型,包括一个输入层和一个输出层,然后使用 model.fit 进行训练,最后使用验证集评估了模型的准确率。

3.7.3  TF-IDF与词袋模型的比较

TF-IDF(Term Frequency-Inverse Document Frequency)和词袋模型(Bag of Words,BoW)都是用于文本表示的常见方法,但它们在目标、原理和特点上有一些重要的区别。

1. 目标不同

  1. TF-IDF:主要目标是确定文档中的词汇重要性,以帮助理解文档的主题或进行文本相关性排序。它侧重于找出文档中关键词汇,强调不常见但在文档中频繁出现的词汇。
  2. 词袋模型:主要目标是将文本文档表示为一个无序的词汇集合,用于文本分类、信息检索、聚类等任务。它侧重于编码文档中所有词汇的出现次数。

2. 文本表示不同

  1. TF-IDF:生成每个文档的词汇权重,将文本文档表示为一个向量,其中每个元素对应于一个词汇,并表示该词汇在文档中的重要性。
  2. 词袋模型:将文本文档表示为一个向量,其中每个元素对应于一个词汇,并表示该词汇在文档中的出现次数。

3. 考虑上下文不同

  1. TF-IDF:通常不考虑词汇之间的上下文关系和顺序,它主要关注词汇的重要性。
  2. 词袋模型:也不考虑词汇的上下文关系和顺序,它将文本视为一组无序的词汇。

4. 处理停用词不同

  1. TF-IDF:通常会去除停用词,因为停用词在文档集合中出现频繁,但不具有较高的信息量。
  2. 词袋模型:通常保留了停用词,除非手动去除。

5. 适用领域不同

  1. TF-IDF:在信息检索、文本分类、文本聚类、文本摘要等任务中非常有用,尤其适合涉及关键词提取的应用。
  2. 词袋模型:在信息检索、文本分类、情感分析等任务中广泛应用,特别适合忽略词汇顺序的任务。

总之,TF-IDF和词袋模型是两种不同的文本表示方法,它们在不同的应用中都具有优势。选择哪种方法取决于任务的要求和文本数据的性质。有时候,这两种方法也可以结合使用,以充分利用它们的优点。例如,可以使用TF-IDF加权的词袋模型,将TF-IDF权重考虑在内,同时使用词袋模型的特征表示文本。

  • 29
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值