PaddlePaddle中文文本分類實(shí)踐

當(dāng)我有個(gè)文本文件,里面的內(nèi)容

窩溝封閉 , xx科室
牙齦腫痛, yy科室
……

那么我現(xiàn)在想做的是通過(guò)文本分類的model。得到我輸入齲齒,告訴我應(yīng)該到哪個(gè)科室的效果。

做的過(guò)程的如下:

第一步 分詞做詞典

我使用的方法是調(diào)用nlp.baidu.com上的詞法分析接口。
分出來(lái)詞之后,去重形成詞典。

第二步 做好詞表emb

根據(jù)上面的詞典,調(diào)用詞向量表示的接口,構(gòu)造詞表,但是過(guò)程中可能發(fā)現(xiàn)某些詞調(diào)用的時(shí)候,獲取不到向量。
建議的做法是分詞的時(shí)候分的詳細(xì)一點(diǎn)。

第三步 改model

paddlepaddle提供的文本分類的模型,要進(jìn)行適當(dāng)?shù)男薷?,才可以接受自己定義的數(shù)據(jù),詞典和詞表。
官網(wǎng)的model
這個(gè)model里面,寫(xiě)的是支持自定義的數(shù)據(jù)集。但是實(shí)際探索的過(guò)程中,總結(jié)一下更具體的用法。

待訓(xùn)練的數(shù)據(jù)

格式應(yīng)該是

好評(píng)\t菜品 很 好,很 喜歡 吃,味道 鮮美,入口 就化
差評(píng)\t難吃 死了,有 蒼蠅

這里要特別注意的就是分類和內(nèi)容之間,一定是\t分隔的。
并且內(nèi)容里面,要先分好詞。當(dāng)然如果是英文的訓(xùn)練數(shù)據(jù),就不用先走分詞這步了。
等待訓(xùn)練的數(shù)據(jù),要放到一個(gè)路徑中。

word_dict

word詞典,model可以根據(jù)訓(xùn)練數(shù)據(jù)構(gòu)建
詞頻大于5的。會(huì)被加到word_dict里,后面是詞頻。

lable_dict

lable詞典,model也是可以自動(dòng)構(gòu)建的

注意詞典也可以使用步驟一的分詞結(jié)果自己構(gòu)建出來(lái)。

要注意的是word_dict里面別忘記第一行加<UNK>

然后就可以輸入命令,開(kāi)始訓(xùn)練了

python train.py --train_data_dir=/home/work/sweetsky/model/text_classification/train_data/ --word_dict=/home/work/sweetsky/model/text_classification/word_dict --label_dict=/home/work/sweetsky/model/text_classification/lable_dict 

但是這個(gè)時(shí)候,會(huì)發(fā)現(xiàn)步驟二的詞向量沒(méi)有用到,并且如果訓(xùn)練數(shù)據(jù)量小的話,訓(xùn)練的效果并不好。那么自定義的詞向量就登場(chǎng)了

第四步 model使用自定義的詞向量

先寫(xiě)一個(gè)加載詞向量的函數(shù)
def load_parameter(file_name, h, w):                                                                
    with open(file_name, 'rb') as f:                                                                
        f.read(16)  # skip header.                                                                  
    return np.fromfile(f, dtype=np.float32).reshape(h, w)
在創(chuàng)建參數(shù)的時(shí)候,把詞向量加載進(jìn)來(lái)

詞向量的文件,是二進(jìn)制保存的,行是每個(gè)詞的向量。用行的index表示詞的id

    # create parameters                                                                                
    parameters = paddle.parameters.create(cost)                                                        
    parameters.set('emb', load_parameter(文件名, 行數(shù), 詞向量的維度))
在定義網(wǎng)絡(luò)的時(shí)候修改成
 # embedding layer                                                                                  
    emb_para = paddle.attr.Param(name='emb', initial_std=0., is_static=True)                           
    emb = paddle.layer.embedding(size=詞向量維度, input=x, param_attr=emb_para)                          
    #emb = paddle.layer.embedding(input=data, size=emb_dim)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容