机器学习 --文本特征提取TF-IDF

1. CountVectorizer

  1. max_df=1.0, min_df=1
    1. Max_df表示超过这个阈值的的文档频率的文档会被去除掉【相当于去除语料给定的停止词】
    2. Min-df:文档频率小于给定值的文档会被删除掉,学术用语为cut-off【截断】
  2. 有用的属性:
    1. vocabulary_, 获取转化的词频词典,是一个有序字典:
    2. 停止词:单词出现次数太多或者太少的都会被看做停止词。
# 使用词袋法统计词频
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer, TfidfVectorizer
from sklearn.pipeline import Pipeline

cv = CountVectorizer()
word_cnt = cv.fit_transform(train_data)
print('词典的大小为:',len(cv.vocabulary_))

2. TfidfTransformer

相当于在做了词频的基础上,用词频矩阵进行转化,得到TF-IDF矩阵。

  1. 相关参数:
    1. Norms=‘l2’: 表示在做归一化的过程中,使用的正则化方式。
    2. 是否使用光滑:
      在这里插入图片描述2. 属性:
    3. Idf_ :文档的逆频率。

使用文档的逆频率重新修改权重,tf相当于考虑局部权重,idf相当于考虑了全局情况,对tf进行了惩罚处理。 其实,就是类似于曝光打压之类的情况。

tf_idf_t = TfidfTransformer()
tf_idf_cnt = tf_idf_t.fit_transform(word_cnt)
print('idf的长度为::', len(tf_idf_t.idf_))

在得到词频之后,然后再用tf-idf方法,将其转化为tf-idf向量。
所以建议使用管道:

pipeline = Pipeline([('tf', CountVectorizer()),
                     ('tf_idf', TfidfTransformer())])
pipeline.fit(train_data)

print(list(pipeline['tf'].vocabulary_.items())[: 20])
print(pipeline['tf_idf'].idf_[: 20])

3. 手写itf-idf过程

# 自己手写tf_idf 
%time
from collections import Counter, OrderedDict
import numpy as np

for i, sentence in enumerate(train_data):
    if i == 0:
        tf = Counter(sentence.split(' '))
    else:
        tf.update(Counter(sentence.split(' ')))

idf = OrderedDict()
tf_idf = OrderedDict()
for word, cnt in tf.most_common():
    df_cnt = 0
    for i, sentence  in enumerate(train_data):
        if word in sentence:
            df = Counter([sentence])
            df_cnt += 1
        else:
            continue
    idf[word] = np.log((1 + len(train_data))/(1 + df_cnt)) + 1
    tf_idf[word] = cnt * idf[word] 

# 对训练集进行tf转化以及tf-idf转化
tf_data = []
tf_idf_data = []
for sentence in train_data:
    tf_vec = []
    tf_idf_vec = []
    for word  in idf.keys():
        if word in sentence.split(' '):
            tf_vec.append(tf[word])
            tf_idf_vec.append(tf_idf[word])
        else:
            tf_vec.append(0)
            tf_idf_vec.append(0)
    
    # 对tf-idf转化进行l2正则
    l2_norm = np.sqrt(np.sum(np.square(tf_idf_vec)))
    nor_tf_idf_vec = tf_idf_vec / l2_norm
    tf_data.append(tf_vec)
    tf_idf_data.append(nor_tf_idf_vec)

4. TfidfVectorizer

  1. 相关参数
    1. max_df=0.95: 在构建词典时,忽略文档频数大于 n*0.95的文档中的term,相当于过滤掉了停止词;
    2. min_df = 2: 在构建词典时,对文档频数小于2次的文档去除掉,相当于做了一个截断 处理。
    3. max_features: 只取vocabulary中的前max_features的单词作为特征,构建特征。
      当词库的维度不是很大时,全部使用vocabulary中的单词作为特征。
  2. Equivalent to CountVectorizer followed by TfidfTransformer.
    1. 也就是说TfidfVectorizer 等于CountVectorizer + TfidfTransformer
tfidf_vectorizer = TfidfVectorizer(max_df=0.95, min_df=2,
                                   max_features=1000000,
                                   stop_words='english')
tfidf = tfidf_vectorizer.fit_transform(train_data)
print('特征为,', tfidf_vectorizer.get_feature_names()[: 20])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值