当我有个文本文件,里面的内容
窝沟封闭 , xx科室
牙龈肿痛, yy科室
……
那么我现在想做的是通过文本分类的model。得到我输入龋齿,告诉我应该到哪个科室的效果。
做的过程的如下:
第一步 分词做词典
我使用的方法是调用nlp.baidu.com上的词法分析接口。
分出来词之后,去重形成词典。
第二步 做好词表emb
根据上面的词典,调用词向量表示的接口,构造词表,但是过程中可能发现某些词调用的时候,获取不到向量。
建议的做法是分词的时候分的详细一点。
第三步 改model
paddlepaddle提供的文本分类的模型,要进行适当的修改,才可以接受自己定义的数据,词典和词表。
官网的model
这个model里面,写的是支持自定义的数据集。但是实际探索的过程中,总结一下更具体的用法。
待训练的数据
格式应该是
好评\t菜品 很 好,很 喜欢 吃,味道 鲜美,入口 就化
差评\t难吃 死了,有 苍蝇
这里要特别注意的就是分类和内容之间,一定是\t分隔的。
并且内容里面,要先分好词。当然如果是英文的训练数据,就不用先走分词这步了。
等待训练的数据,要放到一个路径中。
word_dict
word词典,model可以根据训练数据构建
词频大于5的。会被加到word_dict里,后面是词频。
lable_dict
lable词典,model也是可以自动构建的
注意词典也可以使用步骤一的分词结果自己构建出来。
要注意的是word_dict里面别忘记第一行加<UNK>
然后就可以输入命令,开始训练了
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
但是这个时候,会发现步骤二的词向量没有用到,并且如果训练数据量小的话,训练的效果并不好。那么自定义的词向量就登场了
第四步 model使用自定义的词向量
先写一个加载词向量的函数
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)
在创建参数的时候,把词向量加载进来
词向量的文件,是二进制保存的,行是每个词的向量。用行的index表示词的id
# create parameters
parameters = paddle.parameters.create(cost)
parameters.set('emb', load_parameter(文件名, 行数, 词向量的维度))
在定义网络的时候修改成
# 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)