1. 程式人生 > >DL4J中文文件/語言處理/概述

DL4J中文文件/語言處理/概述

DL4J的自然語言處理功能

儘管沒有設計成可以與諸如Stanford CoreNLP或NLTK之類的工具相提並論,但DL4J確實包括本文描述的一些核心文字處理工具。

DL4J的NLP依賴 ClearTK,一個開源的機器學習和Apache非結構化資訊管理架構的自然語言處理框架,或UIMA。UIMA的使我們能夠執行的語言識別,特定語言的分割,句子邊界檢測和實體檢測(專有名詞:個人、企業、地方和事物)。

SentenceIterator 句子迭代器

處理自然語言有幾個步驟。第一個是遍歷你的語料庫建立一個檔案列表,它可以和個推文這麼短,或和一篇報紙的文章這麼長。這是由一個句子迭代器來執行的,它將是這樣的:

        // 在行的空白處分割來得到單詞
        TokenizerFactory t = new DefaultTokenizerFactory();

        /*
            CommonPreprocessor 將以下正則表示式應用於每個詞: [\d\.:,"'\(\)\[\]|/?!;]+
            所以,有效地刪除所有的數字,標點符號和一些特殊符號
            另外它強制把所有詞轉小寫。
         */

這個Gist 是由 gist-it.view rawdl4j-examples/src/main/java/org/deeplearning4j/examples/nlp/word2vec/Word2VecRawTextExample.java 給你提供的

SentenceIterator封裝一個語料庫或文字,組織它,比如說,每行一條推文。它負責將文字逐條輸入到你的自然語言處理器中。SentenceIterator與類似命名的類不同,如DatasetIterator建立用於訓練神經網路的資料集。相反,它通過分割語料庫來建立字串集合。

分詞器

分詞器進一步分割文字為單個詞,或是作為n-grams。ClearTK包括了底層的分詞器,例如詞性和解析樹,允許依賴和選區解析,就像遞迴神經張量網路(RNTN)所使用的一樣。

分詞器由TokenizerFactory 建立和包裝。預設的詞元是被空格分割的單詞。分詞程序還引入了一些機器學習來區分模稜兩可的符號。哪些句子和縮寫詞如Mr. 和 vs。

Tokenizers(分詞器)和SentenceIterator(句子迭代器)都與Preprocessors(前處理器)一起處理像Unicode這樣的混亂文字中的異常,並統一地呈現這些文字,比如小寫字元。

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

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

這個Gist 是由 gist-it.view rawdl4j-examples/src/main/java/org/deeplearning4j/examples/nlp/word2vec/Word2VecRawTextExample.java 給你提供的

Vocab詞彙

每一個文件都必須分割為詞彙,用於文件或語料庫的單詞集合。這些單詞存在詞彙快取中,它包含關於文件中計數的單詞子集的統計資訊。區分重要和不重要單詞的線條是移動的,但是區分兩組的基本思想是單詞只出現一次(或少於五次)是很難學習的,並且它們的存在代表了無用的噪音。

詞彙快取了例如Word2vec和詞袋方法的元資料,以極端不同的方式對待單詞。Word2vec以數百個係數長的向量形式建立單詞或神經單詞嵌入的表示。這些係數幫助神經網路預測一個詞在任何給定上下文中出現的可能性;例如,在另一個單詞之後。這裡是Word2vec,配置如下:

package org.deeplearning4j.examples.nlp.word2vec;

import org.datavec.api.util.ClassPathResource;
import org.deeplearning4j.models.word2vec.Word2Vec;
import org.deeplearning4j.text.sentenceiterator.BasicLineIterator;
import org.deeplearning4j.text.sentenceiterator.SentenceIterator;
import org.deeplearning4j.text.tokenization.tokenizer.preprocessor.CommonPreprocessor;
import org.deeplearning4j.text.tokenization.tokenizerfactory.DefaultTokenizerFactory;
import org.deeplearning4j.text.tokenization.tokenizerfactory.TokenizerFactory;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;

/**
 * Created by agibsonccc on 10/9/14.
 *
 * 將文字處理成詞向量的神經網路,檢視下面的URL獲取深入解釋。
 * https://deeplearning4j.org/word2vec.html
 */
public class Word2VecRawTextExample {

    private static Logger log = LoggerFactory.getLogger(Word2VecRawTextExample.class);

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

        // 得到文字檔案的路徑
        String filePath = new ClassPathResource("raw_sentences.txt").getFile().getAbsolutePath();

        log.info("Load & Vectorize Sentences....");
        // 每行前後空白間隔
        SentenceIterator iter = new BasicLineIterator(filePath);
        // 每行用空格分割以獲取單詞
        TokenizerFactory t = new DefaultTokenizerFactory();

        /*
            CommonPreprocessor 將應用如下正則表示式到每個詞: [\d\.:,"'\(\)\[\]|/?!;]+
            所以有效的刪除所有數字,標點符號,和特符號,並把所有詞轉換為小寫。
         */
        t.setTokenPreProcessor(new CommonPreprocessor());

        log.info("構建模型....");
        Word2Vec vec = new Word2Vec.Builder()
                .minWordFrequency(5)
                .iterations(1)
                .layerSize(100)
                .seed(42)
                .windowSize(5)
                .iterate(iter)
                .tokenizerFactory(t)
                .build();

        log.info("擬合 Word2Vec 模型....");
        vec.fit();

        log.info("將詞向量寫入文字檔案....");

        // 打印出最接近“day”的10個詞。一個如何處理這些單詞向量的例子。
        log.info("最接近的詞:");
        Collection<String> lst = vec.wordsNearestSum("day", 10);
        log.info("10 個最接近 'day': {}", lst);

        // TODO 解決丟失的 UiServer
//        UiServer server = UiServer.getInstance();
//        System.out.println("Started on port " + server.getPort());
    }
}

這個 Gist 由 gist-it.view rawdl4j-examples/src/main/java/org/deeplearning4j/examples/nlp/word2vec/Word2VecRawTextExample.java 提供

一旦你獲得單詞向量,你就可以把它們輸入深度網路進行分類、預測、情感分析等。