深度学习分词项目笔记 2016-11-26 # 深度学习分词项目笔记 一直关注微信公众号“待字闺中”这周推送了两篇文章,关于深度学习中文分词,在周五的时候把整个项目开源了,[开源地址](https://github.com/koth/kcws),准确率97.5% . 说到分词,我深入研究过[jieba](https://github.com/fxsjy/jieba),后来又去看了几个Java版的中文分词工具,感觉大家的思路都差不多,主要使用CRF(条件随机场)。网上也可以找到各种自然语言处理的对比。看到深度学习分词,格外手痒,决定去看个究竟,首先得把代码跑起来,所以就先跑起来。具体的原理可以去[公众号文章](https://mp.weixin.qq.com/s?__biz=MjM5ODIzNDQ3Mw==&mid=2649966433&idx=1&sn=be6c0e5485003d6f33804261df7c3ecf&chksm=beca376789bdbe71ef28c509776132d96e7e662be0adf0460cfd9963ad782b32d2d5787ff499&mpshare=1&scene=2&srcid=1122cZnCbEKZCCzf9LOSAyZ6&from=timeline&key=&ascene=2&uin=&devicetype=android-19&version=26031f30&nettype=WIFI), koth在[项目文档](https://github.com/koth/kcws)中写了比较清晰的训练过程,由于很多东西都不是很熟,几乎是第一次接触,有必要记录些细节的东西。此纯属个人笔记,不小心对你有帮助,纯属偶然。 ## 构建 我使用Ubuntu 14.04 项目本身使用[Tensorflow](https://www.tensorflow.org/),和word2vec。使用[Bazel](https://bazel.build/)构建项目. ### Install Bazel [Bazel](https://bazel.build/) 是Google 开源的项目构建工具,以前没用过,安装过程最好按照[官方文档](https://bazel.build/versions/master/docs/install.html#ubuntu)一步一步来,我看它需要JDK,由于我已经安装了JDK就不再想安装,后来折腾半天还是按照文档搞定。 ### Tensorflow 1.clone Tensorflow ``` git clone https://github.com/tensorflow/tensorflow.git ``` 进入tensorflow ```./config``` 这一步通常是不能成功的,需要联网下载依赖会超时,因为你懂的原因,所以最好有代理。 我还直接使用pip 安装了Tensorflow ### build 文档给出的是 ``` bazel build //kcws/cc:seg_backend_api ``` 对bazel不太熟悉,不知道在构建什么东西,我感觉不会对训练产生影响,只是在生成api的部分。当然这个也需要你能翻墙,不然几乎不会成的。 ## 训练 项目使用的是2014年人民日报,项目有详细的训练过程,我大概看了下代码,注释下每一步。 1. 首先处理语料成但字分割,存储在```chars_for_w2v.txt```作为```word2vec```的输入。 ``` python kcws/train/process_anno_file.py <语料目录> chars_for_w2v.txt ``` 2.使用```vord2vec```得到字嵌入结果,koth没有给出具体过程,我去[下载](https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/word2vec/source-archive.zip)了word2vec的源代码,然后到项目目录```make``` 运行了下```demo-word.sh```,如果你没有翻墙,可能下载不了数据,可以手动去把数据下载下来,解压到```word2vec/trunk```路径下,数据[下载地址](http://mattmahoney.net/dc/text8.zip) 我直接使用demo-word.sh的命令运行了,忘了更换向量长度为50,koth使用的是50,也就是```-size```的值改成50 ``` time ./word2vec -train chars_for_w2v.txt -output vec.txt -cbow 1 -size 200 -window 8 -negative 25 -hs 0 -sample 1e-4 -threads 20 -binary 1 -iter 15 ``` 3 第一句暂时看不懂了,大概是在构建一些代码。第二句应该是在把所有语料映射成vec,最后切分训练和测试集。 ``` bazel build kcws/train:generate_training ./bazel-bin/kcws/train/generate_training vec.txt <语料目录> all.txt python kcws/train/filter_sentence.py all.txt (得到train.txt , test.txt) ``` 4 train ``` python kcws/train/train_cws_lstm.py --word2vec_path vec.txt --train_data_path <绝对路径到train.txt> --test_data_path test.txt --max_sentence_len 80 --learning_rate 0.001 ``` 由于我前面word2vec的时候size是200所以我改了下,train_cws_lstm.py ``` tf.app.flags.DEFINE_integer("embedding_size", 200, "embedding size") ``` 还没跑完,已经97%了,真的我也需要一台GPU,穷人只能等了。 