TfidfVectorizer文本特征提取

发布于:2024-05-23 ⋅ 阅读:(139) ⋅ 点赞:(0)





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矩阵

官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html

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']

不知道你有没有发现,这些特征词汇中不包含ia,你能解释这是为什么吗?

# 获取特征词汇的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矢量化器



网站公告

今日签到

点亮在社区的每一天
去签到