R语言由于效率问题,实现自然语言处理的分析会受到一定的影响,如何提高效率以及提升词向量的精度是在当前软件环境下,比较需要解决的问题。
笔者认为还存在的问题有:
1、如何在R语言环境下,大规模语料提高运行效率?
2、如何提高词向量的精度,或者说如何衡量词向量优劣程度?
3、词向量的功能性作用还有哪些值得开发?
4、关于语义中的歧义问题如何消除?
5、词向量从”词“往”短语“的跨越?
转载请注明出处以及作者(Matt),欢迎喜欢自然语言处理一起讨论~
——————————————————————————————————————————————————————
R语言中Word2vec的包有哪些?
R语言中的词向量的包还是比较少的,而且大多数的应用都还不够完善,笔者之前发现有李舰老师写的tm.word2vec包
重磅︱文本挖掘深度学习之word2vec的R语言实现
tm.word2vec包里面的内容太少了,只有一个调用函数比较有效,于是李舰老师又在github上自己写了一个word2vec的函数,但是这个函数调用起来还不是特别方便。
于是国外有一神人,在李舰老师基础上,借鉴李舰老师word2vec函数,开发了自己的包,wordVectors包(1000W单词,4线程,20min左右),这个包相当优秀,不仅全部集成了李舰老师函数的优势(可以多线程操作、自定义维度、自定义模型),还解决了如何读取输出文件、消除歧义、词云图、词相似性等问题。
近日发现了其他两个:一个是text2vec,一个是rword2vec。其中text2vec是现在主要的研究方向:
重磅︱R+NLP:text2vec包简介(GloVe词向量、LDA主题模型、各类距离计算等)
——————————————————————————————————————————————————————
一、如何在R语言环境下,大规模语料提高运行效率?
从训练参数、优化训练速度入手。
1、训练参数
训练参数的选择是提高效率的关键之处,一些经验参数训练的经验(一部分来源小桥流水博客):
- window在5~8,我用的8,感觉还不错,CBOW一般在5,SKIP在10左右比较适合;
- 其他的可以参考:
· 架构:skip-gram(慢、对罕见字有利)vs CBOW(快)
· 训练算法:分层softmax(对罕见字有利)vs 负采样(对常见词和低纬向量有利)
· 欠采样频繁词:可以提高结果的准确性和速度(适用范围1e-3到1e-5)
· 文本(window)大小:skip-gram通常在10附近,CBOW通常在5附近
2、优化训练速度
(一部分来源小桥流水博客)
- 选择cbow模型,根据经验cbow模型比skip-gram模型快很多,并且效果并不比skip-gram差,感觉还好一点;
- 线程数设置成跟cpu核的个数一致;
- 迭代次数5次差不多就已经可以了;
——————————————————————————————————————————————————————
二、如何提高词向量的精度,或者说如何衡量词向量优劣程度?
1、维数,一般来说,维数越多越好(300维比较优秀),当然也有例外;
2、训练数据集大小与质量。训练数据集越大越好,覆盖面广,质量也要尽量好。
3、参数设置,一般如windows,iter、架构选择比较相关。
——————————————————————————————————————————————————————
三、词向量的功能性作用还有哪些值得开发?
1、词向量的可加性
词向量有一个潜力非常大的性质,就是向量之间的可加性,比如两个案例:
Vector(巴黎)-Vector(法国)+Vector(意大利)≈Vector(罗马)
Vector(king)-Vector(man)+Vector(woman)≈Vector(queen)
大致的流程就是king的woman约等于queen,当然为什么要减去man,这里man会干扰king词,所以减去。
2、消除歧义
上面king-man就是消除歧义的一种方式,这里要用到线性代数的方式,king-man之后就把man这层意思消除掉了。
不过,得先大规模识别歧义词,有待后续研究。
3、词聚类
通过聚类,可以去挖掘一些关于某词的派生词;或者寻找相同主题时,可以使用。
4、词向量的短语组合word2phrase
通过词向量构造一些短语组合,要分成两步来探索:
(1)词语如何链接起来?(参考论文)
(2)链接起来,用什么方法来记录组合短语?——平均数
比如”中国河“要变成一个专用短语,那么可以用”中国“+”河“向量的平均数来表示,然后以此词向量来找一些近邻词。
5、近义词属性
词向量通过求近似,可以获得很好的一个性质,除了可加性,就是近似性。可以将附近的近义词进行聚合,当然词向量的质量取决于训练语料的好坏。同时,近义词之中,反义词是否能够识别出来,也还是一个值得研究的话题。