文本关键词提取(TF与TF-IDF)-CountVectorizer()和TfidfVectorizer()

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

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

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

目录

sklearn-CountVectorizer()函数

sklearn-TfidfVectorizer()函数

一个中文提取的例子:


sklearn-CountVectorizer()函数

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]]

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算法。

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

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
 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值