应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

使用TensorFlow进行文本分类

  1前言
  在自然语言处理中,文本分类是非常普遍的应用,本文将介绍使用TensorFlow开发基于嵌入(Embedding)的文本分类模型,由于TensorFlow的API变化迅速且兼容性感人,因此本文均使用的截至2022年4月16日最新版的TensorFlow(tf)及相关库,主要包括:TensorFlow(v2。8。0),TensorFlowDatasets(tfdsv4。0。1)和TensorFlowText(tftextv2。8。1),如遇bug,请首先检查TensorFlow相关库的版本。此工作流主要使用的API有:tf。stringstfdstftexttf。data。Datasettf。keras(SequentialFunctionalAPI)2获取数据
  TensorFlowDatasets(tfds)里含有非常多的示例数据〔1〕用于研究试验,本文使用经典的电影评论数据,进行情感二分类任务的研究。首先使用tfds的API直接加载数据,结果将存在一个tf。data。Dataset〔2〕对象中。importcollectionsimportpathlibimporttensorflowastffromtensorflow。kerasimportlayersfromtensorflow。kerasimportlossesfromtensorflow。kerasimportutilsfromtensorflow。keras。layersimportTextVectorizationimporttensorflowdatasetsastfdsimporttensorflowtextastftextimportplotly。expressaspximportmatplotlib。pyplotaspltBATCHSIZE32Trainingset。traindstfds。load(imdbreviews,splittrain〔:80〕,shufflefilesTrue,assupervisedTrue)Validationsetatf。data。Datasetobjectvaldstfds。load(imdbreviews,splittrain〔80:〕,shufflefilesTrue,assupervisedTrue)Checkthecountofrecordsprint(trainds。cardinality()。numpy())print(valds。cardinality()。numpy())
  返回值为:200005000
  使用如下方法查看一条示例数据:fordata,labelintrainds。take(1):print(type(data))print(Text:,data。numpy())print(Label:,label。numpy())
  返回值为:classtensorflow。python。framework。ops。EagerTensorText:bThiswasanabsolutelyterriblemovie。DontbeluredinbyChristopherWalkenorMichaelIronside。Botharegreatactors,butthismustsimplybetheirworstroleinhistory。Eventheirgreatactingcouldnotredeemthismoviesridiculousstoryline。ThismovieisanearlyninetiesUSpropagandapiece。ThemostpatheticsceneswerethosewhentheColumbianrebelsweremakingtheircasesforrevolutions。MariaConchitaAlonsoappearedphony,andherpseudoloveaffairwithWalkenwasnothingbutapatheticemotionalpluginamoviethatwasdevoidofanyrealmeaning。Iamdisappointedthattherearemovieslikethis,ruiningactorslikeChristopherWalkensgoodname。Icouldbarelysitthroughit。Label:03文本预处理
  该小节使用tftext和tf。stings的处理文本的API对数据进行处理,tf。data。Dataset能够很方便地将对应的函数映射到数据中,推荐学习和使用。3。1转换文字大小写
  分类任务中字符大小写对模型预测没有贡献,因此对dataset使用map操作把所有字符转为小写,务必注意tf。data。Dataset里的数据格式。traindstrainds。map(lambdatext,label:(tftext。casefoldutf8(text),label))valdsvalds。map(lambdatext,label:(tftext。casefoldutf8(text),label))3。2文本格式化
  该步骤对文本使用正则表达式进行格式化处理,如标点前后加上空格,利于后续步骤使用空格分词。strregexpattern〔(〔AZaz09(),!?〕,),(s,s,),(ve,ve),(nt,nt),(re,re),(d,d),(ll,ll),(,,,),(!,!),((,(),(),)),(?,?),(s{2,},)〕forpattern,rewriteinstrregexpattern:traindstrainds。map(lambdatext,label:(tf。strings。regexreplace(text,patternpattern,rewriterewrite),label))valdsvalds。map(lambdatext,label:(tf。strings。regexreplace(text,patternpattern,rewriterewrite),label))3。3构建词表
  使用训练集构造词表(注意不要使用验证集或者测试集,会导致信息泄露),该步骤将字符映射到相应的索引,利于将数据转化为模型能够进行训练和预测的格式。Donotusevalidationsetasthatwillleadtodataleaktraintexttrainds。map(lambdatext,label:text)tokenizertftext。WhitespaceTokenizer()uniquetokenscollections。defaultdict(lambda:0)sentencelength〔〕fortextintraintext。asnumpyiterator():tokenstokenizer。tokenize(text)。numpy()sentencelength。append(len(tokens))fortokenintokens:uniquetokens〔token〕1checkouttheaveragesentencelength250tokensprint(sum(sentencelength)len(sentencelength))print10mostusedtokenstoken,frequencydview〔(v,k)fork,vinuniquetokens。items()〕dview。sort(reverseTrue)forv,kindview〔:10〕:print(s:d(k,v))
  返回值显示,高频使用的词都是英语中常见的字符:bthe:269406b,:221098band:131502ba:130309bof:116695bto:108605bis:88351bbr:81558bit:77094bin:75177
  也可以使用图表直观地展示每个词的使用频率,这一步有利于帮助选择词表的大小。figpx。scatter(xrange(len(dview)),y〔cntforcnt,wordindview〕)fig。show()
  字符的使用频率分布
  由图可见,在七万多个字符中,许多字符出现的频率极低,因此选择词表大小为两万。3。4构建词表映射
  使用TensorFlow的tf。lookup。StaticVocabularyTable对字符进行映射,其能将字符映射到对应的索引上,并使用一个简单的样本进行测试。keys〔tokenforcnt,tokenindview〕〔:vocabsize〕valuesrange(2,len(keys)2)Reserve0forpadding,1forOOVtokens。numoovbuckets1Note:mustassignthekeydtypeandvaluedtypewhenthekeysandvaluesarePythonarraysinittf。lookup。KeyValueTensorInitializer(keyskeys,valuesvalues,keydtypetf。string,valuedtypetf。int64)tabletf。lookup。StaticVocabularyTable(init,numoovbucketsnumoovbuckets)Testthelookuptablewithsampleinputinputtensortf。constant(〔emerson,lake,palmer,king〕)print(table〔inputtensor〕。numpy())
  输出为:array(〔20000,2065,14207,618〕)
  接下来就可以将文本映射到索引上了,构造一个函数用于转化,并将它作用到数据集上:deftextindexlookup(text,label):tokenizedtokenizer。tokenize(text)vectorizedtable。lookup(tokenized)returnvectorized,labeltraindstrainds。map(textindexlookup)valdsvalds。map(textindexlookup)3。5配置数据集
  借助tf。data。Dataset的cache和prefetchAPI,能够有效提高性能,cache方法将数据加载在内存中用于快速读写,而prefetch则能够在模型预测时同步处理数据,提高时间利用率。AUTOTUNEtf。data。AUTOTUNEdefconfiguredataset(dataset):returndataset。cache()。prefetch(buffersizeAUTOTUNE)traindsconfiguredataset(trainds)valdsconfiguredataset(valds)
  文本长短不一,但神经网络需要输入数据具有固定的维度,因此对数据进行padding确保长度一致,并分批次。BATCHSIZE32traindstrainds。paddedbatch(BATCHSIZE)valdsvalds。paddedbatch(BATCHSIZE)3。6处理测试集
  用于验证模型性能的测试集也可以使用同样的方式处理,确保模型可以正常预测:Testset。testdstfds。load(imdbreviews,splittest,batchsizeBATCHSIZE,shufflefilesTrue,assupervisedTrue)testdstestds。map(lambdatext,label:(tftext。casefoldutf8(text),label))forpattern,rewriteinstrregexpattern:testdstestds。map(lambdatext,label:(tf。strings。regexreplace(text,patternpattern,rewriterewrite),label))testdstestds。map(textindexlookup)testdsconfiguredataset(testds)testdstestds。paddedbatch(BATCHSIZE)4建立模型4。1使用SequentialAPI构建卷积神经网络vocabsize20forpaddingand1foroovtokendefcreatemodel(vocabsize,numlabels,dropoutrate):modeltf。keras。Sequential(〔tf。keras。layers。Embedding(vocabsize,128,maskzeroTrue),tf。keras。layers。Conv1D(32,3,paddingvalid,activationrelu,strides1),tf。keras。layers。MaxPooling1D(poolsize2),tf。keras。layers。Conv1D(64,4,paddingvalid,activationrelu,strides1),tf。keras。layers。MaxPooling1D(poolsize2),tf。keras。layers。Conv1D(128,5,paddingvalid,activationrelu,strides1),tf。keras。layers。GlobalMaxPooling1D(),tf。keras。layers。Dropout(dropoutrate),tf。keras。layers。Dense(numlabels)〕)returnmodeltf。keras。backend。clearsession()modelcreatemodel(vocabsizevocabsize,numlabels2,dropoutrate0。5)在SGD中使用momentum将显著提高收敛速度losslosses。SparseCategoricalCrossentropy(fromlogitsTrue)optimizertf。keras。optimizers。SGD(learningrate0。01,momentum0。9)model。compile(lossloss,optimizeroptimizer,metricsaccuracy)print(model。summary())
  输出为:Model:sequentialLayer(type)OutputShapeParamembedding(Embedding)(None,None,128)2560256conv1d(Conv1D)(None,None,32)12320maxpooling1d(MaxPooling1D(None,None,32)0)conv1d1(Conv1D)(None,None,64)8256maxpooling1d1(MaxPooling(None,None,64)01D)conv1d2(Conv1D)(None,None,128)41088globalmaxpooling1d(Globa(None,128)0lMaxPooling1D)dropout(Dropout)(None,128)0dense(Dense)(None,2)258Totalparams:2,622,178Trainableparams:2,622,178Nontrainableparams:0
  接下来即可训练、评估模型:earlystoppingreducestheriskofoverfittingearlystoppingtf。keras。callbacks。EarlyStopping(patience10)epochs100historymodel。fit(xtrainds,validationdatavalds,epochsepochs,callbacks〔earlystopping〕)loss,accuracymodel。evaluate(testds)print(Loss:,loss)print(Accuracy:{:2。2}。format(accuracy))
  考虑到模型结构简单,效果还可以接受:782782〔〕57s72mssteploss:0。4583accuracy:0。8678Loss:0。45827823877334595Accuracy:86。784。2使用FunctionalAPI构建双向LSTM
  步骤与使用SequentialAPI类似,但FunctionalAPI更为灵活。inputtf。keras。layers。Input(〔None〕)xtf。keras。layers。Embedding(inputdimvocabsize,outputdim128,UsemaskingtohandlethevariablesequencelengthsmaskzeroTrue)(input)xtf。keras。layers。Bidirectional(tf。keras。layers。LSTM(64))(x)xtf。keras。layers。Dense(64,activationrelu)(x)xtf。keras。layers。Dropout(dropoutrate)(x)outputtf。keras。layers。Dense(numlabels)(x)lstmmodeltf。keras。Model(inputsinput,outputsoutput,nametextlstmmodel)losslosses。SparseCategoricalCrossentropy(fromlogitsTrue)optimizertf。keras。optimizers。SGD(learningrate0。01,momentum0。9)lstmmodel。compile(lossloss,optimizeroptimizer,metricsaccuracy)lstmmodel。summary()
  输出为:Model:textlstmmodelLayer(type)OutputShapeParaminput5(InputLayer)〔(None,None)〕0embedding5(Embedding)(None,None,128)2560256bidirectional4(Bidirectio(None,128)98816nal)dense4(Dense)(None,64)8256dropout2(Dropout)(None,64)0dense5(Dense)(None,2)130Totalparams:2,667,458Trainableparams:2,667,458Nontrainableparams:0
  同样地,对模型进行训练与预测:history2lstmmodel。fit(xtrainds,validationdatavalds,epochsepochs,callbacks〔earlystopping〕)loss,accuracylstmmodel。evaluate(testds)print(Loss:,loss)print(Accuracy:{:2。2}。format(accuracy))
  考虑到模型结构简单,效果还可以接受:782782〔〕84s106mssteploss:0。4105accuracy:0。8160Loss:0。4105057716369629Accuracy:81。605总结
  关于文本分类,还有许多新的技术可以尝试,上述工作流中也还有许多决策可以做试验(炼丹),本文旨在使用最新的TensorFlowAPI过一遍文本分类任务中的重要知识点和常用API,实际工作中仍有许多地方可以优化。希望这次的分享对你有帮助,欢迎在评论区留言讨论!参考资料
  〔1〕TensorFlowDatasets数据集:https:www。tensorflow。orgdatasets
  〔2〕tf。data。Dataset:https:www。tensorflow。orgapidocspythontfdataDataset

光环无限GI评测9。25分开启系列新纪元我坐在天蝎号坦克的驾驶舱中一路轰鸣,缓慢驶上一个小坡来到流放者要塞大门前。一阵炮击过后,门外的哨兵们甘拜下风,但我的对手早已料到了这招,在狭隘的山路上准备了路障。我的陆战队员们……科学家首次利用ALMA捕捉到爆炸性中子星合并带来的毫米波光研究人员首次利用美国国家科学基金会国家射电天文台(NRAO)运营的国际天文台阿塔卡马大型毫米波亚毫米波阵列(ALMA),捕捉到了中子星和另一颗恒星合并带来的强烈爆炸的毫米波光。……品读惊蛰丨掩卷闲思春雷韵,一窗新绿迎惊蛰春雷乍动,万物复苏蛰伏了一个冬天的昆虫开始苏醒自此树始绿,花始开草长莺飞,春意渐浓春暖大地的欢愉如约而至世界开始热闹起来枝头春满,树绿……14岁!身高1米97,巩晓彬公子挑战美国篮球,有望成下一个曾北京时间5月6日,根据蔡崇信篮球奖学金获奖人名单正式公布,6名获奖学生球员今秋将赴美留学。其中,外界备受关注的巩晓彬爱子巩俊彤成功入选,他即将赴美留学的高中正是蒙哥利马主教高中……国际黄金短期就看低多大家好,这里是本元资本,黄金在周末就说建议大家改变思路,所以空头谨慎,短期看低多,接下来继续分析一下黄金黄金在昨天开盘后打到最高位置1670后,向下回调寻求二次探底,目前……中午吃得少,晚上吃再多也还是饿,这是咋回事?中午吃得少,晚上吃再多也还是饿,这是咋回事?浙江大学附属第一医院营养科副主任医师王磊中午吃得少,晚上吃再多也还是饿,这是咋回事?门诊中,经常有患者问我这个问题。导致……玩拼图伤眼吗?用对了有益视力发育图视觉中国文广州日报全媒体记者梁超仪通讯员邰梦云、魏春福随着生活条件的改善,市面上针对小朋友的玩具五花八门,种类繁多。在这些丰富的玩具中,小朋友时常接触精细的玩具部……夺2枚金牌还不满足?德国34岁名将吐槽北京冬奥会,理由真幼稚2022年北京冬奥会取得圆满成功,国际奥委会主席巴赫用简约、精彩、安全六个字高度赞扬了中国举办大型体育赛事的能力,而大多数运动员们在北京冬奥会也载誉而归,感受到了东道主的热情服……什么是化学宇宙由物质构成。撇开暗物质不谈,98的物质都是纯氢和氦。但值得庆幸的是,数十亿年前,超级巨星们将氢和氦融合成所有其他元素,然后以大爆炸的方式,将它们扩散到整个宇宙。这就是……欧文1换2,杜兰特1换9?湖人不输勇士,联盟第二剑指总冠军NBA休赛期,篮网成了全联盟关注的焦点。几乎没有人会想到,杜兰特会向篮网提出交易申请。杜兰特去年休赛期与篮网续约4年1。98亿,这份合同下赛季才开始生效。杜兰特与篮网的合同还有……乒乓球WTT冠军赛第2日战报中国军团7战6胜,林高远彪悍大头布达佩斯时间7月19日,WTT冠军赛首轮第二个比赛日的比赛全部决出胜负。中国军团七人出战首轮下半程的较量,除王楚钦以23不敌瑞典卡尔森外,林高远让二追三,逆转林昀儒,让人……叠溪地震人祸远大于天灾叠溪古城遗址生逢乱世的叠溪古城,注定成为惨烈的历史。地震形成堰塞湖叠溪古城本在岷江旁,8月25日地震导致的山体滑坡,不但使叠溪古城被蚕陵山(又名龙池山)山体崩……
大侠传奇侠客江湖三职业满攻速传奇新游大侠传奇手游是一款三职业超变版本的传奇手游,战法相辅相成。它以金庸先生笔下的侠客江湖为背景我们现在就来聊一下这款游戏三个职业的特点。众所周知,战士职业近战无敌,法师拥有超高技能……詹姆斯续约了詹姆斯续约了,2年9710万,合同第二年有球员选项,2024年夏天可以跳出。2024年布朗尼参加选秀,也就是说,如果詹姆斯想,父子同台基本可以保证实现。既然詹姆斯已经续约……孩子在家,一周早餐就变成了这样,天天都吃不烦孩子在家,一周早餐就变成了这样,天天都吃不烦。大家有没有同感,只要孩子在家,家里的早餐基本都是孩子爱吃的。曾经孩子给我讲过一个冷笑话:话说大人都说孩子爱挑食,大人怎……夫妻不够恩爱和亲密,试试多说说这些甜蜜话夫妻之间想要甜甜蜜蜜,就要常说甜蜜话;夫妻之间想要美美满满,就要常说美满话;夫妻之间想要亲亲密密,就要常说亲密话。嵩馥夫妻情感健康中心(上海北京深圳)的老师常说,适当的甜蜜话语……秋冬哪些护肤品值得下单?这些年用过的平价好用的护肤品推荐秋冬哪些护肤品值得下单?这些年用过的平价好用的护肤品推荐!花钰集氨基酸洗面奶适合肤质:任何肤质花钰集氨基酸洗面奶帮您实现深层水嫩肌。增添肌肤活力,肌肤重现细滑……又一轮金融危机袭来?主角换了?自从2008年美国爆发金融危机以来,全球一直未脱离危机的阴霾。只不过,过去十多年里,危机的主战场都是新兴市场。2013年,美联储开始缩减债券购买计划时,巴西、印度、……一天签下4。48亿合同,布克唐斯的女经纪人能抽多少佣金?数字本赛季的NBA已经结束,进入休赛期后,球员该转会的转会,该续约的续约,已经有不少球星都拿到了新合同,约基奇5年2。56亿美元续约掘金,布克4年2。24亿美元续约太阳,莫兰特5年……光遇关于联动季节的猜想,四大试炼扩展,曙光季地图可能在晨岛前言:大家好,我是阿瑶,每天为你发布游戏领域最新情报。虽然官方早早公布了季节联动,但是测试服一直没能更新,玩法、先祖、道具类型,玩家们一概不知。在这种情况下,只能一……今日立秋,建议大家少吃西瓜和猪肉,多吃5样,滋养润燥少上火人不管走到哪一步,总得找点乐子,想一点办法。是的,美食就是我找的乐子,想的办法!小谈食刻和你一起认真对待吃下的食物!导读:立秋到了,它标志着秋季的开始,是二十四节气……中交建筑集团有限公司正式成立30日,中交建筑集团有限公司成立大会在京举行。中交建筑集团供图中新网9月30日电题:中交建筑集团有限公司正式成立中新财经作者刘文文30日,中交建筑集团有限公司……挚研宏微光伏产业,从夹缝生存到扎根黄土高原富煤贫油这一能源储量特征,深深影响了我国发电产业的发展。近年来,碳中和成为国际环保领域的共识,光伏发电凭借其高效、环保、经济等特点,在动力源迭代中逐渐坐稳了位置,今天,对外市场……网友曝光iPhone14pro渲染图,iPhone13跌至谷目前在海外社交平台上,已经有网友曝光出了iPhone14系列的渲染图和机模谍照,可以看出,在iPhone14系列中,iPhone14pro和14promax将会采用横向感叹号形……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网