我有点懒,文章没有排版,就是直接黏贴,为的更多的是自己的记录,如果有人看希望别介意!
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()可看到词频矩阵的结果。
代码如下:
- # coding:utf-8
- from sklearn.feature_extraction.text import CountVectorizer
- #语料
- corpus = [
- 'This is the first document.',
- 'This is the second second document.',
- 'And the third one.',
- 'Is this the first document?',
- ]
- #将文本中的词语转换为词频矩阵
- vectorizer = CountVectorizer()
- #计算个词语出现的次数
- X = vectorizer.fit_transform(corpus)
- #获取词袋中所有文本关键词
- word = vectorizer.get_feature_names()
- print word
- #查看词频结果
- print X.toarray()
- >>>
- [u'and', u'document', u'first', u'is', u'one', u'second', u'the', u'third', u'this']
- [[0 1 1 1 0 0 1 0 1]
- [0 1 0 1 0 2 1 0 1]
- [1 0 0 0 1 0 1 1 0]
- [0 1 1 1 0 0 1 0 1]]
- >>>
从结果中可以看到,总共包括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值。具体用法如下:
- # coding:utf-8
- from sklearn.feature_extraction.text import CountVectorizer
- #语料
- corpus = [
- 'This is the first document.',
- 'This is the second second document.',
- 'And the third one.',
- 'Is this the first document?',
- ]
- #将文本中的词语转换为词频矩阵
- vectorizer = CountVectorizer()
- #计算个词语出现的次数
- X = vectorizer.fit_transform(corpus)
- #获取词袋中所有文本关键词
- word = vectorizer.get_feature_names()
- print word
- #查看词频结果
- print X.toarray()
- from sklearn.feature_extraction.text import TfidfTransformer
- #类调用
- transformer = TfidfTransformer()
- print transformer
- #将词频矩阵X统计成TF-IDF值
- tfidf = transformer.fit_transform(X)
- #查看数据结构 tfidf[i][j]表示i类文本中的tf-idf权重
- 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
- # coding:utf-8
- __author__ = "liuxuejiang"
- import jieba
- import jieba.posseg as pseg
- import os
- import sys
- from sklearn import feature_extraction
- 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()#获取词袋模型中的所有词语
- 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]
- -------这里输出第 0 类文本的词语tf-idf权重------ #该类对应的原文本是:"我来到北京清华大学"
- 中国 0.0
- 北京 0.52640543361
- 大厦 0.0
- 天安门 0.0
- 小明 0.0
- 来到 0.52640543361
- 杭研 0.0
- 毕业 0.0
- 清华大学 0.66767854461
- 硕士 0.0
- 科学院 0.0
- 网易 0.0
- -------这里输出第 1 类文本的词语tf-idf权重------ #该类对应的原文本是: "他来到了网易杭研大厦"
- 中国 0.0
- 北京 0.0
- 大厦 0.525472749264
- 天安门 0.0
- 小明 0.0
- 来到 0.414288751166
- 杭研 0.525472749264
- 毕业 0.0
- 清华大学 0.0
- 硕士 0.0
- 科学院 0.0
- 网易 0.525472749264
- -------这里输出第 2 类文本的词语tf-idf权重------ #该类对应的原文本是: "小明硕士毕业于中国科学院“
- 中国 0.4472135955
- 北京 0.0
- 大厦 0.0
- 天安门 0.0
- 小明 0.4472135955
- 来到 0.0
- 杭研 0.0
- 毕业 0.4472135955
- 清华大学 0.0
- 硕士 0.4472135955
- 科学院 0.4472135955
- 网易 0.0
- -------这里输出第 3 类文本的词语tf-idf权重------ #该类对应的原文本是: "我爱北京天安门"
- 中国 0.0
- 北京 0.61913029649
- 大厦 0.0
- 天安门 0.78528827571
- 小明 0.0
- 来到 0.0
- 杭研 0.0
- 毕业 0.0
- 清华大学 0.0
- 硕士 0.0
- 科学院 0.0
- 网易 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()