當(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)