关于文本分类方面的

我有点懒,文章没有排版,就是直接黏贴,为的更多的是自己的记录,如果有人看希望别介意!

2.tfidf 有两种方式,一种是先转换为词频矩阵再转换成tfidf矩阵,另外一种是直接转换成tfidf矩阵,

CountVectorizer和TfidfTransformer、

TfidfVectorizer

http://blog.csdn.net/eastmount/article/details/50323063

Scikit-Learn中TF-IDF权重计算方法主要用到两个类:CountVectorizer和TfidfTransformer。

       1.CountVectorizer

        CountVectorizer类会将文本中的词语转换为词频矩阵,例如矩阵中包含一个元素a[i][j],它表示j词在i类文本下的词频。它通过fit_transform函数计算各个词语出现的次数,通过get_feature_names()可获取词袋中所有文本的关键字,通过toarray()可看到词频矩阵的结果。
        代码如下:

[python]  view plain  copy
  1. # coding:utf-8  
  2. from sklearn.feature_extraction.text import CountVectorizer  
  3.   
  4. #语料  
  5. corpus = [  
  6.     'This is the first document.',  
  7.     'This is the second second document.',  
  8.     'And the third one.',  
  9.     'Is this the first document?',  
  10. ]  
  11. #将文本中的词语转换为词频矩阵  
  12. vectorizer = CountVectorizer()  
  13. #计算个词语出现的次数  
  14. X = vectorizer.fit_transform(corpus)  
  15. #获取词袋中所有文本关键词  
  16. word = vectorizer.get_feature_names()  
  17. print word  
  18. #查看词频结果  
  19. print X.toarray()  
输出如下所示:
[python]  view plain  copy
  1. >>>   
  2. [u'and', u'document', u'first', u'is', u'one', u'second', u'the', u'third', u'this']  
  3. [[0 1 1 1 0 0 1 0 1]  
  4.  [0 1 0 1 0 2 1 0 1]  
  5.  [1 0 0 0 1 0 1 1 0]  
  6.  [0 1 1 1 0 0 1 0 1]]  
  7. >>>  

        从结果中可以看到,总共包括9个特征词,即:
        [u'and', u'document', u'first', u'is', u'one', u'second', u'the', u'third', u'this']
        同时在输出每个句子中包含特征词的个数。例如,第一句“This is the first document.”,它对应的词频为[0, 1, 1, 1, 0, 0, 1, 0, 1],假设初始序号从1开始计数,则该词频表示存在第2个位置的单词“document”共1次、第3个位置的单词“first”共1次、第4个位置的单词“is”共1次、第9个位置的单词“this”共1词。所以,每个句子都会得到一个词频向量。

        2.TfidfTransformer

        TfidfTransformer用于统计vectorizer中每个词语的TF-IDF值。具体用法如下:

[python]  view plain  copy
  1. # coding:utf-8  
  2. from sklearn.feature_extraction.text import CountVectorizer  
  3.   
  4. #语料  
  5. corpus = [  
  6.     'This is the first document.',  
  7.     'This is the second second document.',  
  8.     'And the third one.',  
  9.     'Is this the first document?',  
  10. ]  
  11. #将文本中的词语转换为词频矩阵  
  12. vectorizer = CountVectorizer()  
  13. #计算个词语出现的次数  
  14. X = vectorizer.fit_transform(corpus)  
  15. #获取词袋中所有文本关键词  
  16. word = vectorizer.get_feature_names()  
  17. print word  
  18. #查看词频结果  
  19. print X.toarray()  
  20.   
  21. from sklearn.feature_extraction.text import TfidfTransformer  
  22.   
  23. #类调用  
  24. transformer = TfidfTransformer()  
  25. print transformer  
  26. #将词频矩阵X统计成TF-IDF值  
  27. tfidf = transformer.fit_transform(X)  
  28. #查看数据结构 tfidf[i][j]表示i类文本中的tf-idf权重  
  29. print tfidf.toarray()  
        输出结果入下所示:


        3.别人示例

        如果需要同时进行词频统计并计算TF-IDF值,则使用核心代码:
        vectorizer=CountVectorizer()
        transformer=TfidfTransformer()
        tfidf=transformer.fit_transform(vectorizer.fit_transform(corpus))
        下面给出一个liuxuejiang158大神的例子,供大家学习,推荐大家阅读原文:
         python scikit-learn计算tf-idf词语权重 - liuxuejiang

[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]  
        输出如下所示:
[python]  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  
# coding=utf-8
mydoclist = [u'温馨 提示 : 家庭 畅享 套餐 介绍 、 主卡 添加 / 取消 副 卡 短信 办理 方式 , 可 点击 文档 左上方  短信  图标 即可 将 短信 指令 发送给 客户',
             u'客户 申请 i 我家 , 家庭 畅享 计划  后 , 可 选择 设置 1 - 6 个 同一 归属 地 的 中国移动 网 内 号码 作为 亲情 号码 , 组建 一个 家庭 亲情 网  家庭 内 ',
             u'所有 成员 可 享受 本地 互打 免费 优惠 , 家庭 主卡 号码 还 可 享受 省内 / 国内 漫游 接听 免费 的 优惠']
from sklearn.feature_extraction.text import CountVectorizer

# count_vectorizer = CountVectorizer(min_df=1)
# term_freq_matrix = count_vectorizer.fit_transform(mydoclist)
# print "Vocabulary:", count_vectorizer.vocabulary_
#
# from sklearn.feature_extraction.text import TfidfTransformer
#
# tfidf = TfidfTransformer(norm="l2")
# tfidf.fit(term_freq_matrix)
#
# tf_idf_matrix = tfidf.transform(term_freq_matrix)
# print tf_idf_matrix.todense()
# from __future__ import print_function


from sklearn.feature_extraction.text import TfidfVectorizer

tfidf_vectorizer = TfidfVectorizer(min_df=0)
tfidf_matrix = tfidf_vectorizer.fit_transform(mydoclist)
str = ''
for i in tfidf_vectorizer.vocabulary_:
    str += ' ' + i
print str
print tfidf_matrix.todense()
new_docs = [u'一个']
new_term_freq_matrix = tfidf_vectorizer.transform(new_docs)
print tfidf_vectorizer.vocabulary_, type(tfidf_vectorizer.vocabulary_)
str = ''
for i, j in sorted(tfidf_vectorizer.vocabulary_.items(), key=lambda d: d[1]):
    str += ' ' + i
print str
print [v for v in sorted(tfidf_vectorizer.vocabulary_.values())]
print sorted(tfidf_vectorizer.vocabulary_.items(), key=lambda d: d[1])

print new_term_freq_matrix.todense()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值