CountVectorizer类和TfidfVectorizer类

sklearn中一般使用CountVectorizer和TfidfVectorizer这两个类来提取文本特征

CountVectorizer类

CountVectorizer 类会将文本中的词语转换为词频矩阵。也就是通过分词后将所有的文档中的全部词作为一个字典(就是类似于新华字典这种)。然后将每一行的词用0,1矩阵来表示。并且每一行的长度相同,长度为字典的长度,在词典中存在,置为1,否则,为0。

参数解释

from sklearn.feature_extraction.text import CountVectorizer
vectorizer =CountVectorizer(input=‘content’, encoding=‘utf-8’, decode_error=‘strict’, strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), analyzer=‘word’, max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=<class ‘numpy.int64’>)

input: 一般使用默认即可,可以设置为"filename’或’file’
encodeing: 使用默认的utf-8即可,分析器将会以utf-8解码raw document
decode_error: 默认为strict,遇到不能解码的字符将报UnicodeDecodeError错误,设为ignore将会忽略解码错误,还可以设为replace,作用尚不明确
strip_accents: 默认为None,可设为ascii或unicode,将使用ascii或unicode编码在预处理步骤去除raw document中的重音符号
analyzer: 一般使用默认,可设置为string类型,如’word’, ‘char’, ‘char_wb’,还可设置为callable类型,比如函数是一个callable类型
preprocessor: 设为None或callable类型
tokenizer: 设为None或callable类型
ngram_range: 词组切分的长度范围
stop_words: 设置停用词,设为english将使用内置的英语停用词,设为一个list可自定义停用词,设为None不使用停用词,设为None且max_df∈[0.7, 1.0)将自动根据当前的语料库建立停用词表
lowercase: 将所有字符变成小写
token_pattern: 表示token的正则表达式,需要设置analyzer == ‘word’,默认的正则表达式选择2个及以上的字母或数字作为token,标点符号默认当作token分隔符,而不会被当作token
max_df: 可以设置为范围在[0.0 1.0]的float,也可以设置为没有范围限制的int,默认为1.0。这个参数的作用是作为一个阈值,当构造语料库的关键词集的时候,如果某个词的document frequence大于max_df,这个词不会被当作关键词。如果这个参数是float,则表示词出现的次数与语料库文档数的百分比,如果是int,则表示词出现的次数。如果参数中已经给定了vocabulary,则这个参数无效
min_df: 类似于max_df,不同之处在于如果某个词的document frequence小于min_df,则这个词不会被当作关键词
max_features: 默认为None,可设为int,对所有关键词的term frequency进行降序排序,只取前max_features个作为关键词集
vocabulary: 默认为None,自动从输入文档中构建关键词集,也可以是一个字典或可迭代对象?
binary: 默认为False,一个关键词在一篇文档中可能出现n次,如果binary=True,非零的n将全部置为1,这对需要布尔值输入的离散概率模型的有用的
dtype: 使用CountVectorizer类的fit_transform()或transform()将得到一个文档词频矩阵,dtype可以设置这个矩阵的数值类型

属性:
vocabulary_:字典类型,key为关键词,value是特征索引,样例如下:

示例

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(min_df=1)

corpus = ['This is the first document.',
          'This is the second second document.',
          'And the third one.',
          'Is this the first document?',
          ]
X = vectorizer.fit_transform(corpus)
feature_name = vectorizer.get_feature_names()

print(X)
print(feature_name)
print(X.toarray())

结果:在这里插入图片描述

TfidfVectorizer类

参数解释

from sklearn.feature_extraction.text import TfidfTransformer
transformer = TfidfTransformer(input=‘content’, encoding=‘utf-8’, decode_error=‘strict’, strip_accents=None, lowercase=True, preprocessor=None, tokenizer=None, analyzer=‘word’, stop_words=None, token_pattern=’(?u)\b\w\w+\b’, ngram_range=(1, 1), max_df=1.0, min_df=1, max_features=None, vocabulary=None, binary=False, dtype=<class ‘numpy.int64’>, norm=‘l2’, use_idf=True, smooth_idf=True, sublinear_tf=False)

TfidfVectorizer与CountVectorizer有很多相同的参数,下面只解释不同的参数
binary: 默认为False,tf-idf中每个词的权值是tfidf,如果binary设为True,所有出现的词的tf将置为1,TfidfVectorizer计算得到的tf与CountVectorizer得到的tf是一样的,就是词频,不是词频/该词所在文档的总词数。
norm: 默认为’l2’,可设为’l1’或None,计算得到tf-idf值后,如果norm=‘l2’,则整行权值将归一化,即整行权值向量为单位向量,如果norm=None,则不会进行归一化。大多数情况下,使用归一化是有必要的。
use_idf: 默认为True,权值是tf
idf,如果设为False,将不使用idf,就是只使用tf,相当于CountVectorizer了。
smooth_idf: idf平滑参数,默认为True,idf=ln((文档总数+1)/(包含该词的文档数+1))+1,如果设为False,idf=ln(文档总数/包含该词的文档数)+1
sublinear_tf: 默认为False,如果设为True,则替换tf为1 + log(tf)。

示例

from sklearn.feature_extraction.text import TfidfTransformer
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()
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))
print(tfidf)

结果:
在这里插入图片描述

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ['This is the first document.',
          'This is the second second document.',
          'And the third one.',
          'Is this the first document?',
          ]

tfidf = TfidfVectorizer()
re = tfidf.fit_transform(corpus)
print (re)

结果:
在这里插入图片描述

总代码示例:

from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer

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是将文本转为词频矩阵
print((vectorizer.fit_transform(corpus)).toarray())
print(tfidf)
word = vectorizer.get_feature_names()  # 获取词袋模型中的所有词语
print(word)

weight = tfidf.toarray()  # 将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
for i in range(len(weight)):  # 打印每类文本的tf-idf词语权重,第一个for遍历所有文本,第二个for便利某一类文本下的词语权重
    print("-------这里输出第", i, "类文本的词语tf-idf权重------")
    for j in range(len(word)):
        print(word[j], weight[i][j])
print(weight)

[[0 1 0 0 0 1 0 0 1 0 0 0]
[0 0 1 0 0 1 1 0 0 0 0 1]
[1 0 0 0 1 0 0 1 0 1 1 0]
[0 1 0 1 0 0 0 0 0 0 0 0]]

(0, 8) 0.6676785446095399
(0, 5) 0.5264054336099155
(0, 1) 0.5264054336099155
(1, 11) 0.5254727492640658
(1, 6) 0.5254727492640658
(1, 5) 0.41428875116588965
(1, 2) 0.5254727492640658
(2, 10) 0.4472135954999579
(2, 9) 0.4472135954999579
(2, 7) 0.4472135954999579
(2, 4) 0.4472135954999579
(2, 0) 0.4472135954999579
(3, 3) 0.7852882757103967
(3, 1) 0.6191302964899972

[‘中国’, ‘北京’, ‘大厦’, ‘天安门’, ‘小明’, ‘来到’, ‘杭研’, ‘毕业’, ‘清华大学’, ‘硕士’, ‘科学院’, ‘网易’]

-------这里输出第 0 类文本的词语tf-idf权重------
中国 0.0 北京 0.5264054336099155 大厦 0.0 天安门 0.0 小明 0.0 来到 0.5264054336099155 杭研 0.0 毕业 0.0 清华大学 0.6676785446095399 硕士 0.0 科学院 0.0 网易 0.0
-------这里输出第 1 类文本的词语tf-idf权重------
中国 0.0 北京 0.0 大厦 0.5254727492640658 天安门 0.0 小明 0.0 来到 0.41428875116588965 杭研 0.5254727492640658 毕业 0.0 清华大学 0.0 硕士 0.0 科学院 0.0 网易 0.5254727492640658
-------这里输出第 2 类文本的词语tf-idf权重------
中国 0.4472135954999579 北京 0.0 大厦 0.0 天安门 0.0 小明 0.4472135954999579 来到 0.0 杭研 0.0 毕业 0.4472135954999579 清华大学 0.0 硕士 0.4472135954999579 科学院 0.4472135954999579 网易 0.0
-------这里输出第 3 类文本的词语tf-idf权重------
中国 0.0 北京 0.6191302964899972 大厦 0.0 天安门 0.7852882757103967 小明 0.0 来到 0.0 杭研 0.0 毕业 0.0 清华大学 0.0 硕士 0.0 科学院 0.0 网易 0.0

在这里插入图片描述

原文链接:https://blog.csdn.net/du_qi/article/details/51564303

### 回答1: 答:CountVectorizerTfidfVectorizer可以一起使用,以构建一个更加强大的特征集,从而更好地处理文本分任务。CountVectorizer可以检测词汇的出现频率,TfidfVectorizer则可以识别重要的词汇。通过结合这两种技术,可以有效地处理贝叶斯文本分程序。 ### 回答2: 在贝叶斯文本分程序中,可以使用CountVectorizerTfidfVectorizer来进行特征提取和向量化处理。 CountVectorizer可以将文本数据转化为文档-词矩阵,其中每一行表示一个文档,每一列表示一个词,矩阵元素记录了对应词在文档中出现的次数。使用CountVectorizer可以将文本数据转化为计数矩阵。 TfidfVectorizer基于CountVectorizer的基础上,使用了TF-IDF技术进行向量化。TF-IDF是一种常用的信息检索和文本挖掘技术,它能够反映一个词的重要性。TF-IDF的计算基于词在文档中的频率(Term Frequency, TF)和在整个语料库中的逆文档频率(Inverse Document Frequency, IDF)。 因此,在贝叶斯文本分的程序中,可以先使用CountVectorizer对文本数据进行转换,得到计数矩阵。然后,再使用TfidfVectorizer对计数矩阵进行进一步转换,得到TF-IDF矩阵。 使用CountVectorizerTfidfVectorizer一起使用的代码如下所示: ``` python from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer # 假设文本数据存储在变量texts中 # 使用CountVectorizer进行特征提取 count_vectorizer = CountVectorizer() count_matrix = count_vectorizer.fit_transform(texts) # 使用TfidfVectorizer对计数矩阵进行进一步转换 tfidf_vectorizer = TfidfVectorizer() tfidf_matrix = tfidf_vectorizer.fit_transform(count_matrix) ``` 通过以上代码,我们可以得到最终的TF-IDF矩阵(tfidf_matrix),该矩阵可以作为贝叶斯分器的输入进行文本分任务。 ### 回答3: 在贝叶斯文本分的程序中,CountVectorizerTfidfVectorizer可以同时使用来处理文本数据。 首先,CountVectorizer被用来将文本数据转换为词频向量。它可以将原始文本中的单词进行计数,并将每个单词出现的次数作为特征的值。这样可以根据词频统计来表示文本数据,并将其转换成机器学习算法可处理的数字形式。 然而,CountVectorizer仅仅计算每个单词在文本中的出现次数,忽略了单词在整个语料库中的重要性。为了解决这个问题,我们可以引入TfidfVectorizerTfidfVectorizer会通过计算每个单词的“词频-逆文档频率”(Term Frequency-Inverse Document Frequency,TF-IDF)来赋予单词重要性权重。TF-IDF是一个用于评估某个词语对于一个文档集合中的某份文档的重要程度的统计方法。它通过计算每个单词的词频和逆文档频率的乘积,来反映单词在整个语料库中的重要性。TF-IDF越高,表示该单词对于某个文档的区分度越高。 因此,在贝叶斯文本分的程序中,可以先使用CountVectorizer将文本数据转换为词频向量,再使用TfidfVectorizer来赋予每个单词重要性权重。这样可以同时考虑每个单词在文本数据中的出现次数和在整个语料库中的重要性,从而提高文本分的准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值