word2vec, LSTM Speech Recognition实战, 图数据库

word2vec

word2vec是Google于2013年开源推出的一个用于获取word vector的工具包。作者是Tomas Mikolov。

Github:

https://github.com/tmikolov/word2vec

注:Tomas Mikolov,捷克布尔诺科技大学博士。先后在Google、Facebook担任研究员。

word2vec包中还有一个word2phrase的程序,这个程序可以根据统计信息由单词生成短语。考虑到中文的字和词之间的关系,实际上也可以用它来进行无先验数据的分词。

注:NLP中的先验数据,最出名的当属分词词典。除此之外,还包括HMM的转移矩阵表等。

其一般方法为:

1.对原始语料按字切分,以空格分隔,相当于认为一个字就是一个词,即单字成词

2.使用word2phrase组字成词

time ./word2phrase -train 1.txt -output 2.txt -threshold 100 -debug 2

3.由于word2phrase最多只考虑到2-gram。因此,对于超过3个字以上的词语,需要迭代执行word2phrase。

我以金庸的小说为语料进行测试。从结果来看,这种方法对于人名、地名、武功招式名等专有名词,分词效果较好。但对于具有语法结构的句子,分词效果较差。比如“那人”其实是两个单字词,但却被word2phrase认为是一个双字词。

./word2vec -train resultbig.txt -output vectors.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -threads 12 -binary 1

./distance vectors.bin

训练之后的结果文件中,保存着每个词的向量。可将binary选项设为0,来查看相应结果的明文。

明文和二进制数据之间的转换可使用gensim工具,参见:

https://github.com/antkillerfarm/antkillerfarm_crazy/blob/master/python/ml/nlp/hello_gensim.py

参考:

http://wei-li.cnblogs.com/p/word2vec.html

文本深度表示模型Word2Vec

http://www.cnblogs.com/wowarsenal/p/3293586.html

用中文把玩Google开源的Deep-Learning项目word2vec

http://www.jianshu.com/p/05800a28c5e4

使用word2vec训练wiki中英文语料库

LSTM Speech Recognition实战

数据集

首先,在Github上搜寻了一番,发现了以下项目:

https://github.com/zzw922cn/Automatic_Speech_Recognition

https://github.com/pandeydivesh15/AVSR-Deep-Speech

但是无奈他们使用的TIMIT数据集是收费的,只好放弃了。

最终,找到了如下项目:

https://github.com/sdhayalk/TensorFlow_Speech_Recognition_Challenge

复现结果

这里只实验了最简单的那个模型,遗憾的是该代码并不能直接使用,需要相应的预处理:

https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/python/ml/tensorflow/TensorFlow_Speech_Recognition_Challenge

这里还有一个坑,该项目只使用了11类声音,而把其他19类都归为unknown。这会导致unknown的权重过重,测试准确度虚高,(无脑分类为unknown都有60%以上的精度)但实际结果很差。需要使用一些方法处理数据的不平衡。

最终,复现结果精度大概在75%~80%之间。训练时间大概要16小时。

炼丹一

把类别扩展到30类,精度略高,但也就80%上下。如此费时的训练,只有这点结果,实在让人丧气。于是参考warpCTC,进行炼丹。

1.LSTM由3层减为1层。

2.使用CTC loss。(参见《深度学习(二十九)》)

在识别验证码的例子中,假如有两幅图,分别是123和4567,那么Label就是:

[[1,2,3,0]
 [4,5,6,7]]

虽然英语是表音文字,但直接分解字母作为标签显然是不太精确的。

这里需要用到ARPABET表,该表可以看做是国际音标的另一种表示法:

https://en.wikipedia.org/wiki/ARPABET

还有如下工具可以将英文单词转换为ARPABET表示:

http://www.speech.cs.cmu.edu/tools/lextool.html

这个工具所使用的词典在:

http://svn.code.sf.net/p/cmusphinx/code/trunk/cmudict/

精度大为提高到90%。

炼丹二

1.将LSTM改为BiLSTM。

2.使用1x1的卷积处理频谱。给feature map以不同的权重,有助于强化有效声音,弱化噪声。

3.使用3层FC。只对同一time step的频点做FC,不跨time step。

原理参见《深度学习(三十)》中的Deep speech 2。

精度再次提高到96%。如果不做第1步的修改的话,精度大概是94%,但计算快了很多,大概2个小时。

fftw

fftw是一个C语言的FFT库,由MIT的Matteo Frigo和Steven G. Johnson编写。

fft的实现往简单的说,也就几十行代码。这里这个3M+的庞然大物当然没这么简单。它使用了汇编、并行等加速手段,还支持DCT和DST变换。

官网:

http://fftw.org/

代码:

https://github.com/FFTW/fftw3

然而,由于fftw的代码是自动生成的,因此这个代码库实际上只供专业人士使用。普通用户直接在官网下载源代码包即可。

参考:

https://blog.csdn.net/congwulong/article/details/7576012

FFTW中文参考

aubio

aubio是一个C语言的音频分析库,提供了提取fbank、MFCC等特征的能力。

找到aubio的过程,堪称曲折。最近要移植MFCC提取功能,到一嵌入式平台。因此要求代码必须是C语言。

1.Kaldi是C++写的,不合要求。

2.scipy.fftpack的核心是用C和Fortran写的,其实最主要的部分是Fortran写的。

3.使用Java语言的话,jMIR是个不错的选择。

代码:

https://github.com/aubio/aubio

安装:

sudo apt-get install python3-aubio python-aubio aubio-tools libaubio-dev

aubio的fft结果是以极坐标的格式保存的,而LibROSA则是以平面坐标的格式保存的。

示例1:测试环境是否安装好了,包括C和python环境。

https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/helloworld/aubio/1

示例2:python:获取wav文件的频谱。C:log重定向+读取wav文件内容。

https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/helloworld/aubio/2

参考:

http://www.cnblogs.com/daleloogn/p/4510137.html

音乐检索研究中使用的工具

Ooura

Takuya Ooura是东京大学的教授,他写了一套数值计算的软件叫做Ooura,其中包含了FFT的实现。这也是aubio默认的FFT实现。

代码:

http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html

这是作者收集的FFT库的列表:

http://www.kurims.kyoto-u.ac.jp/~ooura/fftlinks.html

LibROSA

LibROSA是一个分析音乐和语音的Python库。

官网:

http://librosa.github.io/

代码:

https://github.com/librosa/librosa

文档:

http://librosa.github.io/librosa/

参考:

http://www.cnblogs.com/xingshansi/p/6816308.html

音频特征提取——librosa工具包使用

python_speech_features

python_speech_features是另一个分析音乐和语音的Python库。

代码:

https://github.com/jameslyons/python_speech_features

文档:

https://python-speech-features.readthedocs.io/en/latest/

参考

论文:

《Small-footprint Keyword Spotting Using Deep Neural Network and Connectionist Temporal Classifier》

这篇文章是蚂蚁金服提出的Keyword Spotting(KWS)的论文,它和本次实战所用的Speech Commands Datasets契合度很高,值得参考。

http://mp.weixin.qq.com/s/-QQjz61VAOVcWE7j-EJPhg

谈谈蚂蚁金服的语音唤醒系统

这里还有两篇炼丹文:

https://zhuanlan.zhihu.com/p/28133530

一次CTC-RNN调参经历

http://www.tbluche.com/ctc_and_blank.html

The intriguing blank label in CTC

http://spandh.dcs.shef.ac.uk/chime_challenge/chime2016/

CHiMe – Computational Hearing in Multisource Environments-国际多通道语音分离和识别大赛

图数据库

Neo4j

Neo4j大概算是最著名的图数据库了,它具有成熟和健壮的数据库的所有特性。相对于关系数据库来说,图数据库(Graph Database)善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询——在关系数据库中,这些查询会导致大量的表连接,因此会产生性能上的问题。

官网:

https://neo4j.com/

参考:

http://blog.csdn.net/xingxiupaioxue/article/details/71747284

如何将大规模数据导入Neo4j

https://mp.weixin.qq.com/s/_Zm88TyBcXAZ4LeQOuJCHA

管理neo4j的用户

https://mp.weixin.qq.com/s/dzPZTqUhWKIiKj2o7OkMbA

Neo4j的python操作库Neo4j-Driver

https://mp.weixin.qq.com/s/mupuyM7m_41eOzQc7LGRRw

Neo4j的python操作库Neomodel

https://mp.weixin.qq.com/s/YVo6KduIvckYKH53fjDogw

neo4j扩展包APOC的图算法

neo4j-graph-algorithms

Neo4j Graph Algorithms扩展包,是一个关于图算法的jar包,集成了一些常见的图算法,比如社区发现,路径扩展,中心点计算,PageRank等。

代码:

https://github.com/neo4j-contrib/neo4j-graph-algorithms

openCypher

openCypher是基于Neo4j的查询语言Cypher开发的,Cypher用于在图数据库中存储和检索数据。在图数据库领域,目前还没有像关系数据库中访问数据的SQL这样的通用查询语言标准。

openCypher的目标是通过简化存储、分析,以及用于访问图数据模型的工具平台,促进图处理和分析的使用。技术厂商可以在他们的工具和平台内实现Cypher。

官网:

http://www.opencypher.org/

RedisGraph

RedisGraph是Redis推出的基于Redis的图数据库。

官网:

http://redisgraph.io/

参考:

https://mp.weixin.qq.com/s/BzQBy6AoMXXpjsdGyXh1zA

揭秘RedisGraph: Redis内嵌高性能内存图数据库

你可能感兴趣的:(word2vec, LSTM Speech Recognition实战, 图数据库)