简介
最近的任务和NLP有关,需要判断某一个句子是否包含特定的某些单词,进而确定意义是否一致,于是参加了
蚂蚁的比赛 金融大脑-金融智能NLP服务,其任务简述如下:
问题相似度计算,即给定客服里用户描述的两句话,用算法来判断是否表示了相同的语义。
示例:
“花呗如何还款” --“花呗怎么还款”:同义问句
“花呗如何还款” -- “我怎么还我的花被呢”:同义问句
“花呗分期后逾期了如何还款”-- “花呗分期后逾期了哪里还款”:非同义问句
不过既然是开坑,还是先上成熟点的任务吧…这个任务需要根据英文评论判断它对电影好评价还是坏评价
https://www.kaggle.com/c/word2vec-nlp-tutorial#description
Kaggle
在上述教程中,分成了三部分来讨论如何将电影的评论归为积极还是消极的,最后比较了这几种方法。
首先是词袋模型(Bag of words):
Part I Bag of words
The Bag of Words model learns a vocabulary from all of the documents, then models each document by counting the number of times each word appear.
想象一下台球桌角落的袋子,这个模型就是说,各个单词的bag中有几个球(word出现了几次)
To limit the size of the feature vectors, we should choose some maximum vocabulary size. Below, we use the 5000 most frequent words (remembering that stop words have already been removed).
不过由于词汇量可能很巨大,我们不可能把所有词汇都拿来统计,因此我们需要选择有代表性的(出现频率最高的)5000个单词作为特征向量来训练分类模型。
Part II Word2Vec
这部分介绍了一个Word2Vec实现的库gensim
并给出了一些Demo,包括单词相似度展示等等。
>>> model.most_similar("awful")
[(u'terrible', 0.6812670230865479), (u'horrible', 0.62867271900177), (u'dreadful', 0.5879652500152588), (u'laughable', 0.5469599962234497), (u'horrendous', 0.5167273283004761), (u'atrocious', 0.5115568041801453), (u'ridiculous', 0.5104714632034302), (u'abysmal', 0.5015234351158142), (u'pathetic', 0.4880446791648865), (u'embarrassing', 0.48272213339805603)]
总之,采用Word2Vec的方式可以使输入的特征更能代表这个单词的含义。为什么我们需要将单词映射成向量形式呢?这里tensorflow上的教程说的很清楚
https://www.tensorflow.org/tutorials/word2vec
其他的诸如语音识别、图像等任务,输入的特征可以很好地代表他们的本质,语音识别通过频谱,图像通过RGB,但是对于NLP来说,词语应该怎么表述为计算机能够理解的形式呢?通过词的ID?例如YES ID001
NO ID002
MONDAY ID003
,似乎并不能表现其内在的含义。除开NLP,可能也有其他的任务需要将这种离散的值转换成计算机能够理解的特征向量,这种方法叫做嵌入(Embedding),Tensorflow上同样有相关介绍和可视化教程
https://www.tensorflow.org/programmers_guide/embedding
除开Why这个问题,https://www.tensorflow.org/tutorials/word2vec
还提到了Continuous Bag-of-Words model (CBOW) 和 Skip-Gram model两个模型的原理介绍,有兴趣的可以进一步了解一下。
Part III 对句子的处理
上一部分我们把单词转成了计算机可以识别的特征,但是对成段的评论来说,还需要将单词串转成特征,这里的教程选择了两种方式
1、平均
例如对I love you这个句子来说,单词Vec串分别为[0.1 0.2 0.3]
[0.2 0.3 0.4]
[0.3 0.4 0.5]
,最终整个句子的特征就是[0.2 0.3 0.4]
。后续还提到了一种改进,即根据单词的重要程度tf-idf 加权平均。emmm,还是感觉平均的方式有点奇怪…
2、单词含义聚类
这种方式相当于用特定含义的类的ID代替了单词的序号ID。具体方式是根据Word2Vec的结果进行kNN聚类,例如下图中的important附近的词都被替换为类别的ID(centroid),然后再用这个ID串组成的bag-of-centroids(还记得Bag-of-words吗)进行分类训练。
important
Part IV 结果比较
最终结果显示,上述提到的方法和Bag-of-words准确率差不多…(拍死)
为什么呢?虽然Word2Vec做的倒是很好,但是从一串Vec得到段落的特征时,丢失了单词的顺序,Dale loves Jane
Jane loves Dale
在这种情况下会被当成同样的含义……
文章最后提到了Distributed Representations of Sentences and Documents
以及对应的paragraph2vec
,搜索一下可以得到以下资料,留作后续学习。
ps:附上之前做过的小实验,有兴趣的可以看看,欢迎指教
网易云音乐评论抓取实验(2)朴素贝叶斯入门:通过概率对评论情绪分类
总结
输入网络的特征是否能够代表原始信息的本质是一件很重要的事情,在此基础上NLP发展出了bag-of-words,word2vec,paragraph2vec等模型,还有推广到语音信息方面的编码(参考论文Audio Word2Vec: Unsupervised Learning of Audio Segment Representations using Sequence-to-sequence Autoencoder
)等等。
其实反过来想想人类思维也一样,人们看形象的东西总是理解的比较快,看抽象的类似数学公式的东西理解的就比较慢,也可以看作是特征不同的原因。
网友评论