该实验基准比较了在构建所谓的语言模型的简化任务中表示单词的不同方式。
语言模型是计算文本片段(单词链)的概率的一种方法。 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