详解 Scikit-learn 的 feature_extraction.text.TfidfVectorizer函数:文本特征提取器

  • Post category:Python

Scikit-learn(简称为Sklearn)是一个流行的Python机器学习库,它提供了许多用于文本分析的工具,其中之一是TfidfVectorizer函数。该函数可以将文本数据转化为数值向量,以便进行机器学习模型训练。

TfidfVectorizer 函数作用

TfidfVectorizer函数的主要作用是将文本数据集转化为数值矩阵。其具体实现方式是将文档集的每个文档转化为一个向量,从而计算每个词在该文档中的TF-IDF值。TF-IDF是Term Frequency-Inverse Document Frequency的缩写,计算方法如下:

TF:词项在文档中的频率,即该词项在文档中出现的次数除以该文档中所有词项的总数。

IDF:词项在文本集中的逆文档频率,即所有文档中包含该词项的文档总数的倒数log。

TF-IDF = TF * IDF

因此,TfidfVectorizer函数能够生成一个文本的TF-IDF矩阵,其中每行代表一个文档,每列代表一个词项,每个元素代表该词项在该文档中的TF-IDF值。

TfidfVectorizer 函数使用方法

以下是使用TfidfVectorizer函数的一般步骤:

  1. 导入TfidfVectorizer函数。Python代码如下:
from sklearn.feature_extraction.text import TfidfVectorizer
  1. 创建TfidfVectorizer对象并设置参数。常用参数说明如下:

  2. stop_words:停用词列表。可以设为”english”,使用内置的英文停用词表。

  3. max_df:表示词频的上限,即在超过这个阈值的文档中出现的词项被删除,可以设置为[0.0, 1.0]之间的浮点数或整数。
  4. min_df:表示词频的下限,即在低于这个阈值的文档中出现的词项被删除,可以设置为[0.0, 1.0]之间的浮点数或整数。
  5. ngram_range:用于提取文本中的n元语法单元(如词项、字符等)。可以设置为元组 (min_n, max_n)。默认设置为 (1, 1),即提取单个词项。

以下是创建TfidfVectorizer对象的Python代码示例:

vectorizer = TfidfVectorizer(stop_words='english', max_df=0.5, min_df=2, ngram_range=(1, 2))
  1. 加载文本数据集。

下面提供两个示例代码:

  • 示例1:加载文本文件,每个文件代表一个文档。

“`
import os

# 文档集目录
doc_dir = ‘./data/docs’

# 读取所有文档
docs = []
for filename in os.listdir(doc_dir):
if filename.endswith(‘.txt’):
with open(os.path.join(doc_dir, filename), encoding=’utf-8′) as f:
docs.append(f.read())
“`

  • 示例2:加载字符串列表,每个字符串代表一个文档。

docs = [
"This is the first document.",
"This document is the second document.",
"And this is the third one.",
"Is this the first document?",
]

  1. 调用TfidfVectorizer对象的fit_transform方法,将文档集转化为数值矩阵。

matrix = vectorizer.fit_transform(docs)

  1. 获取每个词项的名称列表。

feature_names = vectorizer.get_feature_names()

示例1:应用于新闻文本分类

以下示例展示了如何使用TfidfVectorizer函数对新闻文本进行特征提取,并使用逻辑回归模型进行新闻文本分类。

  1. 导入必要的库。
import numpy as np
import pandas as pd
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
  1. 加载新闻文本数据集,并划分训练集和测试集。
# 加载新闻数据集,只选取4个主题分类
categories = ['comp.graphics', 'rec.sport.baseball', 'talk.politics.guns', 'sci.med']
newsgroups = fetch_20newsgroups(subset='all', categories=categories, shuffle=True, random_state=42)

# 划分训练集和测试集
docs_train, docs_test, y_train, y_test = train_test_split(newsgroups.data, newsgroups.target, test_size=0.2, random_state=42)
  1. 定义TfidfVectorizer对象并使用fit_transform方法转化文本数据集。
# 创建TfidfVectorizer对象
vectorizer = TfidfVectorizer(stop_words='english', max_df=0.5, min_df=2, ngram_range=(1, 2))

# 使用fit_transform方法转化训练集和测试集
X_train = vectorizer.fit_transform(docs_train)
X_test = vectorizer.transform(docs_test)
  1. 定义逻辑回归模型并使用训练集进行训练。
# 创建逻辑回归模型
model = LogisticRegression(random_state=42)

# 使用训练集进行训练
model.fit(X_train, y_train)
  1. 在测试集上进行预测并计算准确率。
# 在测试集上进行预测
y_pred = model.predict(X_test)

# 计算准确率
acc = accuracy_score(y_test, y_pred)
print("准确率为:", acc)

示例2:应用于电影评论情感分析

以下示例展示了如何使用TfidfVectorizer函数对电影评论进行情感分析。

  1. 导入必要的库。
import numpy as np
import pandas as pd
from sklearn.datasets import load_files
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
  1. 加载电影评论数据集,并划分训练集和测试集。
# 加载电影评论数据集
data = load_files('./data/txt_sentoken', encoding='utf-8', shuffle=True, random_state=42)

# 划分训练集和测试集
docs_train, docs_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2, random_state=42)
  1. 定义TfidfVectorizer对象并使用fit_transform方法转化文本数据集。
# 创建TfidfVectorizer对象
vectorizer = TfidfVectorizer(stop_words='english', max_df=0.5, min_df=2, ngram_range=(1, 2))

# 使用fit_transform方法转化训练集和测试集
X_train = vectorizer.fit_transform(docs_train)
X_test = vectorizer.transform(docs_test)
  1. 定义逻辑回归模型并使用训练集进行训练。
# 创建逻辑回归模型
model = LogisticRegression(random_state=42)

# 使用训练集进行训练
model.fit(X_train, y_train)
  1. 在测试集上进行预测并计算准确率。
# 在测试集上进行预测
y_pred = model.predict(X_test)

# 计算准确率
acc = accuracy_score(y_test, y_pred)
print("准确率为:", acc)

至此,我们就详细讲解了Sklearn的TfidfVectorizer函数的作用与使用方法,并通过两个示例来说明其具体使用方法。