中文自然语言处理小笔记
学习小笔记
情感分析
因为没有历史情感数据进行建模,无法导入机器学习算法形成模型。
所以利用了情感倾向词表进行规则计算。规则是:否定词+程度副词+情感词
其中每个部分都需要维护一个基础数据表,在新句子中搜索组成此结构,然后计算每个结构的情感得分。
一般来讲传统方法会对整个句子计算整体的情感得分,就是将所有的最小单元求和。
我做了一点改进的是:将每个最小单元的各项值保留,形成句子的$3xN$情感矩阵,这样做的好处是不仅可以计算整个句子的得分,还可以计算每个单元的得分。这样将有可能计算句子的局部情感信息,以及局部信息与全部信息的关系,势必将可以捕捉到更多的特征。例如:某个句子的一个极度负面的用词,对于整体长句是否应该一票否决?不知道,或许不同场景不一样,但特征捕捉出来,然后进行实验就可以知道了。
tfidf
统计词频并用全局词频进行降权。
word2vec
生成方法还没有去做具体研究。
理解是基于语料库的词组搭配关系自动生成词语向量量用于刻画语义,可以刻画词语间的相似性。
在后续的使用上有一点小思考,看到的应用都是将句子的所有的词语的向量求和,然后计算句子间的相似性,这样的话就会是两个向量求余弦的操作。
这样固然简单,但我有一个一个疑问,这样不就将顺序所包含的信息给丢掉了吗?
难道不能够用词语向量所组成的矩阵计算相似性?难点在哪里?还在思考。。。
可能是$MxN$与$KxL$矩阵的相似性计算在数学上不好操作?有没有近似操作?
训练词向量的两种方式:
Skip-gram
CBOW
训练词向量的核心在于使用贝叶斯推理公式
word2vec线上部署思路
初步的一些思路是:
本地load,加载到内存中,当然如果每次调用都需要load的话,必定很慢.这也就对应用服务器的内存提出更高要求,一般word2vec至少有5G-10G大小.
调用REST API,为请求词向量单独起个服务,感觉这个架构会比较清晰简单,但是如果需要使用到所有的词向量的话也会比较麻烦
加载到本地数据库中,即时调用。Sqlite或许是个不错的选择,但是由于Sqlite的容错性没有做检查,所以并发比较高的情况下在不同的操作系统下可能会有问题.
文件映射,或许可以参考一下annoy.C++写的一个框架,单次调用时间在20us左右,也不暂用内存.
word2vec 与 fasttext
这篇文章讲得很好,可以参考:Word2Vec and FastText Word Embedding with Gensim
讲得简洁清晰。
对于英文来说,使用fasttext可以训练的w2v可以识别到未出现过的词,因为他会考虑子元组,词未在训练集中出现过,子元组却极有可能是出现过的。
基于词向量的主题模型
基于词袋的LDA主题模型,无法考虑词语顺序、词意,仅能表示相同词语在不同句子中的存在与否、存在频率关系。所以在对问题进行主题分类的任务中应该不会有很好的表现,在实际测试中也确实表现不如人意。
可以基于词向量对模型进行修改,进行主题建模的根本还是衡量句子间距离(在整个句子空间上),将所有句子分成若干类。能将句子有效表示成向量,就变成了经典的聚类问题。
在基于词向量表示句子向量时,使用了tfidf对各词语进行了加权平均得到句子向量表示,然后再进一步将从句子中得到关键词(一个)的向量加到加权平均句子向量上。(这一步相当于再次加权)。得到最终句子平均向量。
对得到向量表示句子进行无监督聚类,效果不错。