在前面的几篇文章中我们有介绍NLP的概念、结巴分词的使用等等内容,那么我们应当如何进一步地讲文本数据转化为向量,也就是机器所能够理解地形式。
在机器学习的领域中,我们一般通过使用scikit-learn来进行文本向量化的操作,在scikit-learn当中,文本向量化的方式主要有两种,一种是基于单个词在文本中出现的次数来进行向量化的;另一种的基于词频-逆文本频率方法来进行向量化的。
首先我们准备好一段文字:
'今年前五个月我国制造业新增贷款同比增长10.1%银保监会最新统计,今年以来我国贷款投向结构进一步优化,今年前5个月,新增贷款的一半投向了基础设施建设、制造业、批发零售业和服务业等领域。其中制造业新增贷款1.4万亿元,同比增长10.1%,制造业中长期贷款和信用贷款增长明显加快。对湖北等地免费线上技能培训延长至8月底人力资源社会保障部日前表示,“国家人事人才培训网”等6家线上培训平台面向湖北、“三区三州”深度贫困地区等地的免费线上技能培训课程和直播活动将延长至8月底。线下人力资源社会保障部还将组织“技能大师扶贫组”深入贫困地区对口帮扶。安徽261个重点项目集中开工总投资超1200亿元今天(6月20日),安徽省261个重大项目集中开工,总投资超过1200亿元。新开工项目覆盖安徽16个市,涉及智能家电、新能源电池、餐厨油烟监测等战略性新兴产业以及传统产业升级改造。湖南省2020年抗洪抢险应急演练举行今天,国家综合性消防救援队伍、驻湘部队、医疗救援社会救援力量等共计1800多人,在湖南长沙进行了2020年抗洪抢险应急演练。演练过程中,直升机、冲锋舟、无人机等特种救援装备齐上阵,实战化检验抗洪抢险应急能力。精彩日环食天象明日在全球多地上演天文预报显示,6月21日,精彩的日环食天象将在全球多地上演。在我国,西藏、四川、重庆、贵州、湖南、江西、福建、台湾等地的部分地区将自西向东先后出现日环食景观,全国其他地区的人们可以看到日偏食。'
1.首先使用结巴分词进行文本的分词
import jieba
message = "今年前五个月我国制造业新增贷款同比增长10.1%银保监会最新统计,今年以来我国贷款投向结构进一步优化,今年前5个月,新增贷款的一半投向了基础设施建设、制造业、批发零售业和服务业等领域。其中制造业新增贷款1.4万亿元,同比增长10.1%,制造业中长期贷款和信用贷款增长明显加快。对湖北等地免费线上技能培训延长至8月底人力资源社会保障部日前表示,“国家人事人才培训网”等6家线上培训平台面向湖北、“三区三州”深度贫困地区等地的免费线上技能培训课程和直播活动将延长至8月底。线下人力资源社会保障部还将组织“技能大师扶贫组”深入贫困地区对口帮扶。安徽261个重点项目集中开工总投资超1200亿元今天(6月20日),安徽省261个重大项目集中开工,总投资超过1200亿元。新开工项目覆盖安徽16个市,涉及智能家电、新能源电池、餐厨油烟监测等战略性新兴产业以及传统产业升级改造。湖南省2020年抗洪抢险应急演练举行今天,国家综合性消防救援队伍、驻湘部队、医疗救援社会救援力量等共计1800多人,在湖南长沙进行了2020年抗洪抢险应急演练。演练过程中,直升机、冲锋舟、无人机等特种救援装备齐上阵,实战化检验抗洪抢险应急能力。精彩日环食天象明日在全球多地上演天文预报显示,6月21日,精彩的日环食天象将在全球多地上演。在我国,西藏、四川、重庆、贵州、湖南、江西、福建、台湾等地的部分地区将自西向东先后出现日环食景观,全国其他地区的人们可以看到日偏食。"
word = ' '.join(jieba.cut(message))
word
看一下结果,已经分好词啦:
2.使用停用词表进行文本筛选
words = ''
stopwords = [line.strip() for line in open('stopwords.txt',encoding='UTF-8').readlines()]
for w in word:
if w not in stopwords:
words = words + w
words
我们看一下结果:
3.使用词频的向量化方法——CountVectorizer
## 使用CountVectorizer将文本转化为向量 #基于单个词在文本中出现的次数来进行向量化
from sklearn.feature_extraction.text import CountVectorizer
with open('message.txt','w') as f:
f.write(words) #将上一步的分好词的文本保存为一个TXT文档
## 创建一个CountVectorizer实例 进行训练
vect = CountVectorizer()
f = open('message.txt','r')
vect.fit(f)
## 简化文本转化为向量
f = open('message.txt')
vectors = vect.transform(f) #文本向量化
print(vectors.toarray()[0])
我们来看看向量化之后的结果,可以看出来结果是根据词频来进行向量化的:
array([[1, 1, 2, 1, 1, 1, 2, 1, 2, 4, 2, 1, 1, 1, 1, 1, 2, 3, 1, 1, 3, 1,
2, 2, 1, 1, 1, 1, 1, 1, 3, 2, 1, 2, 1, 1, 1, 2, 3, 1, 4, 1, 3, 1,
1, 1, 1, 3, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 3, 1, 1,
1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 4, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1]])
4.通过词频-逆文本词频方法的向量化方法——TfidfVectorizer
## 使用TfidfVectorizer将文本转化为向量 #基于词频-逆文本词频方法来进行向量化
## 如果一个词可以很好地将不同的文档区分开来,算法就会给它分配更高的权重,如果某个词在所有的文档中出现的频率都很高,则说明这个词区分文档的作用不大,算法会给它分配一个较低的权重
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()##创建一个实例
f = open('message.txt')
vect_tf = tfidf.fit_transform(f)
print(vect_tf.toarray()[0])
我们看看向量化之后的结果:
[0.06274558051381586 0.06274558051381586 0.12549116102763172
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.12549116102763172 0.06274558051381586 0.12549116102763172
0.25098232205526344 0.12549116102763172 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.12549116102763172 0.18823674154144757
0.06274558051381586 0.06274558051381586 0.18823674154144757
0.06274558051381586 0.12549116102763172 0.12549116102763172
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.18823674154144757 0.12549116102763172 0.06274558051381586
0.12549116102763172 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.12549116102763172 0.18823674154144757
0.06274558051381586 0.25098232205526344 0.06274558051381586
0.18823674154144757 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.18823674154144757
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.12549116102763172 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.12549116102763172 0.12549116102763172 0.06274558051381586
0.18823674154144757 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.12549116102763172
0.06274558051381586 0.12549116102763172 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.12549116102763172 0.06274558051381586
0.25098232205526344 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.06274558051381586
0.12549116102763172 0.06274558051381586 0.06274558051381586
0.06274558051381586 0.06274558051381586 0.06274558051381586]
注意:TfidfVectorizer所进行的向量化结果是浮点数,而CountVectorizer向量化结果是整数。
注意:在文本个数不太多的情况下,使用CountVectorizer与TfidfVectorizer的效果并没有太大区别,但是当文本数量较多时,推荐使用TfidfVectorizer来进行操作,因为TfidfVectorizer的作用主要作用可以用于区分文档之间的不同。