当前位置:   article > 正文

scikit-learn计算tf-idf词语权重_tf-idf权重

tf-idf权重


采用scikit-learn包进行tf-idf分词权重计算关键用到了两个类:CountVectorizer和TfidfTransformer

CountVectorizer
TfidfTransformer

TfidfVectorizer   个数+归一化(不包括idf)


vectorizer=CountVectorizer()  #该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频  
count=vectorizer.fit_transform(corpus)#将文本转为词频矩阵


transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值  
tfidf=transformer.fit_transform(count)#计算tf-idf


TfidfVec=TfidfVectorizer()

count2=TfidfVec.fit_transform(corpus)


# coding:utf-8 可用中文注释


  1. # coding:utf-8  
  2. __author__ = "liuxuejiang"  
  3. #import jieba  
  4. #import jieba.posseg as pseg  
  5. import os  
  6. import sys  
  7. from sklearn import feature_extraction  
  8. from sklearn.feature_extraction.text import TfidfTransformer  
  9. from sklearn.feature_extraction.text import CountVectorizer 
  10. from sklearn.feature_extraction.text import TfidfVectorizer
  11.   
  12. if __name__ == "__main__":  
  13. corpus = [  
  14.     'Today the weather is sunny',  #第一类文本切词后的结果,词之间以空格隔开
  15.     'Sunny day weather is suitable to exercise ',  #第二类文本切词后的结果
  16.     'I ate a Hotdog'  ]  #第三类文本切词后的结果
  17. vectorizer=CountVectorizer()  #该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频  
  18. count=vectorizer.fit_transform(corpus)#将文本转为词频矩阵
  19. print(vectorizer.vocabulary_)
  20. word=vectorizer.get_feature_names()#获取词袋模型中的所有词语 
  21. print(word) 
  22. print(vectorizer.fit_transform(corpus))
  23. print(vectorizer.fit_transform(corpus).todense())#显示词频矩阵
  24. transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值  
  25. tfidf=transformer.fit_transform(count)#计算tf-idf 
  26. print(tfidf)
  27. weight=tfidf.toarray()#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重  
  28. print(weight)
  29. for i in range(len(weight)):#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重  
  30. print u"-------这里输出第",i+1,u"类文本的词语tf-idf权重------"  
  31. for j in range(len(word)):  
  32. print word[j],weight[i][j]  
  33. TfidfVec=TfidfVectorizer()
  34. count2=TfidfVec.fit_transform(corpus)
  35. print("--------直接使用TfidfVectorizer()-------")
  36. print(TfidfVec.fit_transform(corpus).todense())

输出:

  1. {u'ate': 0, u'is': 4, u'sunny': 6, u'to': 8, u'weather': 10, u'today': 9, u'the': 7, u'suitable': 5, u'day': 1, u'exercise': 2, u'hotdog': 3}
  2. [u'ate', u'day', u'exercise', u'hotdog', u'is', u'suitable', u'sunny', u'the', u'to', u'today', u'weather']
  3.   (0, 6) 1
  4.   (0, 4) 1
  5.   (0, 10) 1
  6.   (0, 7) 1
  7.   (0, 9) 1
  8.   (1, 2) 1
  9.   (1, 8) 1
  10.   (1, 5) 1
  11.   (1, 1) 1
  12.   (1, 6) 1
  13.   (1, 4) 1
  14.   (1, 10) 1
  15.   (2, 3) 1
  16.   (2, 0) 1
  17. [[0 0 0 0 1 0 1 1 0 1 1]
  18.  [0 1 1 0 1 1 1 0 1 0 1]
  19.  [1 0 0 1 0 0 0 0 0 0 0]]
  20.   (0, 9) 0.517419943932
  21.   (0, 7) 0.517419943932
  22.   (0, 10) 0.393511204094
  23.   (0, 4) 0.393511204094
  24.   (0, 6) 0.393511204094
  25.   (1, 10) 0.317570180428
  26.   (1, 4) 0.317570180428
  27.   (1, 6) 0.317570180428
  28.   (1, 1) 0.417566623878
  29.   (1, 5) 0.417566623878
  30.   (1, 8) 0.417566623878
  31.   (1, 2) 0.417566623878
  32.   (2, 0) 0.707106781187
  33.   (2, 3) 0.707106781187
  34. [[ 0.          0.          0.          0.          0.3935112   0.
  35.    0.3935112   0.51741994  0.          0.51741994  0.3935112 ]
  36.  [ 0.          0.41756662  0.41756662  0.          0.31757018  0.41756662
  37.    0.31757018  0.          0.41756662  0.          0.31757018]
  38.  [ 0.70710678  0.          0.          0.70710678  0.          0.          0.
  39.    0.          0.          0.          0.        ]]
  40. -------这里输出第 1 类文本的词语tf-idf权重------
  41. ate 0.0
  42. day 0.0
  43. exercise 0.0
  44. hotdog 0.0
  45. is 0.393511204094
  46. suitable 0.0
  47. sunny 0.393511204094
  48. the 0.517419943932
  49. to 0.0
  50. today 0.517419943932
  51. weather 0.393511204094
  52. -------这里输出第 2 类文本的词语tf-idf权重------
  53. ate 0.0
  54. day 0.417566623878
  55. exercise 0.417566623878
  56. hotdog 0.0
  57. is 0.317570180428
  58. suitable 0.417566623878
  59. sunny 0.317570180428
  60. the 0.0
  61. to 0.417566623878
  62. today 0.0
  63. weather 0.317570180428
  64. -------这里输出第 3 类文本的词语tf-idf权重------
  65. ate 0.707106781187
  66. day 0.0
  67. exercise 0.0
  68. hotdog 0.707106781187
  69. is 0.0
  70. suitable 0.0
  71. sunny 0.0
  72. the 0.0
  73. to 0.0
  74. today 0.0
  75. weather 0.0
  76. [[ 0.          0.          0.          0.          0.3935112   0.
  77.    0.3935112   0.51741994  0.          0.51741994  0.3935112 ]
  78.  [ 0.          0.41756662  0.41756662  0.          0.31757018  0.41756662
  79.    0.31757018  0.          0.41756662  0.          0.31757018]
  80.  [ 0.70710678  0.          0.          0.70710678  0.          0.          0.
  81.    0.          0.          0.          0.        ]]
  82. [Finished in 0.6s]

中文的情况

中文分词采用的jieba分词,安装jieba分词包

1 安装scikit-learn

[python]  view plain  copy
  1. sudo pip install scikit-learn  


2 中文分词采用的jieba分词,安装jieba分词包

[python]  view plain  copy
  1. sudo pip install jieba  

3  关于jieba分词的使用非常简单,参考 这里 ,关键的语句就是(这里简单试水,不追求效果4 )
[python]  view plain  copy
  1. import jieba.posseg as pseg  
  2. words=pseg.cut("对这句话进行分词")  
  3. for key in words:  
  4.      print key.word,key.flag  
输出结果:

对 p
这 r
句 q
话 n
进行 v
分词 n

 

4 采用scikit-learn包进行tf-idf分词权重计算关键用到了两个类:CountVectorizer和TfidfTransformer,具体参见这里

  一个简单的代码如下:

[python]  view plain  copy
  1. # coding:utf-8  
  2. __author__ = "liuxuejiang"  
  3. import jieba  
  4. import jieba.posseg as pseg  
  5. import os  
  6. import sys  
  7. from sklearn import feature_extraction  
  8. from sklearn.feature_extraction.text import TfidfTransformer  
  9. from sklearn.feature_extraction.text import CountVectorizer  
  10.   
  11. if __name__ == "__main__":  
  12.     corpus=["我 来到 北京 清华大学",#第一类文本切词后的结果,词之间以空格隔开  
  13.         "他 来到 了 网易 杭研 大厦",#第二类文本的切词结果  
  14.         "小明 硕士 毕业 与 中国 科学院",#第三类文本的切词结果  
  15.         "我 爱 北京 天安门"]#第四类文本的切词结果  
  16.     vectorizer=CountVectorizer()#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频  
  17.     transformer=TfidfTransformer()#该类会统计每个词语的tf-idf权值  
  18.     tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))#第一个fit_transform是计算tf-idf,第二个fit_transform是将文本转为词频矩阵  
  19.     word=vectorizer.get_feature_names()#获取词袋模型中的所有词语  
  20.     weight=tfidf.toarray()#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重  
  21.     for i in range(len(weight)):#打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重  
  22.         print u"-------这里输出第",i,u"类文本的词语tf-idf权重------"  
  23.         for j in range(len(word)):  
  24.             print word[j],weight[i][j]  
程序输出:每行格式为:词语  tf-idf权重

[plain]  view plain  copy
  1. -------这里输出第 0 类文本的词语tf-idf权重------           #该类对应的原文本是:"我来到北京清华大学"  
  2. 中国 0.0  
  3. 北京 0.52640543361  
  4. 大厦 0.0  
  5. 天安门 0.0  
  6. 小明 0.0  
  7. 来到 0.52640543361  
  8. 杭研 0.0  
  9. 毕业 0.0  
  10. 清华大学 0.66767854461  
  11. 硕士 0.0  
  12. 科学院 0.0  
  13. 网易 0.0  
  14. -------这里输出第 1 类文本的词语tf-idf权重------           #该类对应的原文本是: "他来到了网易杭研大厦"  
  15. 中国 0.0  
  16. 北京 0.0  
  17. 大厦 0.525472749264  
  18. 天安门 0.0  
  19. 小明 0.0  
  20. 来到 0.414288751166  
  21. 杭研 0.525472749264  
  22. 毕业 0.0  
  23. 清华大学 0.0  
  24. 硕士 0.0  
  25. 科学院 0.0  
  26. 网易 0.525472749264  
  27. -------这里输出第 2 类文本的词语tf-idf权重------           #该类对应的原文本是: "小明硕士毕业于中国科学院“  
  28. 中国 0.4472135955  
  29. 北京 0.0  
  30. 大厦 0.0  
  31. 天安门 0.0  
  32. 小明 0.4472135955  
  33. 来到 0.0  
  34. 杭研 0.0  
  35. 毕业 0.4472135955  
  36. 清华大学 0.0  
  37. 硕士 0.4472135955  
  38. 科学院 0.4472135955  
  39. 网易 0.0  
  40. -------这里输出第 3 类文本的词语tf-idf权重------            #该类对应的原文本是: "我爱北京天安门"  
  41. 中国 0.0  
  42. 北京 0.61913029649  
  43. 大厦 0.0  
  44. 天安门 0.78528827571  
  45. 小明 0.0  
  46. 来到 0.0  
  47. 杭研 0.0  
  48. 毕业 0.0  
  49. 清华大学 0.0  
  50. 硕士 0.0  
  51. 科学院 0.0  
  52. 网易 0.0  

使用scikit-learn来计算一个简单的词频

CountVectorizer

  1. import pandas as pd
  2. import numpy as np
  3. from sklearn.feature_extraction.text import CountVectorizer
  4. texts=["dog cat fish","dog cat cat","fish bird","bird"]
  5. cv = CountVectorizer()
  6. cv_fit=cv.fit_transform(texts)
  7. print cv.vocabulary_
  8. {u'bird': 0, u'cat': 1, u'dog': 2, u'fish': 3}


cv.vocabulary_
在这种情况下,这是一个dict,其中的键是您找到的单词(功能),
值是索引0, 1, 2, 3,不是词频排序。

您需要使用cv_fit对象来获取计数

  1. from sklearn.feature_extraction.text import CountVectorizer
  2. texts=["dog cat fish","dog cat cat","fish bird", 'bird']
  3. cv = CountVectorizer()
  4. cv_fit=cv.fit_transform(texts)
  5. print(cv.get_feature_names())
  6. print(cv_fit.toarray())
  7. #['bird', 'cat', 'dog', 'fish']
  8. #[[0 1 1 1]
  9. # [0 2 1 0]
  10. # [1 0 0 1]
  11. # [1 0 0 0]]

数组中的每一行都是您的原始文档(字符串)之一,每列都是一个特征(单词),该元素是该特定单词和文档的计数。你可以看到,如果你把每列相加,你会得到正确的数字

  1. print(cv_fit.toarray().sum(axis=0))
  2. #[2 3 2 2]

老实说,我建议使用collections.Counter或从NLTK的东西,除非你有一些具体的理由使用scikit学习,因为它会更简单。

from collectionsimport Counter

  1. def build_vocab(sentences):
  2. """
  3. Builds a vocabulary mapping from word to index based on the sentences.
  4. Returns vocabulary mapping and inverse vocabulary mapping.
  5. """
  6. # Build vocabulary
  7. word_counts = Counter(itertools.chain(*sentences))
  8. # Mapping from index to word
  9. vocabulary_inv = [x[0] for x in word_counts.most_common()]
  10. # Mapping from word to index
  11. vocabulary = {x: i for i, x in enumerate(vocabulary_inv)}
  12. return [vocabulary, vocabulary_inv]
  13. '''
  14. import collections
  15. sentence = ["i", "love", "mom", "mom", "loves", "me"]
  16. collections.Counter(sentence)
  17. >>> Counter({'i': 1, 'love': 1, 'loves': 1, 'me': 1, 'mom': 2})
  18. '''


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

闽ICP备14008679号