转载自: sklearn基础(一)文本特征提取函数CountVectorizer()和TfidfVectorizer()
sklearn: TfidfVectorizer 中文处理及一些使用参数
对于文本关键提取通常有两种简单的方法:一个则是直接计算出现频率较高的词,另一个则是计算出现频次*逆文档率,下面分别介绍具体的实现。
目录
sklearn-CountVectorizer()函数
CountVectorizer()函数只考虑每个单词出现的频率;然后构成一个特征矩阵,每一行表示一个训练文本的词频统计结果。其思想是,先根据所有训练文本,不考虑其出现顺序,只将训练文本中每个出现过的词汇单独视为一列特征,构成一个词汇表(vocabulary list),该方法又称为词袋法(Bag of Words)。
具体详解可以参照:sklearn——CountVectorizer详解
我们举一个例子:
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
texts=["orange banana apple grape","banana apple apple","grape", 'orange apple']
cv = CountVectorizer()
cv_fit=cv.fit_transform(texts)
print(cv.vocabulary_)
print(cv_fit)
print(cv_fit.toarray())
输出如下:
{'orange': 3, 'banana': 1, 'apple': 0, 'grape': 2} #这里是根据首字母顺序,将texts变量中所有单词进行排序,apple首字母为a所以 # 排第一,字典对应着排名序号,banana首字母为b所以排第二
(0, 2) 1 # (0, 2) 1 中0表示第一个字符串"orange banana apple grape";2对应上面的'grape': 2;1表示出现次数1。整体理 # 解为第一字符串的顺序为二的词语在出现次数为1
(0, 0) 1
(0, 1) 1
(0, 3) 1
(1, 0) 2
(1, 1) 1
(2, 2) 1
(3, 0) 1
(3, 3) 1
[[1 1 1 1] # 第一个字符串,排名0,1,2,3词汇(apple,banana,grape,orange)出现的频率都为1
[2 1 0 0] #第二个字符串,排名0,1,2,3词汇(apple,banana,grape,orange)出现的频率为2,1,0,0
[0 0 1 0]
[1 0 0 1]]
sklearn-TfidfVectorizer()函数
TfidfVectorizer()基于tf-idf算法。此算法包括两部分tf()和idf,两者相乘得到tf-idf算法。TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。
tf算法统计某训练文本中,某个词的出现次数,计算公式如下:
或
idf算法,用于调整词频的权重系数,如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。
tf-idf算法=tf算法 * idf算法。
我们依旧采用上面的例子:
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
texts=["orange banana apple grape","banana apple apple","grape", 'orange apple']
cv = TfidfVectorizer()
cv_fit=cv.fit_transform(texts)
print(cv.vocabulary_)
print(cv_fit)
print(cv_fit.toarray())
输出如下:
{'orange': 3, 'banana': 1, 'apple': 0, 'grape': 2}
(0, 3) 0.5230350301866413 #(0,3)表示第一个字符串的orange词语,其TF=1/4,IDF中总样本和包含有改词的文档数,目 # 前也不知道是如何得出,望有知道的人能评论告之。最后得出结果tf*idf=0.5230350301866413
(0, 1) 0.5230350301866413
(0, 0) 0.423441934145613
(0, 2) 0.5230350301866413
(1, 1) 0.5254635733493682
(1, 0) 0.8508160982744233
(2, 2) 1.0
(3, 3) 0.7772211620785797
(3, 0) 0.6292275146695526
[[0.42344193 0.52303503 0.52303503 0.52303503]
[0.8508161 0.52546357 0. 0. ]
[0. 0. 1. 0. ]
[0.62922751 0. 0. 0.77722116]]
一个中文提取的例子:
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba
text = """我是一条天狗呀!
我把月来吞了,
我把日来吞了,
我把一切的星球来吞了,
我把全宇宙来吞了。
我便是我了!"""
sentences = text.split()
sent_words = [list(jieba.cut(sent0)) for sent0 in sentences]
document = [" ".join(sent0) for sent0 in sent_words]
print('词料:', document)
tfidf_model = TfidfVectorizer().fit(document)
# 得到语料库所有不重复的词
feature = tfidf_model.get_feature_names()
print(feature)
# ['一切', '一条', '便是', '全宇宙', '天狗', '日来', '星球']
# 得到每个特征对应的id值:即上面数组的下标
print(tfidf_model.vocabulary_)
# {'一条': 1, '天狗': 4, '日来': 5, '一切': 0, '星球': 6, '全宇宙': 3, '便是': 2}
# 每一行中的指定特征的tf-idf值:
sparse_result = tfidf_model.transform(document)
print(sparse_result)
# 每一个语料中包含的各个特征值的tf-idf值:
print(sparse_result.toarray())
print(sparse_result.toarray()[0][1])
# 去排序为1特征名称:
print(feature[1])
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
if __name__ == "__main__":
corpus = ['我 是 一条 天狗 呀 !',
'我 把 月 来 吞 了 ,',
'我 把 日来 吞 了 ,',
'我 把 一切 的 星球 来 吞 了 ,',
'我 把 全宇宙 来 吞 了 。',
'我 便是 我 了 !']
vectorizer = CountVectorizer() # 该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
transformer = TfidfTransformer() # 该类会统计每个词语的tf-idf权值
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus)) # 第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵
word = vectorizer.get_feature_names() # 获取词袋模型中的所有词语,也是下面字典按序号对应的数组:
# {'一条': 1, '天狗': 4, '日来': 5, '一切': 0, '星球': 6, '全宇宙': 3, '便是': 2} 对应 ['一切', '一条', '便是', '全宇宙', '天狗', '日来', '星球']
weight = tfidf.toarray() # 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
for i in range(len(weight)): # 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for遍历某一类文本下的词语权重
print(u"-------这里输出第",i,u"类文本的词语tf-idf权重------")
for j in range(len(word)):
print(word[j], weight[i][j])
print(weight)
print(word)
运行结果:
-------这里输出第 0 类文本的词语tf-idf权重------
一切 0.0
一条 0.7071067811865476
便是 0.0
全宇宙 0.0
天狗 0.7071067811865476
日来 0.0
星球 0.0
-------这里输出第 1 类文本的词语tf-idf权重------
一切 0.0
一条 0.0
便是 0.0
全宇宙 0.0
天狗 0.0
日来 0.0
星球 0.0
-------这里输出第 2 类文本的词语tf-idf权重------
一切 0.0
一条 0.0
便是 0.0
全宇宙 0.0
天狗 0.0
日来 1.0
星球 0.0
-------这里输出第 3 类文本的词语tf-idf权重------
一切 0.7071067811865476
一条 0.0
便是 0.0
全宇宙 0.0
天狗 0.0
日来 0.0
星球 0.7071067811865476
-------这里输出第 4 类文本的词语tf-idf权重------
一切 0.0
一条 0.0
便是 0.0
全宇宙 1.0
天狗 0.0
日来 0.0
星球 0.0
-------这里输出第 5 类文本的词语tf-idf权重------
一切 0.0
一条 0.0
便是 1.0
全宇宙 0.0
天狗 0.0
日来 0.0
星球 0.0
[[0. 0.70710678 0. 0. 0.70710678 0.
0. ]
[0. 0. 0. 0. 0. 0.
0. ]
[0. 0. 0. 0. 0. 1.
0. ]
[0.70710678 0. 0. 0. 0. 0.
0.70710678]
[0. 0. 0. 1. 0. 0.
0. ]
[0. 0. 1. 0. 0. 0.
0. ]]
['一切', '一条', '便是', '全宇宙', '天狗', '日来', '星球']
Process finished with exit code 0