該實驗基準比較了在構建所謂的語言模型的簡化任務中表示單詞的不同方式。
語言模型是計算文本片段(單詞鏈)的概率的一種方法。 NLP先前廣泛使用各種選項來構建LM基於計數N-Gram和平滑(平滑),以補償大型拱門的N-gram的排放。例如,NLTK具有kneser-ney方法的實現。關於大量n-gramer信息的存儲和文本處理速度,例如https://github.com/kpu/kenlm,也有大量不同的實現的技術細節不同。
在過去的幾年中,神經語言模型(NLMS)的不同選擇已廣泛使用,這些使用使用了各種神經體系結構,包括復發和閃光。 NLM可以分為兩組:以單詞級別(文字吸引NLM)和字符(字符吸引的NLM)工作。第二種選擇尤其有趣,因為它允許模型與詞素合作。這對於具有豐富形態的語言非常重要。話雖如此,就像俄羅斯語言中的形容詞一樣,可能存在數百種語法形式。即使是一個非常大的文本案例,也不能保證所有單詞形式的變體都將包含在文字感知nlm的詞彙中。另一方面,形態學結構幾乎總是遵守規則規則,因此,對單詞的基礎或基本形式的了解可以使您產生其語法和語義選項:大膽,大膽,咬合,咬人,大膽等,並確定相同的根源單詞之間的語義聯繫,即使相應的單詞是針對第一次和統計數據的統計數據,並且在其上都不知道。對於NLP領域,最後一句話變得非常重要,首先,這是各種社交媒體。
在基準的框架內,所有必要的代碼都已準備好研究和比較這兩個NLM選項,以及其他構建LM-Characte-Characte-Aware和Word-Aware的方法。
我們將有所簡化我們的langage模型,以此形式設置任務。有一個預選長度的N-gram(請參閱數據集載體模塊中的NGram_Order常數)。如果從文本案例中獲得(在_get_corpus_path class basevectorizer中縫製了粘附的UTF-8文件的途徑),那麼我們相信這是單詞的有效組合,目標值y = 1。如果n-gram是通過隨機替換單詞的隨機替換,並且在一個cain中就不會在cain中隨機替換,則在cane中找到了目標值。
在對案件的分析期間以與有效的相同數量生成了不可接受的n-gram。事實證明,平衡的數據集有助於任務。而且缺乏對手動標記的需求,您可以輕鬆地使用諸如訓練數據集中的記錄數之類的參數“播放”。
因此,解決了二元分類問題。分類器將是在KERAS上實現的梯度增強XGBOOST和神經網絡的實現,以及不同編程語言和DL框架上的其他幾種選項。
研究的目的是表示輸入矩陣X中單詞對分類準確性的方法的影響。
對NLP的各種方法的詳細分析,包括針對類似任務,可以在文章中找到:關於自然語言處理的神經網絡模型的入門。
檢查以下選項以獲取XGBoost:
W2V-我們使用經過核心訓練的word2vec,將單詞的單詞粘在一個長向量中
W2V_TAGS- W2V表示的擴展,最終向量的其他類別是從單詞的形態標籤中獲得的。事實證明類似的語言模型
SDR-通過word2向量模型的分解獲得的稀疏分佈式表示單詞
Random_BitVector-每個單詞歸因於一個隨機二進制固定 - 長度向量,給定比例為0/1
BC-由於棕色聚類的工作而創建的矢量(請參閱https://en.wikipedia.org/wiki/wiki/bron_clustering和實現https://github.com/percyliang/brunki)
chars-每個單詞都被編碼為符號的1次表示鏈
HASHING_TRICK-使用的Hashing技巧來編碼有限數量的索引位(請參閱說明https://en.wikipedia.org/wiki/wiki/feature_hashing and inasimation and inasimation https://radimrearrek.com/gensim/gensim/gensim/corpora/corpora/hashdictionary.html)
AE-單詞的單詞是在自動編碼器的內層上激活的。在pymodels/wordautoencoders文件夾中,通過word_autoencoder3.py腳本執行自動編碼器和獲得詞向量的訓練。
神經網絡還提供了另外的兩種介紹方法,這些方法使用嵌入層轉換為特定矢量表示(或類似於所使用的使用庫。
Word_Indeces-編譯了一個詞彙,每個單詞都分配了一個唯一的整數索引。因此,3年級似乎是整數的三倍。
char_indeces-編譯了一個字母,每個符號都分配了一個唯一的整數索引。此外,符號索引的鏈被樣品索引補充到相同的長度(單詞的最大長度),並作為n-gram的表示返回所得的符號索引鏈。使用嵌入層(嵌入keras或類似),將符號轉換為密集的向量形式,其餘的神經網絡都可以使用。事實證明,角色感知神經語言模型的版本。
為了解決問題,使用了機器學習的各種庫,用於矩陣計算的神經網絡和庫,包括:
Keras(帶有Theano後端)
寬麵條(Theano)
Nolearn(Theano)
張量
Python解決方案:
pymodels/wr_xgboost.py-基於XGBOOST的解析器
pymodels/wr_catboost.py-使用單詞索引上的catboost解析器,具有指示數據集中分類特徵索引的能力,以便助推器在培訓期間獨立學習它們
pymodels/wr_keras.py-基於在keras上實施的基於飼料前向神經膜的解析器
pymodels/wr_keras_sdr2.py-一種單獨的解決方案,用於檢查大尺寸的稀疏分佈式表示形式(從1024),並在keras上使用分配的用於學習和驗證的矩陣。 pymodels/wr_lasagne.py-基於在烤寬麵條(Theano)上實施的基於飼料前向神經群的溶解器
pymodels/wr_nolearn.py-基於在諾爾恩+lasagne(theano)上實施的飼料前進神經膜的分辨率(Theano)
pymodels/wr_tensorflow.py-基於在TensorFlow上實現的FED forward Neurosettes的求解器
C#上的解決方案:
csharpmodels/withAccordnet/program.cs-基於feed forward reforts concount.net的解析器(C#,vs for vs 2015)
csharpmodels/mybaseline/program.cs-基於我的實施香草MLP(C#,vs 2015項目)
C ++的解決方案:
cxxmodels/tinydnn_model/tinydn_model.cpp -MLP分辨率,由Tiny -DNN庫實施(C ++,VS 2015項目)
cxxmodels/singa_model/alexnet.cc-基於Apache.singa實施的神經網絡的解析器(C ++,vs 2015項目)
CXXMODELS/OPERNN_MODEL/MAIN.CPP-基於神經組的解析器,由OpenNN實施(C ++,VS 2015項目)
Java Javamodels/with4j/src/main/java/wordrepresentationstest.java -MLP解析器,由Deep LeartLearning4J庫實施
內部類和工具:
pymodels/colpusreaders.py-從不同格式的文本建築物(zpipped | plain txt)pymodels/datasetVectorizers.py-數據集矢量矢量和工廠的類別讀取行的類
pymodels/store_dataset_file.py-數據集的生成及其為C#和C ++模型保存
對於神經網絡,根據Keras實施了2個建築師。 MLP是具有完整層的簡單飼料前饋。 Convnet是使用捆綁層的網格。
切換體系結構由net_arch在wr_keras.py文件中的net_arch參數中執行。
可以注意的是,毛力的選項通常給出了更準確的解決方案,但是相應的模型具有更大的變體,簡單地說 - 對於具有相同參數的多個模型,最終的準確性很大程度上跳躍。
實驗的體系結構和數值結果的詳細說明可以在此處找到:https://kelijah.livejournal.com/224925.html。
所有基準選項都使用UTF-8編碼中的文本文件接收n-gram列表。假定文本將文本分為單詞,並將其帶到下寄存器是通過第三方代碼提前進行的。因此,腳本讀取該文件的行,按空格將它們分解為單詞。
為了方便播放實驗,我在數據文件夾中放置了一個大案例,大小為1萬行。這足以重複所有測量。為了不用大型文件超載存儲庫,將其切碎。 basevectorizer._load_ngrams方法本身可以隨時解開其內容,因此您無需進行任何手動操作。
在W2V_TAGS的矢量化變體中,形態特徵添加到W2V靜脈中。每個單詞的這些符號均取自Data subcatal中的word2tags_bin.zip文件,這是通過我的語法詞典(http://solarix.ru/sql-dictionary-sdk.shtml)獲得的。轉換的結果被吸引到165 MB,這對於GIT存儲庫來說太多了。因此,我喊了語法字典的結果文件,並且在操作過程中,數據集本身的相應矢量化類別將其拆開。
請注意,由於語法形式的同義詞,許多單詞具有多組標籤。例如,“熊”一詞可以分別是單一或複數形式的形式,在屬格或名義的情況下。在形成單詞的標籤時,我將同音標籤組合在一起。
使用兩個階段的過程。首先,我們得到w2v詞的文字載體。 Python上的一個小腳本以CSV格式將向量卸載到文本文件中。
然後,使用實用程序https://github.com/mfaruqui/sparse-coding,執行命令:
./nonneg.o input_vectors.txt 16 0.2 1e-5 4 out_vecs.txt
out_vecs.txt文件包含帶有指示參數的sdr單詞的文件:size = 16*vector W2V,填充= 0.2此文件加載了sdr_vectorizer類。
https://habrahabr.ru/post/335838/
http://kelijah.livejournal.com/217608.html
作為檢查,我們使用訓練集中的N-Gram的記憶以及對測試集的記憶N-gram之間的搜索。訓練集的小尺寸導致這樣一個事實,即在測試集中,模型僅作為隨機猜測,精度為0.50。
結果的主表可在鏈接上可用。對於一組1.000,000 3克,獲得了以下結果。
對於基於XGBoost(WR_XGBOOST.PY)的解析器,獲得了以下結果。
對於包含1.000,000個Trigram的數據集:W2V_TAGS(Word2Vector + Morph標籤)==> 0.81
W2V(Word2Vector dim = 32)==> 0.80
sdr(稀疏分佈式代表,長度512,20%單位)==> 0.78 bc(棕色聚類)==> 0.70
char(char單速編碼)==> 0.71
Random_BitVector(隨機位向量,單位共享16%)==> 0.696
Hashing_trick(帶有32,000個插槽的哈希技巧)==> 0.64
對於基於寬麵條MLP的求解器:
精度= 0.71
用於基於NoLearn+Lasagne MLP的求解器:
精度= 0.64
用於基於微小DNN MLP的解析器:
精度= 0.58
對於基於Accord.net feed向前神經網的求解器:
Word2Vector ==> 0.68
對於“單詞索引”的分類特徵的catboost分辨率:
精度= 0.50
對於基於apache.singa mlp的求解器:
精度= 0.74
基線解決方案 - 訓練數據集中的n-格
精度= 0.50