当前位置:   article > 正文

Python 文本特征提取_python文本特征提取

python文本特征提取

一、字典特征抽取

使用到的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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

(0, 3) 80.0为例,是指坐标为(0,3)的对应值是80。这种方式读取效率较高。同时我们也可以让数据以one-hot编码的形式展示出来。
在这里插入图片描述
这里有两种方式,一种是在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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在这里插入图片描述

二、文本特征数值的统计

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

英文文本

使用到的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'>)
  • 1
  • 2

这里介绍一下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()) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

特征信息展示的是所有的信息,放在一个列表里面。而最后的结果,我们可以看到是一个 3 X 11的二维矩阵。其中每一行中的数值就是统计的每一句话中对应单词的个数。
需要注意的是:1、CountVectorizer没有sparse参数 ;2、单个单词不会进入统计例如:a,b,c,d。
在这里插入图片描述

中文文本

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

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

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

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

实现示例:

导入的库: 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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

分词后的结果为一个二维数组,如果对这个二维数组使用CountVectorizer会报错:AttributeError: ‘list’ object has no attribute ‘lower’
在这里插入图片描述
之所以会报这个错误,是因为CountVectorizer需要的是一个可迭代的string类型的数值。我们在前面对英文文本使用该api的时候,需注意到,因为英文文本单词之间默认是使用空格分开的,而中文中没有这种要求。所以此时我们需要对分词后的中文词语,彼此之间也用空格进行分隔,同时转换为成一维。

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

import jieba
def cut_word(text):
	return " ".join(list(jieba.cut(text)))
  • 1
  • 2
  • 3
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述
在这里插入图片描述

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())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/371933
推荐阅读
相关标签
  

闽ICP备14008679号