赞
踩
转载自: sklearn基础(一)文本特征提取函数CountVectorizer()和TfidfVectorizer()
sklearn: TfidfVectorizer 中文处理及一些使用参数
对于文本关键提取通常有两种简单的方法:一个则是直接计算出现频率较高的词,另一个则是计算出现频次*逆文档率,下面分别介绍具体的实现。
目录
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]]
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。