使用Sentencepiece +CNN进行文本分类
Sentencepiece是google開源的文本Tokenzier工具,其主要原理是利用統(tǒng)計(jì)算法,在語(yǔ)料庫(kù)中生成一個(gè)類似分詞器的工具,外加可以將詞token化的功能;對(duì)比開源的分詞器,它會(huì)將頻繁出現(xiàn)的字符串作為詞,然后形成詞庫(kù)進(jìn)行切分,所以它會(huì)切分的粒度會(huì)更大些。
例如“機(jī)器學(xué)習(xí)領(lǐng)域“這個(gè)文本,按jieba會(huì)分“機(jī)器/學(xué)習(xí)/領(lǐng)域”,但你想要粒度更大的切分效果,如“機(jī)器學(xué)習(xí)/領(lǐng)域”或者不切分,這樣更有利于模型捕捉更多N-gram特征。為實(shí)現(xiàn)這個(gè),你可能想到把對(duì)應(yīng)的大粒度詞加到詞表中就可以解決,但是添加這類詞是很消耗人力。然而對(duì)于該問題,利用sentencepiece可以得到一定程度解決,甚至能完美解決你的需求。
基于上述的場(chǎng)景,本項(xiàng)目主要探究利用sentencepiece進(jìn)行文本分類,對(duì)比開源的分詞器,會(huì)有怎樣的效果。在實(shí)驗(yàn)中,選擇的是中文新聞文本數(shù)據(jù)集,對(duì)比的開源分詞器選擇的是jieba。若想對(duì)sentencepiece有更多的了解,可以查看sentencepiece原理與實(shí)踐。
1 環(huán)境
python3
tensorflow2.0
jieba
sentencepiece
numpy
2 數(shù)據(jù)集及前期處理
本實(shí)驗(yàn)同樣是使用THUCNews的一個(gè)子集進(jìn)行訓(xùn)練與測(cè)試,數(shù)據(jù)集請(qǐng)自行到THUCTC:一個(gè)高效的中文文本分類工具包下載,請(qǐng)遵循數(shù)據(jù)提供方的開源協(xié)議;
文本類別涉及10個(gè)類別:categories = [‘體育’, ‘財(cái)經(jīng)’, ‘房產(chǎn)’, ‘家居’, ‘教育’, ‘科技’, ‘時(shí)尚’, ‘時(shí)政’, ‘游戲’, ‘娛樂’],每個(gè)分類6500條數(shù)據(jù);
cnews.train.txt: 訓(xùn)練集(500010)
cnews.val.txt: 驗(yàn)證集(50010)
cnews.test.txt: 測(cè)試集(1000*10)
訓(xùn)練所用的數(shù)據(jù),可以下載:鏈接: https://pan.baidu.com/s/1DOgxlY42roBpOKAMKPPKWA, 密碼: up9d
其實(shí),本項(xiàng)目是基于詞級(jí)別的CNN for text classification, 只是這個(gè)詞一個(gè)從jieba切分過來的,一個(gè)是sentencepiece訓(xùn)練的模型識(shí)別出來的。在預(yù)處理過程中,本項(xiàng)目中只是簡(jiǎn)單的過濾標(biāo)點(diǎn)符號(hào),數(shù)字類型的詞,具體code體現(xiàn)在loader.py 文中的 re_han=re.compile(u"([\u4E00-\u9FD5a-zA-Z]+)")。
3 超參數(shù)說明
class TextConfig():embedding_size=100 #dimension of word embeddingvocab_size=8000 #number of vocabularyseq_length=600 #max length of sentencenum_filters=128 #number of convolution kernelfilter_sizes=[2,3,4]num_classes=10hidden_unit=128drop_prob=0.5 #droppoutlr= 1e-3 #learning ratenum_epochs=10 #epochsbatch_size=64 #batch_sizespm=True #use sentencepiecetrain_dir='./data/cnews.train.txt'val_dir='./data/cnews.val.txt'test_dir='./data/cnews.test.txt'vocab_dir='./data/vocab.txt'在與jieba對(duì)比的時(shí), 默認(rèn)設(shè)定的vocab_size=8000, spm參數(shù)控制是否use sentencepiece,其他參數(shù)都是一致的;./data/vocab.txt是用jieba切分后前8000的高頻詞;
4 實(shí)驗(yàn)對(duì)比
(1) 訓(xùn)練和驗(yàn)證準(zhǔn)確率對(duì)比
| jieba+word2vec+cnn | 1.000 | 0.971 | 0.9723 |
| jieba+cnn | 0.9988 | 0.9686 | 0.9706 |
| spm+cnn | 0.9972 | 0.9704 | 0.9667 |
(2) 訓(xùn)練中損失變化對(duì)比
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-NRPZ0yY2-1606111442274)(https://github.com/cjymz886/sentencepiece-text-classification/blob/main/imgs/img_loss.png)]
從訓(xùn)練結(jié)果來看,二者相差并不大,利用spm+cnn在驗(yàn)證集上有一定的提升,但在測(cè)試集jieba+cnn表現(xiàn)好一些。通過這些微小數(shù)據(jù)對(duì)比,個(gè)人覺得利用sentencepiece相對(duì)jieba這類正規(guī)分詞器來說,更容易過擬合些,換個(gè)角度來說,它捕捉的特征更多些,但也帶來更多噪聲特征的影響。
(3) 載入數(shù)據(jù)集的消耗時(shí)間
| jieba+cnn | 475 |
| spm+cnn | 80 |
對(duì)比jieba分詞器,sentencepiece切分效率是它的近6倍,基于這個(gè)優(yōu)勢(shì),是可以看出sentencepiece的使用價(jià)值的,尤其當(dāng)處理文檔級(jí)文本的時(shí)候。
(4) 是不是詞表越大越好
在與jieba對(duì)比中,設(shè)定的是8000個(gè)高頻詞,可能有疑問:是不是詞表越大效果會(huì)越好?對(duì)此,本實(shí)驗(yàn)在spm+cnn模型下,對(duì)比了詞表8000,20000,320000(sentencepiece能訓(xùn)練的最大詞表),效果如下:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-62hx3hTi-1606111442275)(https://github.com/cjymz886/sentencepiece-text-classification/blob/main/imgs/img_acc.png)]
可以看出,隨著詞表增大,在訓(xùn)練集上更早的達(dá)到“潛在的最好效果”,而在驗(yàn)證集上的表現(xiàn)越來越差。理論上不是詞表越大越好嗎,它畢竟降低了未登錄詞出現(xiàn)的概率。其實(shí),我想是這樣的,該新聞數(shù)據(jù)集的各個(gè)label區(qū)分度是很高的,也就是說影響每個(gè)label的特征都是很明顯的,而且這些影響特征都是可用高頻詞匯組合出來的。如果加大詞表,就相當(dāng)于training過程中,讓model學(xué)到很多l(xiāng)abel的噪聲特征,導(dǎo)致在驗(yàn)證集上效果降低
還有一個(gè)原因:該數(shù)據(jù)集不論基于字,詞,或者加上word2vec詞向量,它的train_accuracy都很高;如果一個(gè)數(shù)據(jù)集的train_accuracy較低,增加詞表應(yīng)該會(huì)有正向的提升。
(4) spm不同詞表下切分效果對(duì)比
在訓(xùn)練sentencepiece,可以設(shè)定輸出詞表的大小。本實(shí)驗(yàn)訓(xùn)練了8000,20000,320000三個(gè)級(jí)別的spm model,對(duì)比jieba,看看它們切分文本的效果,如下:
| no_segement | 新浪體育訊北京時(shí)間4月27日,NBA季后賽首輪洛杉磯湖人主場(chǎng)迎戰(zhàn)新奧爾良黃蜂 |
| jieba | 新浪\體育訊\北京\時(shí)間\4\月\27\日\(chéng),\NBA\季后賽\首輪\洛杉磯\湖人\主場(chǎng)\迎戰(zhàn)\新奧爾良\黃蜂 |
| spm_8000 | \新浪體育訊北京時(shí)間\4\月\27\日,\NBA\季后賽\首\輪\洛杉磯\湖人\主場(chǎng)\迎\戰(zhàn)\新\奧\爾\良\黃蜂 |
| spm_20000 | \新浪體育訊北京時(shí)間\4\月\27\日,\NBA\季后賽\首輪\洛杉磯湖人\主場(chǎng)迎戰(zhàn)\新\奧爾良\黃蜂 |
| spm_320000 | 新浪體育訊北京時(shí)間\4\月\27\日,\NBA\季后賽首輪\洛杉磯湖人主場(chǎng)迎戰(zhàn)新奧爾良黃蜂 |
對(duì)比顯示:隨著詞表增大,spm切分的粒度越來越大;三個(gè)spm模型都將“新浪體育訊北京時(shí)間”當(dāng)一個(gè)詞塊,說明語(yǔ)料庫(kù)中該詞塊出現(xiàn)的頻率很高;在spm_320000模型下,將“洛杉磯湖人主場(chǎng)迎戰(zhàn)新奧爾良黃蜂”切在一起,粒度是相當(dāng)?shù)拇?#xff0c;直接是將一句話當(dāng)成一個(gè)詞塊。
此外,可以看出spm_8000下粒度太細(xì)了,很多單字情況,這種情況明顯是沒有jieba效果好,也就影響了模型的訓(xùn)練,試想:如果在訓(xùn)練spm模型的時(shí)候,是不是可以限定下詞的長(zhǎng)度,只要長(zhǎng)度2以上的高頻詞匯,是不是再去詞token化效果會(huì)好些。
我之前也嘗試:讓jieba先切分下,形成詞列表,然后再用sentencepiece去訓(xùn)練,這樣二者就有種互補(bǔ)的效果,一來減少jieba因?yàn)樵~庫(kù)的原因?qū)е潞芏喔哳l詞組切開的影響,二來可利用sentencepiece的切分效率。但在實(shí)際操作中,并沒有實(shí)現(xiàn),不知道是對(duì)開源的sentencepiece工具沒搞清楚,還是它本事就有這個(gè)問題。之前也有朋友遇到同樣的問題,也與他探討過,當(dāng)目前還是沒解決…
5 結(jié)語(yǔ)
利用sentencpiece代替分詞器進(jìn)行下游任務(wù),是完全可行的,一來它與正規(guī)分詞器對(duì)比效果是相當(dāng)?shù)?#xff0c;二來它的切分效率很高,可降低模型在token化消耗的時(shí)間,這對(duì)在工業(yè)上應(yīng)用是合適的。只是在使用過程中,可調(diào)式下詞表大小,不宜過高,但也要具體場(chǎng)景具體對(duì)比看下,是否有必要把詞表加大。此外,如果在領(lǐng)域性很強(qiáng)的任務(wù)時(shí),或者在做multi-label任務(wù)時(shí),我想sentencpiece帶來的效果應(yīng)該更明顯。當(dāng)然,上述提到的問題,若能解決,會(huì)讓sentencpiece在中文處理上更有價(jià)值。對(duì)此感興趣的朋友,若有啥問題,可與我私下交流~
6 參考
更多文章可關(guān)注筆者公眾號(hào):自然語(yǔ)言處理算法與實(shí)踐
總結(jié)
以上是生活随笔為你收集整理的使用Sentencepiece +CNN进行文本分类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器人零力拖动技术路线
- 下一篇: 十大热门职位发布 高薪行业一目了然