NLP基础实验④:特征选择之TF-IDF和互信息

一、TF-IDF原理以及利用其进行特征筛选

关于TF-IDF原理,之前写的一篇博客:特征工程之TF-IDF

NLP基础实验④:特征选择之TF-IDF和互信息_第1张图片

1.1 简单使用

 这里简单总结一下使用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)

 

1.2 使用不同的方法计算TF-IDF值

这篇文章主要介绍了计算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())

NLP基础实验④:特征选择之TF-IDF和互信息_第2张图片

https://www.cnblogs.com/pinard/p/6693230.html

1.3 实战Sample pipeline for text feature extraction and evaluation

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

NLP基础实验④:特征选择之TF-IDF和互信息_第3张图片

NLP基础实验④:特征选择之TF-IDF和互信息_第4张图片

二、互信息的原理以及利用其进行特征筛选

参考博客

https://blog.csdn.net/sherpahu/article/details/90217618

https://blog.csdn.net/u013710265/article/details/72848755

 

你可能感兴趣的:(NLP实战)