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

DL4J中文文件/語言處理/Word2Vec

Word2Vec, Doc2vec & GloVe: 用於自然語言處理的神經詞嵌入

內容

  • 介紹
  • 神經詞嵌入
  • 有趣的Word2Vec結果   
  • 給我程式碼
  • Word2Vec 剖析
  • 安裝,載入與訓練
  • 程式碼示例
  • 問題排查與Word2Vec除錯
  • Word2Vec用例
  • 外語
  • GloVe(全域性向量)與Doc2Vec

Word2Vec介紹

Word2Vec是一個處理文字的兩層神經網路。它的輸入是一個文字語料庫,它的輸出是一組向量:語料庫中的單詞的特徵向量。Word2Vec不是一個深度神經網路

,它將文字轉換成一個深度網路可以理解的數值形式。DL4J實現了一個分散式的Word2Vec,用於Java和Scala,它在Spark的GPU上工作。

Word2Vec的應用擴充套件了自然界的句子解析。它也可以同樣地應用於基因、程式碼、喜歡、播放列表、社交媒體圖表和其他可以識別模式的語言或符號系列。

為什麼?因為單詞只是像上面提到的其他資料一樣的離散狀態,我們只是在尋找這些狀態之間的轉移概率:它們將同時發生的可能性。所以gene2vec,like2vec和follower2vec 都是可能的。記住這一點,下面的教程將幫助你理解如何為任意一組離散和共現狀態建立神經嵌入。

Word2Vec的目的和實用性是將相似詞的向量分組到向量空間中。也就是說,它在數學上檢測相似性。Word2Vec建立向量,這些向量是單詞特徵(例如單個單詞的上下文)的分散式數字表示。這樣做沒有人為干預。

給定足夠的資料、用法和上下文,Word2Vec可以基於過去的出現對單詞的意義做出高度準確的猜測。這些猜測可以用來建立一個單詞與其他單詞的關聯(例如,“男人”是“男孩”,“女人”是“女孩”),或者是聚類文件,並按主題分類。這些聚類可以構成搜尋的基礎、情感分析和在科學研究、法律發現、電子商務和客戶關係管理等多個領域的建議。

Word2Vec神經網路的輸出是一個詞彙表,其中每個專案都有一個附加到它的向量,它可以被送入深度學習網路或簡單地查詢以檢測詞之間的關係。

測量餘弦相似度,90度角表示沒有相似度,而總的相似度是1是0度角,完全重疊;即Sweden等於Sweden,而Norway到Sweden的餘弦距離是0.760124,是任何其他國家中最高的。

這是一個使用Word2Vec生成的與“Sweden”相關的單詞列表,按接近順序排序:

Cosine Distance

斯堪的納維亞的國家和幾個富裕的北歐、日耳曼國家躋身前九位。

神經詞嵌入

我們用來表示單詞的向量稱為神經詞嵌入,表示是奇怪的。一件事描述了另一件事,儘管這兩件事是根本不同的。正如Elvis Costello所說:“寫作對於音樂就像跳舞對於建築。”Word2Vec對單詞“向量化”,通過這樣做,它使得自然語言可以被計算機閱讀——我們可以開始對單詞執行強大的數學運算以檢測它們的相似性。

因此,神經詞嵌入用數字代表一個單詞。這是一個簡單但不太可能的翻譯。

Word2Vec類似於一個自動編碼器,將每個單詞編碼在一個向量中,而不是通過重建對輸入單詞進行訓練,Word2Vec在語料庫中將單詞和與它們相鄰的其他單詞進行訓練。

它以兩種方式中的其中一種來實現,或者使用上下文來預測目標單詞(一種稱為連續詞袋或CBOW的方法),或者使用單詞來預測目標上下文,即skip-gram。我們使用後一種方法,因為它對大資料集產生更精確的結果。

word2vec diagram

當分配給單詞的特徵向量不能用於精確預測該單詞的上下文時,向量的組成部分會被調整。語料庫中的每個單詞的上下文是老師,往回傳送錯誤訊號以調整特徵向量。通過調整在向量中數值湊在一起的上下文,單詞的向量被它們判斷為相似的。

正如梵高的向日葵畫是油畫布上的二維混合物,代表了1880年代末巴黎三維空間中的植物物質,所以以向量排列的500個數字可以代表一個詞或一組詞。

這些數字將每個單詞定位為500維向量空間中的一個點。超過三個維度的空間難以視覺化。(Geoff Hinton教授人們想象13維空間,建議學生首先想象3維空間,然後對自己說:“13、13、13”:)

一組訓練有素的單詞向量將在那個空間中放置相似的單詞。“橡樹”、“榆樹”和“樺樹”可能會聚集在一個角落,而戰爭、衝突和爭鬥則聚集在另一個角落。

類似的事情和想法被證明是“接近的”。它們的相對意義已經轉化為可測量的距離。質量變成數量,演算法可以完成他們的工作。但相似性只是Word2Vec可以學習的許多關聯的基礎。例如,它可以衡量一種語言的單詞之間的關係,並將它們對映到另一種語言。

word2vec translation

這些向量是更全面的詞彙幾何的基礎。如圖所示,像羅馬、巴黎、柏林和北京這樣的首都城市相互靠近,在向量空間上它們各自具有與其國家相似的距離,即羅馬-義大利=北京-中國。如果你只知道羅馬是義大利的首都,並想知道中國的首都,那麼等式羅馬-義大利+中國將返回北京。這不是玩笑。

capitals output

有趣的Word2Vec結果

讓我們看看Word2Vec可以產生的其他關聯。

我們將用邏輯類比的符號代替加減等號,給出結果,其中:是 “對於”的意思和::“等同”的意思,例如“羅馬對義大利就像北京對中國一樣”=羅馬:義大利::北京:中國。在最後一點,當給出前三個元素時,我們將給出Word2vec模型建議的單詞列表,而不是提供“答案”:

king:queen::man:[woman, Attempted abduction, teenager, girl] 
//很怪異,但你可以看到

China:Taiwan::Russia:[Ukraine, Moscow, Moldova, Armenia]
//兩個大國和他們小的遠離的鄰居

house:roof::castle:[dome, bell_tower, spire, crenellations, turrets]

knee:leg::elbow:[forearm, arm, ulna_bone]

New York Times:Sulzberger::Fox:[Murdoch, Chernin, Bancroft, Ailes]
//Sulzberger-Ochs家族擁有並經營NYT。
//Murdoch 家族擁有新聞公司,此家族有福克斯新聞。 
//Peter Chernin是新聞公司的13年的營運長。
//Roger Ailes是福克斯新聞的主席。 
//Bancroft家族把《華爾街日報》賣給了新聞集團。

love:indifference::fear:[apathy, callousness, timidity, helplessness, inaction]
//這首詩的詩集簡直令人驚歎。

Donald Trump:Republican::Barack Obama:[Democratic, GOP, Democrats, McCain]
//有趣的是,正如奧巴馬和麥凱恩是對手一樣
//同樣,Word2Vec認為特朗普與共和黨的觀點有對立。

monkey:human::dinosaur:[fossil, fossilized, Ice_Age_mammals, fossilization]
//人類是化石猴子?人類就是剩下的
//猴子?人類是打敗猴子的物種。
//就像冰河時代哺乳動物打敗恐龍一樣?貌似有理的。

building:architect::software:[programmer, SecurityCenter, WinPcap]

這個模型是在谷歌新聞vocab上進行訓練的,你可以匯入並玩一玩。考慮片刻,Word2Vec演算法從來沒有被教過一條英語語法規則。它對世界一無所知,與任何基於規則的符號邏輯或知識圖無關。然而,比在多年的人力學習後大的大多數知識圖的學習,它以更靈活和自動化的方式學習。它把Google新聞的文件看作一張白板,訓練結束後,它可以計算對人類有意義的複雜類推。

你還可以查詢Word2Vec模型進行其他關聯。並不是每件事都必須有兩個相互映象的類推。(我們解釋如下……)

  • 地緣政治學:伊拉克-暴力=約旦
  • 區分:人類-動物=倫理
  • 總統-權力=總理
  • 圖書館-圖書=大廳
  • 類推:股票市場≈溫度計

通過構建一個單詞與其他類似單詞的鄰近場景,這些單詞不一定包含相同的字母,我們已經從硬標記,進入了更平滑和更普遍的意義的場景 。

給我程式碼

DL4J中Word2Vec的剖析

這些是DL4J自然語言處理的元件:

  • SentenceIterator/DocumentIterator: 用於迭代一個數據集。 SentenceIterator 返回一個字串 , DocumentIterator 與輸入流一起工作。
  • Tokenizer/TokenizerFactory: 用於對文字進行分詞。 在NLP術語中,句子被表示為一系列詞。TokenizerFactory為一個句子建立一個分詞器的例項。
  • VocabCache: 用於跟蹤元資料,包括單詞計數、文件出現、詞集(本例中不是vocab,而是已經發生的令牌詞)、vocab(詞袋和單詞向量查詢表中包括的特性) 
  • Inverted Index: 儲存有關單詞發生的元資料。可以用於理解資料集。自動建立具有Lucene實現(1)的Lucene索引。

Word2vec是指一系列相關演算法,該實現採用負取樣

Word2Vec 設定

使用Maven在IntelliJ中建立一個新專案。如果你不知道怎麼做,請看我們的快速入門頁面。然後在專案的根目錄的POM.xml檔案中指定這些屬性和依賴項(你可以檢查Maven以獲得最新版本,請使用這些版本…)。

載入資料

現在在Java中建立並命名一個新類。之後,你將在.txt檔案中獲取原始語句,用迭代器遍歷它們,並使它們接受某種預處理,例如將所有單詞轉換為小寫。

        String filePath = new ClassPathResource("raw_sentences.txt").getFile().getAbsolutePath();

        log.info("載入並向量化句子....");
        //每一行之間用空格分割
        SentenceIterator iter = new BasicLineIterator(filePath);

如果你想載入一個文字檔案,用我們的例子中提供的句子之外的句子,你這樣做:

        log.info("Load data....");
        SentenceIterator iter = new LineSentenceIterator(new File("/Users/cvn/Desktop/file.txt"));
        iter.setPreProcessor(new SentencePreProcessor() {
            @Override
            public String preProcess(String sentence) {
                return sentence.toLowerCase();
            }
        });

也就是說,去掉ClassPathResource,並將你的.txt檔案的絕對路徑填入到LineSentenceIterator中。

SentenceIterator iter = new LineSentenceIterator(new File("/your/absolute/file/path/here.txt"));

在bash中,通過在命令列中從同一目錄中鍵入pwd,可以找到任何目錄的絕對檔案路徑。對於該路徑,你將新增檔名。

資料分詞

Word2Vec需要用詞而不是完整的句子,所以下一步就是把資料分詞。把文字分詞是把它分解成原子單位,例如,每次你點選一個空白處時,建立一個新的分詞。

        //在每行用用空格分割以得到單詞
        TokenizerFactory t = new DefaultTokenizerFactory();
        t.setTokenPreProcessor(new CommonPreprocessor());

那樣它會給你每行一個詞。

訓練模型

現在資料已準備就緒,你可以配置Word2Vec神經網路並輸入分詞。

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

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

此配置接受許多超引數。 一些需要一些解釋:

  • batchSize 是你一次處理的單詞數量。
  • minWordFrequency 是單詞必須出現在語料庫中的最小次數。 在這裡,如果它出現少於5次,則不會學習。 單詞必須出現在多個上下文中才能學習有關它們的有用特徵。 在非常大的語料庫中,提高最小值是合理的。
  • useAdaGrad - Adagrad為每個特徵建立不同的梯度。 在這裡,我們並不關心這一點。
  • layerSize 指定單詞向量中的特徵數。這等於特徵空間中的維數。由500個特徵表示的詞成為500維空間中的點。
  • learningRate 是每個更新系數的步長,因為單詞在特徵空間中被重新定位。
  • minLearningRate 是學習率的底板。學習速率隨著你訓練的單詞數量的減少而衰減。如果學習率下降太多,網路的學習就不再有效了。這保持係數移動。
  • iterate 告訴網路它正在訓練的資料集的批次。
  • tokenizer 從當前批次中為它提供單詞。
  • vec.fit() 告訴配置的網路開始訓練。

這裡是訓練你以前訓練過的單詞向量的示例。

使用Word2Vec評估模型

下一步是評估特徵向量的質量。

        // 寫入詞向量
        WordVectorSerializer.writeWordVectors(vec, "pathToWriteto.txt");

        log.info("最接近的10個詞:");
        Collection<String> lst = vec.wordsNearest("day", 10);
        System.out.println(lst);
        UiServer server = UiServer.getInstance();
        System.out.println("啟動埠:" + server.getPort());
        
        //輸出: [night, week, year, game, season, during, office, until, -]

vec.similarity("word1","word2")這行將返回輸入的兩個詞的餘弦相似度。越接近1,網路就理解為越類似於那些詞(參見上面的瑞典-挪威例子)。例如:

        double cosSim = vec.similarity("day", "night");
        System.out.println(cosSim);
        //輸出: 0.7704452276229858

使用vec.wordsNearest("word1", numWordsNearest),列印到螢幕上的單詞允許你檢視網路是否聚集了語義上相似的單詞。你可以用wordsNearest方法的第二個引數來設定你想要的最近單詞的數量。例如:

        Collection<String> lst3 = vec.wordsNearest("man", 10);
        System.out.println(lst3);
        //輸出: [director, company, program, former, university, family, group, such, general]

模型視覺化

我們依賴於TSNE來把單詞特徵向量和專案詞的維數減少到兩個或三維空間。TSNE的完整的DL4J/ND4J例子在這裡

        Nd4j.setDataType(DataBuffer.Type.DOUBLE);
        List<String> cacheList = new ArrayList<>(); //cacheList 是一種動態字串陣列,用於儲存所有單詞。

        //步驟2:將文字輸入轉換成單詞列表
        log.info("載入並向量化資料....");
        File wordFile = new ClassPathResource("words.txt").getFile();   //開啟檔案
        //獲取所有唯一詞向量的資料
        Pair<InMemoryLookupTable,VocabCache> vectors = WordVectorSerializer.loadTxt(wordFile);
        VocabCache cache = vectors.getSecond();
        INDArray weights = vectors.getFirst().getSyn0();    //將獨特詞的權重分成自己的列表

        for(int i = 0; i < cache.numWords(); i++)   //把字串分隔成自己的列表
            cacheList.add(cache.wordAtIndex(i));

        //步驟3:構建雙樹TSNE以供以後使用
        log.info("Build model....");
        BarnesHutTsne tsne = new BarnesHutTsne.Builder()
                .setMaxIter(iterations).theta(0.5)
                .normalize(false)
                .learningRate(500)
                .useAdaGrad(false)
//                .usePca(false)
                .build();

        //步驟4:建立TSNE值並將其儲存到檔案中
        log.info("儲存TSNE座標用於繪製....");
        String outputFile = "target/archive-tmp/tsne-standard-coords.csv";
        (new File(outputFile)).getParentFile().mkdirs();

        tsne.fit(weights);
        tsne.saveAsFile(cacheList, outputFile);

儲存,重新載入並使用模型

你會想儲存這個模型。在DL4J中儲存模型的常規方法是通過序列化工具(Java序列化類似於Python的pickling,將一個物件轉換成一系列位元組)。

        log.info("儲存向量....");
        WordVectorSerializer.writeWord2VecModel(vec, "pathToSaveModel.txt");

這將將向量儲存到一個名為pathToSaveModel.txt的檔案中,該檔案將出現在Word2Vec被訓練的目錄的根目錄中。檔案中的輸出每行應該有一個單詞,後面是一系列數字,它們一起表示它的向量。

為了繼續使用向量,簡單地像這樣呼叫關於vec的方法:

Collection<String> kingList = vec.wordsNearest(Arrays.asList("king", "woman"), Arrays.asList("queen"), 10);

Word2Vec的詞算術的經典例子是 國王-皇后=男人-女人,它的邏輯擴充套件是 國王-皇后+女人=男人。

上面的例子將把10個最近的單詞輸出到向量  國王-皇后+女人 ,這應該包括“男人”。wordsNearest的第一個引數必須包括“正”單詞國王 和女人,它們具有與之關聯的+符號;第二個引數包括“負”單詞皇后,它與負符號關聯(這裡正和負沒有情感內涵);第三是你想看的最接近單詞列表的長度。請記住將此新增到檔案的頂部:import java.util.Arrays;

任何數量的組合都是可能的,但只有在語料庫中出現足夠頻繁的查詢詞時,它們才會返回合理的結果。顯然,返回相似詞(或文件)的能力是搜尋引擎和推薦引擎的基礎。

你可以像這樣把向量重新載入到記憶體中:

        Word2Vec word2Vec = WordVectorSerializer.readWord2VecModel("pathToSaveModel.txt");

然後,您可以使用Word2Vec作為查詢表:

        WeightLookupTable weightLookupTable = word2Vec.lookupTable();
        Iterator<INDArray> vectors = weightLookupTable.vectors();
        INDArray wordVectorMatrix = word2Vec.getWordVectorMatrix("myword");
        double[] wordVector = word2Vec.getWordVector("myword");

如果單詞不在詞彙表中,Word2Vec返回零。

匯入Word2Vec模型

在S3託管的谷歌新聞語料庫模型,我們用來測試我們的訓練網的準確性。對於那些在大型語料庫上培訓當前硬體需要很長時間的使用者,可以簡單地下載它來探索Word2Vec模型,而不需要前奏。

如果你用C vectors或Gensimm進行訓練,此行將匯入模型。

    File gModel = new File("/Developer/Vector Models/GoogleNews-vectors-negative300.bin.gz");
    Word2Vec vec = WordVectorSerializer.readWord2VecModel(gModel);

記得新增 import java.io.File;到你引入的包。

對於大型模型,你可能會遇到堆空間的問題。Google模型可能需要多達10G的RAM,而JVM只使用256MB的RAM啟動,因此必須調整堆空間。你可以用一個bash_profile檔案(參見我們的故障排查部分),或者通過IntelliJ本身來做:

    //Click:
    IntelliJ Preferences > Compiler > Command Line Options 
    //Then paste:
    -Xms1024m
    -Xmx10g
    -XX:MaxPermSize=2g

N-grams & Skip-grams

單詞被一次讀入到向量,並在一定範圍內來回掃描。這些範圍是n-gram,一個 n-gram是給定語言序列中n個專案的連續序列;它是unigram、bigram、trigram、4-gram或5-gram的第n個版本。skip-gram簡單地從N-gram中刪除專案。

Mikolov推廣並在DL4J實現中使用的skip-gram被證明比其他模型(如連續詞袋)更精確,這是因為生成的上下文更具有通用性。

然後將該n-gram輸入到神經網路以學習給定詞向量的重要性;即,重要性被定義為其實用性,作為作為某些更大含義或標籤的指示器。

工作例項

請注意:下面的程式碼可能過時了。有關更新的示例,請參閱Github上的我們的DL4J示例庫

既然你已經有了一個關於如何建立Word2Vec的基本思想,這裡有一個例子,它是如何與DL4J的API一起使用的:

在按照快速入門的說明後,你可以在IntelliJ中開啟這個示例並點選Run執行它。如果你在Word2Vec模型中查詢一個不包含在訓練語料庫的單詞,它將返回NULL。

 

Word2Vec故障排除與調整

問:我有很多這樣的堆疊跟蹤

       java.lang.StackOverflowError: null
       at java.lang.ref.Reference.<init>(Reference.java:254) ~[na:1.8.0_11]
       at java.lang.ref.WeakReference.<init>(WeakReference.java:69) ~[na:1.8.0_11]
       at java.io.ObjectStreamClass$WeakClassKey.<init>(ObjectStreamClass.java:2306) [na:1.8.0_11]
       at java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:322) ~[na:1.8.0_11]
       at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1134) ~[na:1.8.0_11]
       at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548) ~[na:1.8.0_11]

答:看看你啟動Word2Vec應用程式的目錄裡面。例如,這可以是一個IntelliJ專案主目錄或在命令列鍵入Java的目錄。它應該有一些目錄看起來像:

       ehcache_auto_created2810726831714447871diskstore  
       ehcache_auto_created4727787669919058795diskstore
       ehcache_auto_created3883187579728988119diskstore  
       ehcache_auto_created9101229611634051478diskstore

你可以關閉你的Word2Vec應用程式並嘗試刪除這些目錄。

問:不是所有來自我原始文字資料的單詞都出現在我的Word2Vec物件中…

答:   試著在你的Word2Vec物件上通過.layerSize() 來提高圖層大小,像這樣

        Word2Vec vec = new Word2Vec.Builder().layerSize(300).windowSize(5)
                .layerSize(300).iterate(iter).tokenizerFactory(t).build();

問:如何載入我的資料?為什麼培訓會永遠持續下去?

答:如果你所有的句子都被作為一個句子被載入,Word2Vec訓練可能需要很長的時間。這是因為Word2Vec是一個句子級別的演算法,所以句子邊界非常重要,因為共現統計是逐句收集的。(對於GloVe來說,句子邊界並不重要,因為它關注於語料庫範圍的共現。對於許多語料庫,平均句子長度為六個單詞。這意味著在視窗大小為5的情況下,有30個(隨機數)回合的skip-gram計算。如果你忘記指定句子的邊界,你可能載入一個“10000個單詞”長的句子。在這種情況下,Word2Vec將為整個10000個單詞“句子”嘗試全skip-gram迴圈。在DL4J的實現中,假定一行是一個句子。你需要插入你自己的句子迭代器和分詞器。通過要求你指定你的句子如何結束,DL4J仍然是語言不可知論者。UimaSentenceIterator是這樣做的一種方式。使用OpenNLP進行句子邊界檢測。

 

問:為什麼把整個文件作為一個“句子”而不是分割成句子時,在效能上有如此不同?

答:如果平均句子包含6個單詞,視窗大小為5,那麼理論上最多10個skipgram回合的次數是0字。句子不夠長,不能用文字表達完整的視窗。在這句話中所有單詞的粗略最大數目為5個skipgram回合。但如果你的“句子”有1000k個單詞的長度,這個句子中的每個單詞就有10個skipgram回合,不包括前5個和最後5個。因此,你將不得不花費大量時間來構建模型+由於缺少句子邊界,協同統計將會發生變化。

 

問:Word2Vec是如何使用記憶體的?

答:Word2Vec中的主要記憶體消耗是權重矩陣。數學是簡單的:單詞數x維度數x 2 x資料型別 記憶體佔用。因此,如果使用浮點數和100維來構建100k字的Word2Vec模型,那麼記憶體佔用將是100kx100x2x4(浮點數大小)=80MB RAM,僅用於矩陣+用於字串、變數、執行緒等的一些空間。如果載入預構建的模型,則在構建時間中使用大約1/2的RAM,因此它是40MB RAM。目前使用的最流行的模型是谷歌新聞模型。有3百萬字,向量大小為300。這就使我們需要3.6G RAM僅載入模型。而且必須新增3M的字串,這些字串在Java中沒有固定的大小。所以,通常是大約4-6GB用於載入模型,這取決於JVM版本/供應商,GC狀態和月球的相位。

問:我做了你說的每一件事,結果還是不對頭。

答:確保你正遇到不是正常性問題。一些任務,如wordsNearest(),預設使用標準化的權重,而其他的則需要非標準化的權重。注意這個區別。

用例

谷歌學者儲存了論文記錄,這裡引用了Word2Vec的DL4J實現

來自比利時的資料科學家Kenny Helsens將Word2Vec的DL4J實現應用於NCBI的線上孟德爾人類繼承(OMIM)資料庫。然後,他尋找與alk(一種已知的非小細胞肺癌的致癌基因)最相似的單詞,Word2vec返回:“nonsmall, carcinomas, carcinoma, mapdkd”。從那裡,他建立了其他癌症表型和基因型之間的類比。這只是Word2Vec在大型語料庫上可以學習的一個例子。發現重要疾病新方面的潛力才剛剛開始,在醫學之外,機會也同樣多樣。

Andreas Klintberg在瑞典訓練了Word2Vec的DL4J實現,並在媒體上寫下了一個完整的指導

Word2Vec在資訊檢索準備基於文字的資料和問答系統中特別有用,DL4J通過深度自動編碼器來實現這些系統。

營銷人員可能尋求建立產品間的關係來建立推薦引擎。調查者可能會分析一個社會圖表,以顯示單個群體的成員,或者他們可能必須定位或資助的其他關係。

Google的 Word2vec 專利

Word2Vec是由Tomas Mikolov領導的谷歌研究團隊介紹的一種計算單詞向量表示的方法。谷歌託管了一個開源版本的Word2Vec,它是在Apache 2許可下發布的。在2014,Mikolov離開谷歌去了Facebook,並在2015年5月,谷歌被授予獲得此專利,已釋出的版本沒有廢除Apache許可證。

外語

雖然所有語言中的單詞都可以用Word2Vec轉換為向量,並且這些向量通過DL4J學習,但是NLP預處理可以非常特定於語言,並且需要超出我們庫的工具。斯坦福自然語言處理小組有許多基於Java的工具,用於語言的分詞、詞性標註和命名實體識別,例如普通話、阿拉伯語、法語、德語和西班牙語。對於日本人來說,像Kuromoji之類的NLP工具是有用的。其他的外語資源,包括文字語料庫,都在這裡

GloVe: 全域性向量

載入和儲存GloVe模型到Word2Vec可以這樣做:

        WordVectors wordVectors = WordVectorSerializer.loadTxtVectors(new File("glove.6B.50d.txt"));

序列向量

DL4J具有一個名為SequenceVectors的類,它是單詞向量之上的抽象級別,並且允許你從任何序列中提取特徵,包括社交媒體概要、事務、蛋白質等。  如果資料可以被描述為序列,它可以通過skip-gram和層次化的softmax與AbstractVectors類來學習。這與深度演算法相相容,也在DL4J中實現。

DL4L的Word2Vec特徵

  • 模型序列化/反序列化 被新增後的權重會更新。也就是說,你可以通過呼叫loadFullModel、向其中新增TokenizerFactory和SentenceIterator、以及呼叫還原的模型上的fit()來使用200GB的新文字更新模型狀態。
  • 用於詞彙構建的多個數據源的選項被新增。
  • 訓練和迭代可以單獨指定,儘管它們通常都是“1”。
  • Word2Vec.Builder 有這個選項: hugeModelExpected. 如果設為 true, 在構建過程中,詞彙將被週期性的截斷。
  •  minWordFrequency 有助於忽略語料庫中的稀有詞,可以排除任何數量的詞來定製。
  • 兩個新的WordVectorsSerialiaztion 方法已被介紹: writeFullModel 和  loadFullModel. 這些儲存和載入一個完整的模型狀態。
  • 一個體面的工作站應該能夠處理一個有幾百萬單詞的詞彙量。DL4J的Word2Vec實現可以在一臺機器上對兆兆位元組的資料進行建模。大致來說,計算公式 是:vectorSize * 4 * 3 * vocab.size()。

Doc2vec & 其它 NLP 資源

文學中的Word2Vec

It's like numbers are language, like all the letters in the language are turned into numbers, and so it's something that everyone understands the same way. You lose the sounds of the letters and whether they click or pop or touch the palate, or go ooh or aah, and anything that can be misread or con you with its music or the pictures it puts in your mind, all of that is gone, along with the accent, and you have a new understanding entirely, a language of numbers, and everything becomes as clear to everyone as the writing on the wall. So as I say there comes a certain time for the reading of the numbers.
    -- E.L. Doctorow, Billy Bathgate