sklearn中一般使用CountVectorizer和TfidfVectorizer这两个类来提取文本特征
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=
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())
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=
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,权值是tfidf,如果设为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