文章目录

  • 一、字典特征抽取
  • 二、文本特征数值的统计
  • 英文文本
  • 中文文本
  • Tf-idf


一、字典特征抽取

使用到的API
DictVectorizer(sparse=True)

from sklearn.feature_extraction import DictVectorizer

sparse默认是True,返回一个稀疏矩阵。
该api作用是对数据生成一个one-hot编码.
下面用一个例子来看下api具体的用法。

from sklearn.feature_extraction import DictVectorizer
data = [
    {"name":"张三","score":80},
    {"name":"李四","score":85},
    {"name":"王五","score":90}
]
model =  DictVectorizer()
res = model.fit_transform(data)
#获取数据的特征名称
print(model.get_feature_names())
print(res)

(0, 3) 80.0为例,是指坐标为(0,3)的对应值是80。这种方式读取效率较高。同时我们也可以让数据以one-hot编码的形式展示出来。

python数据特征提取 python文本特征提取_python


这里有两种方式,一种是在DictVectorizer默认sparse=True的情况下,结果用toarray()函数。

另一种是sparse=False,此时结果没有toarray()函数.

data = [
    {"name":"张三","score":80},
    {"name":"李四","score":85},
    {"name":"王五","score":90}
]
model =  DictVectorizer(sparse=False)
res = model.fit_transform(data)
print(model.get_feature_names())
#使用toarray(),sparse=True的情况
#print(res.toarray())
#sparse=False的情况
print(res)

python数据特征提取 python文本特征提取_python数据特征提取_02

二、文本特征数值的统计

这里我们分为英文文本和中文文本两块进行讨论。

英文文本

使用到的API
CountVectorizer

from sklearn.feature_extraction.text import CountVectorizer

CountVectorizer里面含有的参数较多,感兴趣的可以详细了解一下

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'>)

这里介绍一下stop_words停词器的作用:
输入一个参数列表,在文本统计时,列表中的文字将不参与统计计算。
下面我们来看下具体的示例

from sklearn.feature_extraction.text import CountVectorizer
data = ["I like Python",
       "Python is best language",
        "I am study Python,i love Python very much"
       ]
 #没有sparse参数      
model = CountVectorizer()
res = model.fit_transform(data)
print(model.get_feature_names())
print(res.toarray())

特征信息展示的是所有的信息,放在一个列表里面。而最后的结果,我们可以看到是一个 3 X 11的二维矩阵。其中每一行中的数值就是统计的每一句话中对应单词的个数。

需要注意的是:1、CountVectorizer没有sparse参数 ;2、单个单词不会进入统计例如:a,b,c,d。

python数据特征提取 python文本特征提取_python数据特征提取_03

中文文本

之所以要把中文文本单独拿出来讨论,是因为中文的特殊性,在进行特征统计之前,需要先对文本进行分词。这里我们可以用jieba分词器来实现分词。可以通过 pip install jieba进行下载。
我们先演示下分词器的使用:

import jieba
text = "我爱你中国"
#此时输出的是一个地址值
jieba.cut(text)
结果:
<generator object Tokenizer.cut at 0x0000024D3D42F468>

我们可以把结果转为为一个list,此时就可以以列表的形式输出。

list(jieba.cut(text))
#结果:['我爱你', '中国']

实现示例:

导入的库: from sklearn.feature_extraction.text import CountVectorizer

from sklearn.feature_extraction.text import CountVectorizer
data = [
    "我正在学习机器学习中文本特征提取",
    "我爱中国",
    "你的梦想是什么"
]
words = []
for word in data:
    words.append(list(jieba.cut(word)))
 
#对值进行转换
model = CountVectorizer()
res = model.fit_transform(words)
res.toarray()

分词后的结果为一个二维数组,如果对这个二维数组使用CountVectorizer会报错:AttributeError: ‘list’ object has no attribute ‘lower’

python数据特征提取 python文本特征提取_python数据特征提取_04


之所以会报这个错误,是因为CountVectorizer需要的是一个可迭代的string类型的数值。我们在前面对英文文本使用该api的时候,需注意到,因为英文文本单词之间默认是使用空格分开的,而中文中没有这种要求。所以此时我们需要对分词后的中文词语,彼此之间也用空格进行分隔,同时转换为成一维。

首先定义一个分词方法,便于我们后续的使用。

import jieba
def cut_word(text):
	return " ".join(list(jieba.cut(text)))
from sklearn.feature_extraction.text import CountVectorizer
data = [
    "我正在学习机器学习中文本特征提取",
    "我爱中国",
    "你的梦想是什么"
]
words = []
for word in data:
    words.append(cut_word(word))
#值的转换
model = CountVectorizer()
res = model.fit_transform(words)
res.toarray()

python数据特征提取 python文本特征提取_sklearn_05


python数据特征提取 python文本特征提取_python数据特征提取_06

Tf-idf

除了上面介绍的文本特征提取还,还有一个Tfidf文本特征提取方法,它是用来评估一个词语对一个文本的重要程度,即一个词语在文章中出现的概率。
使用到的API:
TfidfVectorizer

from sklearn.feature_extraction.text import TfidfVectorizer

我们还是以上面的文本为例:

from sklearn.feature_extraction.text import TfidfVectorizer
def cut_word(text):
    return " ".join(list(jieba.cut(text)))
data = [
    "我正在学习机器学习中文本特征提取",
    "我爱中国",
    "你的梦想是什么"
]
words = []
for word in data:
    #words.append(list(jieba.cut(word)))
    words.append(cut_word(word))
    
tfidf = TfidfVectorizer()
res = tfidf.fit_transform(words)
print(tfidf.get_feature_names())
print(res.toarray())

python数据特征提取 python文本特征提取_python数据特征提取_07