当前位置:   article > 正文

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

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的具体实现代码如下所示。

  1. # 生成示例文本数据和标签
  2. texts = ["this is a positive sentence",
  3. "this is a negative sentence",
  4. "a positive sentence here",
  5. "a negative sentence there"]
  6. labels = [1, 0, 1, 0]
  7. # 划分训练集和验证集
  8. train_texts, val_texts, train_labels, val_labels = train_test_split(texts, labels, test_size=0.2, random_state=42)
  9. # 创建 TF-IDF 特征表示
  10. vectorizer = TfidfVectorizer()
  11. train_features = vectorizer.fit_transform(train_texts).toarray()
  12. val_features = vectorizer.transform(val_texts).toarray()
  13. # 转换为 PyTorch 张量
  14. train_features_tensor = torch.tensor(train_features, dtype=torch.float32)
  15. train_labels_tensor = torch.tensor(train_labels, dtype=torch.float32)
  16. val_features_tensor = torch.tensor(val_features, dtype=torch.float32)
  17. val_labels_tensor = torch.tensor(val_labels, dtype=torch.float32)
  18. # 创建朴素贝叶斯分类器
  19. classifier = MultinomialNB()
  20. classifier.fit(train_features, train_labels)
  21. # 预测并评估模型性能
  22. predictions = classifier.predict(val_features)
  23. accuracy = accuracy_score(val_labels, predictions)
  24. 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的具体实现代码如下所示。

  1. # 生成示例文本数据和标签
  2. texts = ["this is a positive sentence",
  3. "this is a negative sentence",
  4. "a positive sentence here",
  5. "a negative sentence there"]
  6. labels = [1, 0, 1, 0]
  7. # 划分训练集和验证集
  8. train_texts, val_texts, train_labels, val_labels = train_test_split(texts, labels, test_size=0.2, random_state=42)
  9. # 创建 TF-IDF 特征表示
  10. vectorizer = TfidfVectorizer()
  11. train_features = vectorizer.fit_transform(train_texts).toarray()
  12. val_features = vectorizer.transform(val_texts).toarray()
  13. # 转换为 TensorFlow 张量
  14. train_features_tensor = tf.convert_to_tensor(train_features, dtype=tf.float32)
  15. train_labels_tensor = tf.convert_to_tensor(train_labels, dtype=tf.float32)
  16. val_features_tensor = tf.convert_to_tensor(val_features, dtype=tf.float32)
  17. val_labels_tensor = tf.convert_to_tensor(val_labels, dtype=tf.float32)
  18. # 构建简单的分类模型
  19. model = tf.keras.Sequential([
  20. tf.keras.layers.Input(shape=(train_features.shape[1],)),
  21. tf.keras.layers.Dense(1, activation='sigmoid')
  22. ])
  23. model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
  24. # 训练模型
  25. model.fit(train_features_tensor, train_labels_tensor, epochs=10, batch_size=2, validation_data=(val_features_tensor, val_labels_tensor))
  26. # 在验证集上评估模型性能
  27. val_predictions = model.predict(val_features_tensor)
  28. val_predictions = (val_predictions >= 0.5).astype(np.int32)
  29. accuracy = accuracy_score(val_labels, val_predictions)
  30. 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权重考虑在内,同时使用词袋模型的特征表示文本。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/350041
推荐阅读
相关标签
  

闽ICP备14008679号