jieba分词中文之后再用CountVectorizer提取特征

前言

本文举例,用jieba完成中文自动分词(不用手动去加空格分)。然后将jieba分好词的中文用CountVectorizer提取特征

一、jieba给一段中文分词举例

目标:完成一个中文的自动分词,比如:“有时候我觉得自己像一只小小鸟"to"有时候 我 觉得 自己 像 一只 小小鸟”

1.1程序分步看清每一步的过程

import jieba#先导包
#准备一个数据text
text='有时候我觉得自己像一只小小鸟'
#把text喂入到jieba.cut()中
a=jieba.cut(text)#此时会返回一个词语生成器
print('打印一下a:{} 并且a的类型是:{}'.format(a,type(a)))

打印一下a:<generator object Tokenizer.cut at 0x000000000A3708E0> 并且a的类型是:<class ‘generator’>

#但拿到词语生成器还不行,需要强转为list类型
b=list(a)#此时会把句子分好词之后放进列表里面
print('打印一下b:{} 并且b的类型是:{}'.format(b,type(b)))

打印一下b:[‘有时候’, ‘我’, ‘觉得’, ‘自己’, ‘像’, ‘一只’, ‘小小鸟’] 并且b的类型是:<class ‘list’>

#要达到最终的目的还是需要再转成字符串
c=' '.join(b)
print('打印一下c:{} 并且c的类型是:{}'.format(c,type(c)))

打印一下c:有时候 我 觉得 自己 像 一只 小小鸟 并且c的类型是:<class ‘str’>
将一个字符串str喂入到jieba.cut()方法中得到一个生成器,然后将生成器强转为list再转为str就达到了中文分词的目的。
实际开发的时候以上步骤可以简化一下:

1.2将中文字符串str返回分词完str(一步到位)

代码如下:

#一步到位 不用分步骤
text='有时候我觉得自己像一只小小鸟'
text_new=' '.join(list(jieba.cut(text)))
print("text_new:{}\t及其类型:{}".format(text_new,type(text_new)))

text_new:有时候 我 觉得 自己 像 一只 小小鸟 及其类型:<class ‘str’>

二、jieba分词中文之后再用CountVectorizer提取特征

2.1jieba分词

import jieba#先导包

#有3句话str在一个list里面
data=[  '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候',
        '但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?',
        '是有人偷了他 们罢:那是谁?又藏在何处呢?是他们自己逃走了罢——如今又到了哪里呢?'
    ]
#先遍历list里的str并用jieba分好词
data_new=[]#先用一个空列表准备接收,待会儿把分好词的str放进来
for text in data:
    data_new.append(' '.join(list(jieba.cut(text))))
print(data_new)

[‘燕子 去 了 , 有 再 来 的 时候 ; 杨柳 枯 了 , 有 再 青 的 时候 ; 桃花 谢 了 , 有 再 开 的 时候’, ‘但是 , 聪明 的 , 你 告诉 我 , 我们 的 日子 为什么 一去不复返 呢 ?’, ‘是 有人 偷 了 他 们 罢 : 那 是 谁 ? 又 藏 在 何处 呢 ? 是 他们 自己 逃走 了 罢 — — 如今 又 到 了 哪里 呢 ?’]

2.2CountVectorizer提取特征提取2.1Jieba分好的词

from sklearn.feature_extraction.text import CountVectorizer
#将这个data_new分好词的str组成的list用CountVectorizer提取一下特征
#实例化一个CountVectorizer 停用一下几个字
transfer=CountVectorizer(stop_words=['了','的','呢'])

#将data_new喂入实例化好的transfer的fit-transform()方法之中
cvt_data_new=transfer.fit_transform(data_new)#此时返回一个sparse稀疏矩阵

print('看一下cvt_data_new的值:\n{}'.format(cvt_data_new))
print('看一下cvt_data_new的类型:{}'.format(type(cvt_data_new)))
print("特征名字:{}".format(transfer.get_feature_names()))
print('看一下cvt_data_new的shape:{}'.format(cvt_data_new.shape))
#将sparse矩阵转换成数组,统计每一个样本出现的特征值的个数
print('cvt_data_new转换成数组:\n{}'.format(cvt_data_new.toarray()))

运行结果如下(我调整了一下截图了,这样看起来方便一些):
在这里插入图片描述

总结

中文直接用CountVectorizer()提取特征不太合适,因为中文不像英文,单词之间有空格。中文用CountVectorizer()需要字词之间分好词了再用,用手动分词的话得不偿失。所以可以先用jieba分好词了,再给CountVectorizer()提取特征。本文讲了一下jieba分词的用法和结合CountVectorizer()使用提取中文特征(如果您发现我写的有错误,欢迎在评论区批评指正)。

猜你喜欢

转载自blog.csdn.net/qq_27328197/article/details/113814452