TfidfVectorizer文本特征提取
1、TF-IDF矢量化器
Sklearn提供了计算TF-IDF(详见:传送门)值的API:TfidfVectorizer(TF-IDF矢量化器)
class sklearn.feature_extraction.text.TfidfVectorizer(*, input='content', encoding='utf-8', decode_error='strict', strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, analyzer='word', stop_words=None, token_pattern='(?u)\\b\\w\\w+\\b', ngram_range=(1, 1), max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=<class 'numpy.float64'>, norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False)
官方对该API的描述如下:
TfidfVectorizer将原始文档集合转换为TF-IDF特征矩阵。相当于CountVectorizer后接TfidfTransformer。CountVectorizer将文本文档集合转换为词频/字符频数矩阵;TfidfTransformer将词频/字符频数矩阵转换为标准化的TF或TF-IDF矩阵
API常用参数及说明如下:
参数 | 说明 |
---|---|
input |
content(默认):输入为字符串或字节类型;filename:输入为文件名;file:输入为内存中的文件流对象 |
analyzer |
word(默认):特征由单词组成;char:特征由字符组成;char_wb: |
stop_words |
|
token_pattern |
|
max_df |
|
min_df |
API常用属性及说明如下:
属性 | 说明 |
---|---|
vocabulary_ |
特征单词与列索引的映射 |
API常用方法及说明如下:
方法 | 说明 |
---|---|
fit(raw_documents) |
拟合模型,学习文档词汇和IDF |
transform(raw_documents) |
将文档词汇转成TF-IDF特征矩阵返回 |
fit_transform(raw_documents) |
学习文档词汇和IDF,返回TF-IDF特征矩阵,相当于拟合后变换 |
get_feature_names_out() |
获取用于转换的不重复的特征词汇 |
get_stop_words() |
获取有效的停用词列表 |
TfidfVectorizer的一般使用步骤如下:
vectorizer = TfidfVectorizer()
train_matrix = vectorizer.fit_transform(X_train)
test_matrix = vectorizer.transform(X_test)
2、英文文档计算TF-IDF
TfidfVectorizer将原始文本转化为TF-IDF特征矩阵,从而为后续的文本相似度计算奠定基础。以下是一个示例:
1)定义文档
# 定义3个文档
docs = [
'I am a student.',
'I live in Beijing.',
'I love China.',
]
2)计算TF-IDF值
from sklearn.feature_extraction.text import TfidfVectorizer
# TF-IDF矢量化器
vectorizer = TfidfVectorizer()
# 拟合模型
tfidf_matrix = vectorizer.fit_transform(docs)
# 获取所有不重复的特征词汇
print(vectorizer.get_feature_names_out()) # ['am' 'beijing' 'china' 'in' 'live' 'love' 'student']
不知道你有没有发现,这些特征词汇中不包含i
和a
,你能解释这是为什么吗?
# 获取特征词汇的TF-IDF矩阵值
print(tfidf_matrix.todense())
print(tfidf_matrix.toarray())
'''
[[0.70710678 0. 0. 0. 0. 0.
0.70710678]
[0. 0.57735027 0. 0.57735027 0.57735027 0.
0. ]
[0. 0. 0.70710678 0. 0. 0.70710678
0. ]]
'''
# 获取特征词汇与列的对应关系
print(vectorizer.vocabulary_) # {'am': 0, 'student': 6, 'live': 4, 'in': 3, 'beijing': 1, 'love': 5, 'china': 2}
3、中文文档计算TF-IDF
与英文文档不同,中文文档的词汇之间没有像英文那样的自然空格分割,因此,需要额外处理,要将中文文档转换为类似英文文档中自然空格分割的格式。以下是一个示例:
1)定义文档
# 定义3个文档
docs = [
"我是一名学生。",
"我居住在北京。",
"我爱中国。"
]
2)中文文档预处理
import jieba
# 使用中文分词库jieba进行分词
doc_words = [jieba.lcut(doc) for doc in docs]
new_docs = [' '.join(words) for words in doc_words]
print(new_docs) # ['我 是 一名 学生 。', '我 居住 在 北京 。', '我 爱 中国 。']
3)计算TF-IDF值
# TF-IDF矢量化器
vectorizer = TfidfVectorizer()
# 拟合模型
tfidf_matrix = vectorizer.fit_transform(new_docs)
# 获取所有不重复的特征词汇
print(vectorizer.get_feature_names_out()) # ['一名' '中国' '北京' '学生' '居住']
同样,这些特征词汇中不包含“我”、“是”、“在”和“爱”,你能解释这是为什么吗?
# 获取特征词汇的TF-IDF矩阵值
print(tfidf_matrix.todense())
print(tfidf_matrix.toarray())
'''
[[0.70710678 0. 0. 0.70710678 0. ]
[0. 0. 0.70710678 0. 0.70710678]
[0. 1. 0. 0. 0. ]]
'''
# 获取特征词汇与列的对应关系
print(vectorizer.vocabulary_) # {'一名': 0, '学生': 3, '居住': 4, '北京': 2, '中国': 1}
通过对比,我们发现,在计算中文文档TF-IDF时,需要先对文档进行特别处理,将文档处理成类似英文的自然空格分割形式,以方便应用TF-IDF矢量化器