PaddlePaddle中文文本分类实践

当我有个文本文件,里面的内容

窝沟封闭 , 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里面别忘记第一行加

然后就可以输入命令,开始训练了

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)

你可能感兴趣的:(PaddlePaddle中文文本分类实践)