DeepLearning 4 J入門——コンピュータに『天龍八部』を読ませる

6968 ワード

早く実験室でお金の赤ちゃんがGoogleのWord 2 Vectorで「天龍八部」を読んで指定語に関するいくつかの単語を見つけました.最近は新しく出た深さを勉強しています.DL 4 Jクイック入門をご覧ください. http://deeplearning4j.org/quickstart.html .
DeepLearning 4 JのExampleには多くの応用例があります.Word 2 Vectorもその中にあります.ですから、私の仕事は主に以下のステップです.
1.    開発環境と元データの準備
2.    単語、書式変換
3.    Word 2 Vectorモデルを構築して訓練します.
4.    テストと出力
 
一.     開発環境と元データの準備
開発環境はIDEA、JDK 1.7、Maven 3.3.1を使っています.
上の侠客小説ネットは1篇の《天龍八部》をダウンロードして、ファイルの最後尾の関連していない情報を取り除いて、改めて指定の位置に置いて、OK.
二.     単語、書式変換
私は復旦NLPを使うのが好きです.一つは熟練したものを使うことです.二つは使うのも便利です.MavenはFNLPを引用するのはちょっと問題があります.解決方法は前の文章を参考にしてもいいです.ここでは詳しく説明しません.
Javaプロジェクト(またはDL 4 J-exampleプロジェクトを直接使用)を新設し、Javaクラスを新設し、FudanTokenizerと命名しました.
package edu.zju.cst.krselee.example.word2vector;

/**
 * Created by KrseLee on 16/7/20.
 */

    import org.fnlp.nlp.cn.tag.CWSTagger;
    import org.fnlp.util.exception.LoadModelException;

    import java.io.IOException;
    import java.util.List;

    import org.fnlp.ml.types.Dictionary;
    import org.fnlp.nlp.corpus.StopWords;

public class FudanTokenizer {

    private CWSTagger tag;

    private StopWords stopWords;

    public FudanTokenizer() {
        String path = this.getClass().getClassLoader().getResource("").getPath();
        System.out.println(path);
        try {
            tag = new CWSTagger(path + "models/seg.m");
        } catch (LoadModelException e) {
            e.printStackTrace();
        }

    }

    public String processSentence(String context) {
        String s = tag.tag(context);
        return s;
    }

    public String processSentence(String sentence, boolean english) {
        if (english) {
            tag.setEnFilter(true);
        }
        return tag.tag(sentence);
    }

    public String processFile(String filename) {
        String result = tag.tagFile(filename);

        return result;
    }

    /**
     *       
     */
    public boolean setDictionary() {
        String dictPath = this.getClass().getClassLoader().getResource("models/dict.txt").getPath();

        Dictionary dict = null;
        try {
            dict = new Dictionary(dictPath);
        } catch (IOException e) {
            return false;
        }
        tag.setDictionary(dict);
        return true;
    }

    /**
     *      
     */
    public List flitStopWords(String[] words) {
        try {
            List baseWords = stopWords.phraseDel(words);
            return baseWords;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

そしてモデルファイル(FNLPのホームページからダウンロードできます)をresourceディレクトリに拷問します.
pom.xmlにFNLPの依存を追加します.
 
        
            org.fnlp
            fnlp-core
            2.1-SNAPSHOT
        

        
            junit
            junit
            4.11
        
       などのMavenはプロジェクトをコンパイルして、前にダウンロードしたデータファイルをresourceディレクトリの下に置いて、主な方法またはユニットテストを新たに作成して分詞を実行します.
 
 public void processFile() throws Exception{
        String filePath = this.getClass().getClassLoader().getResource("text/tlbb.txt").getPath();
        BufferedReader in = new BufferedReader(new FileReader(filePath));

        File outfile = new File("/Users/KrseLee/dataset/tlbb_t.txt");
        if (outfile.exists()) {
            outfile.delete();
        }
        FileOutputStream fop = new FileOutputStream(outfile);

        //   FileOutputStream  ,          
        String line = in.readLine();
        OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
        while(line!=null) {
            line = tokenizer.processSentence(line);
            writer.append(line);
            line = in.readLine();
        }
        in.close();
        writer.close(); //      ,             
        fop.close(); //      ,      
    }
三.     Word 2 Vectorモデルを構築して訓練します.
DeepLearning 4 Jの依存パッケージを導入し、Java Class ZhWord 2 Vectorを新設しました.コードは以下の通りです.
package edu.zju.cst.krselee.example.word2vector;

import org.canova.api.util.ClassPathResource;
import org.deeplearning4j.models.embeddings.loader.WordVectorSerializer;
import org.deeplearning4j.models.word2vec.Word2Vec;
import org.deeplearning4j.text.sentenceiterator.BasicLineIterator;
import org.deeplearning4j.text.sentenceiterator.SentenceIterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;

/**
 * Created by KrseLee on 16/7/20.
 */
public class ZhWord2Vector {
    private static Logger log = LoggerFactory.getLogger(ZhWord2Vector.class);

    public static void main(String[] args) throws Exception {

        String filePath = new ClassPathResource("text/tlbb_t.txt").getFile().getAbsolutePath();

        log.info("Load & Vectorize Sentences....");
        // Strip white space before and after for each line
        SentenceIterator iter = new BasicLineIterator(filePath);
        // Split on white spaces in the line to get words

        log.info("Building model....");
        Word2Vec vec = new Word2Vec.Builder()
            .minWordFrequency(5)
            .iterations(1)
            .layerSize(100)
            .seed(42)
            .windowSize(5)
            .iterate(iter)
            .build();

        log.info("Fitting Word2Vec model....");
        vec.fit();

        log.info("Writing word vectors to text file....");

        // Write word vectors
        WordVectorSerializer.writeWordVectors(vec, "tlbb_vectors.txt");
        WordVectorSerializer.writeFullModel(vec,"tlbb_model.txt");
        String[] names = {"  ","  ","  ","  ","   ","  ","  ","   "};
        log.info("Closest Words:");

        for(String name:names) {
            System.out.println(name+">>>>>>");
            Collection lst = vec.wordsNearest(name, 10);
            System.out.println(lst);
        }
    }
}
       前のステップで得られた出力ファイルをレスポンスディレクトリにコピーします.
四.     テストと出力
表示したい単語を変更して、プログラムを実行して、約4分間待って、出力します.異なったコンピュータは性能の原因の必要な時間が一致しませんため、深いネットの訓練自身も1件の時間の労力がかかります.
  >>>>>>
[  ,   ,    ,   ,  ,   ,   ,   ,  ,   ]
  >>>>>>
[ ,   ,  ,    ,   ,  ,   ,   ,   ,   ]
  >>>>>>
[  ,   ,  ,   ,  ,   ,  ,   ,   ,   ]
  >>>>>>
[  ,   ,   ,  ,   ,   ,  ,   ,   ,  ]
   >>>>>>
[   ,   ,    ,   ,    ,    ,   ,    ,    ,   ]
  >>>>>>
[ ,    ,    ,   ,  ,  ,  ,   ,   ,   ]
  >>>>>>
[  ,   ,   ,   ,   ,   ,     ,  ,   ,   ]
   >>>>>>
[  ,    ,    ,    ,   ,    ,    ,   ,    ,   ]