当前位置:   article > 正文

文本关键词提取(TF与TF-IDF)-CountVectorizer()和TfidfVectorizer()_python代码tfidfvectorizer(),tf-idf提取的关键词

python代码tfidfvectorizer(),tf-idf提取的关键词

转载自: sklearn基础(一)文本特征提取函数CountVectorizer()和TfidfVectorizer()

               sklearn: TfidfVectorizer 中文处理及一些使用参数

       对于文本关键提取通常有两种简单的方法:一个则是直接计算出现频率较高的词,另一个则是计算出现频次*逆文档率,下面分别介绍具体的实现。

目录

sklearn-CountVectorizer()函数

sklearn-TfidfVectorizer()函数

一个中文提取的例子:


sklearn-CountVectorizer()函数

CountVectorizer()函数只考虑每个单词出现的频率;然后构成一个特征矩阵,每一行表示一个训练文本的词频统计结果。其思想是,先根据所有训练文本,不考虑其出现顺序,只将训练文本中每个出现过的词汇单独视为一列特征,构成一个词汇表(vocabulary list),该方法又称为词袋法(Bag of Words)
具体详解可以参照:sklearn——CountVectorizer详解

我们举一个例子:

  1. from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
  2. texts=["orange banana apple grape","banana apple apple","grape", 'orange apple']
  3. cv = CountVectorizer()
  4. cv_fit=cv.fit_transform(texts)
  5. print(cv.vocabulary_)
  6. print(cv_fit)
  7. 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()函数

Python中的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算法。

我们依旧采用上面的例子:

  1. from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
  2. texts=["orange banana apple grape","banana apple apple","grape", 'orange apple']
  3. cv = TfidfVectorizer()
  4. cv_fit=cv.fit_transform(texts)
  5. print(cv.vocabulary_)
  6. print(cv_fit)
  7. 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]]

一个中文提取的例子:

  1. from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
  2. import jieba
  3. text = """我是一条天狗呀!
  4. 我把月来吞了,
  5. 我把日来吞了,
  6. 我把一切的星球来吞了,
  7. 我把全宇宙来吞了。
  8. 我便是我了!"""
  9. sentences = text.split()
  10. sent_words = [list(jieba.cut(sent0)) for sent0 in sentences]
  11. document = [" ".join(sent0) for sent0 in sent_words]
  12. print('词料:', document)
  13. tfidf_model = TfidfVectorizer().fit(document)
  14. # 得到语料库所有不重复的词
  15. feature = tfidf_model.get_feature_names()
  16. print(feature)
  17. # ['一切', '一条', '便是', '全宇宙', '天狗', '日来', '星球']
  18. # 得到每个特征对应的id值:即上面数组的下标
  19. print(tfidf_model.vocabulary_)
  20. # {'一条': 1, '天狗': 4, '日来': 5, '一切': 0, '星球': 6, '全宇宙': 3, '便是': 2}
  21. # 每一行中的指定特征的tf-idf值:
  22. sparse_result = tfidf_model.transform(document)
  23. print(sparse_result)
  24. # 每一个语料中包含的各个特征值的tf-idf值:
  25. print(sparse_result.toarray())
  26. print(sparse_result.toarray()[0][1])
  27. # 去排序为1特征名称:
  28. print(feature[1])
  1. from sklearn.feature_extraction.text import TfidfTransformer
  2. from sklearn.feature_extraction.text import CountVectorizer
  3. if __name__ == "__main__":
  4. corpus = ['我 是 一条 天狗 呀 !',
  5. '我 把 月 来 吞 了 ,',
  6. '我 把 日来 吞 了 ,',
  7. '我 把 一切 的 星球 来 吞 了 ,',
  8. '我 把 全宇宙 来 吞 了 。',
  9. '我 便是 我 了 !']
  10. vectorizer = CountVectorizer() # 该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
  11. transformer = TfidfTransformer() # 该类会统计每个词语的tf-idf权值
  12. tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus)) # 第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵
  13. word = vectorizer.get_feature_names() # 获取词袋模型中的所有词语,也是下面字典按序号对应的数组:
  14. # {'一条': 1, '天狗': 4, '日来': 5, '一切': 0, '星球': 6, '全宇宙': 3, '便是': 2} 对应 ['一切', '一条', '便是', '全宇宙', '天狗', '日来', '星球']
  15. weight = tfidf.toarray() # 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
  16. for i in range(len(weight)): # 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for遍历某一类文本下的词语权重
  17. print(u"-------这里输出第",i,u"类文本的词语tf-idf权重------")
  18. for j in range(len(word)):
  19. print(word[j], weight[i][j])
  20. print(weight)
  21. 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
 

 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/350091
推荐阅读
相关标签
  

闽ICP备14008679号