1. CountVectorizer
- max_df=1.0, min_df=1
- Max_df表示超过这个阈值的的文档频率的文档会被去除掉【相当于去除语料给定的停止词】
- Min-df:文档频率小于给定值的文档会被删除掉,学术用语为cut-off【截断】
- 有用的属性:
- vocabulary_, 获取转化的词频词典,是一个有序字典:
- 停止词:单词出现次数太多或者太少的都会被看做停止词。
# 使用词袋法统计词频
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矩阵。
- 相关参数:
- Norms=‘l2’: 表示在做归一化的过程中,使用的正则化方式。
- 是否使用光滑:
2. 属性: - 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
- 相关参数
- max_df=0.95: 在构建词典时,忽略文档频数大于 n*0.95的文档中的term,相当于过滤掉了停止词;
- min_df = 2: 在构建词典时,对文档频数小于2次的文档去除掉,相当于做了一个截断 处理。
- max_features: 只取vocabulary中的前max_features的单词作为特征,构建特征。
当词库的维度不是很大时,全部使用vocabulary中的单词作为特征。
- Equivalent to CountVectorizer followed by TfidfTransformer.
- 也就是说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])