关于TF-IDF原理,之前写的一篇博客:特征工程之TF-IDF
这里简单总结一下使用sklearn提取文本tfidf特征,官方教程:
http://sklearn.lzjqsdd.com/modules/feature_extraction.html#tfidf
http://sklearn.apachecn.org/#/docs/58
在一个大的文本语料库中,一些单词将出现很多次(例如 “the”, “a”, “is” 是英文),因此对文档的实际内容没有什么有意义的信息。 如果我们将直接计数数据直接提供给分类器,那么这些频繁词组会掩盖住那些我们关注但很少出现的词。
为了重新计算特征权重,并将其转化为适合分类器使用的浮点值,因此使用 tf-idf 变换是非常常见的。
用sklearn进行TF-IDF预处理
第一种方法是在用 CountVectorizer 类向量化之后再调用 TfidfTransformer 类进行预处理。第二种方法是直接用 TfidfVectorizer 完成向量化与 TF-IDF 预处理。
使用 TfidfTransformer
的默认设置,TfidfTransformer(norm='l2', use_idf=True, smooth_idf=True, sublinear_tf=False)
这篇文章主要介绍了计算TF-IDF的不同方法实现,主要有三种方法:
- 用gensim库来计算tfidf值
- 用sklearn库来计算tfidf值
- 用python手动实现tfidf的计算
参考博客
https://www.jianshu.com/p/f3b92124cd2b (精华练习)
corpus = [
'this is the first document',
'this is the second second document',
'and the third one',
'is this the first document'
]
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vec = TfidfVectorizer()
tfidf_matrix = tfidf_vec.fit_transform(corpus)
# 得到语料库所有不重复的词
print(tfidf_vec.get_feature_names())
# 得到每个单词对应的id值
print(tfidf_vec.vocabulary_)
# 得到每个句子所对应的向量
# 向量里数字的顺序是按照词语的id顺序来的
print(tfidf_matrix.toarray())
https://www.cnblogs.com/pinard/p/6693230.html
http://sklearn.lzjqsdd.com/auto_examples/model_selection/grid_search_text_feature_extraction.html#example-model-selection-grid-search-text-feature-extraction-py
此示例中使用的数据集是20个新闻组数据集,它将自动下载,然后缓存并重新用于文档分类示例。
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.linear_model import SGDClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.pipeline import Pipeline
# 从训练集中加载一些类别
categories = [
'alt.atheism',
'talk.religion.misc',
]
# 取消注释以下内容以对所有类别进行分析
#categories = None
print("Loading 20 newsgroups dataset for categories:")
print(categories)
data = fetch_20newsgroups(subset='train', categories=categories)
print("%d documents" % len(data.filenames))
print("%d categories" % len(data.target_names))
print()
# 定义将文本特征提取器与简单分类器组合在一起的管道
pipeline = Pipeline([
('vect', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', SGDClassifier()),
])
# 取消注释更多参数将提供更好的探索能力,但会以组合方式增加处理时间
parameters = {
'vect__max_df': (0.5, 0.75, 1.0),
#'vect__max_features': (None, 5000, 10000, 50000),
'vect__ngram_range': ((1, 1), (1, 2)), # unigrams or bigrams
#'tfidf__use_idf': (True, False),
#'tfidf__norm': ('l1', 'l2'),
'clf__alpha': (0.00001, 0.000001),
'clf__penalty': ('l2', 'elasticnet'),
#'clf__n_iter': (10, 50, 80),
}
执行main函数
if __name__ == "__main__":
# multiprocessing requires the fork to happen in a __main__ protected block
# find the best parameters for both the feature extraction and the classifier
grid_search = GridSearchCV(pipeline, parameters, n_jobs=-1, verbose=1)
print("Performing grid search...")
print("pipeline:", [name for name, _ in pipeline.steps])
print("parameters:")
pprint(parameters)
t0 = time()
grid_search.fit(data.data, data.target)
print("done in %0.3fs" % (time() - t0))
print()
print("Best score: %0.3f" % grid_search.best_score_)
print("Best parameters set:")
best_parameters = grid_search.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
print("\t%s: %r" % (param_name, best_parameters[param_name]))
参考博客
https://blog.csdn.net/sherpahu/article/details/90217618
https://blog.csdn.net/u013710265/article/details/72848755