作者:十方,三品炼丹师
推荐系统领域太卷了,十方表示总是折腾"塔"太累了,所以十方平时也会学习些NLP,CV相关领域的知识去丰富下自己的见识。这里十方希望大家不要把自己要学的东西限定的太死,比如我们是做推荐系统相关研究的,那nlp相关知识我们可以不去学习。事实上,不同领域的模型是可以相互借鉴的,比如textcnn,就是用图像的cnn去做文本分类,推荐的bert4vec,就是用处理文本的bert模型做推荐。总而言之,希望大家在深度学习领域尽可能的博学,在具体推荐系统领域可以做到专家。
本篇是NLP的一篇相对基础的文章,如果你已经对NLP领域的知识有很深的理解了,可以跳过本篇(可以关注后续,对理论的讲解会由浅入深),如果你没有系统性的学习过NLP,建议从这篇开始,和十方一起系统性的迈入NLP的领域吧。
NLP是什么?
NLP是什么,我就不过多介绍了,就是让计算机能处理我们的语言。话说,计算机不是已经能处理语言了?C ,JAVA,python,计算机都能高效的处理。但是我们说的NLP,是自然的语言,自然的语言就很不一样了,举个例子,如果我跟你说,我要买个苹果,你觉得我是要手机还是水果呢?C ,JAVA这种,是不会有这种歧义的,是所谓的"硬"语言。
自然语言处理,在现实的应用就很广泛了,比如搜索引擎,我在搜索框搜"苹果",我们会发现有红富士,也有苹果手机以及相关配件。搜索引擎能够分析到我搜索的内容有歧义,并返回多种结果,以满足我的不同需求,至于这是怎么做到的,后续慢慢揭晓。
单词
说到自然语言处理的基本单位,大家第一反应就是单词(现在很多模型都是char粒度了,或者做了bpe处理,后面章节会详细说)。计算机是如何理解单词的含义呢?读者可能第一反应就是word2vec,这确实是目前最常用的方法,下一章节会详细介绍。本章主要介绍基于词典和统计方法。
我们小时候,在学语文的时候,基本不离手的,就是新华字典。计算机也可以有自己的词典,并且在建立良好的索引后,查找速度会非常快。比如我们希望我在说车的时候,计算机能理解可能是轿车,也可能是卡车,那就可以建立一个同义词词典。
|-- car
object -- vehicle -- | |-- truck
最著名的词典,就是wordNet了,大家可以安装下NLTK去体验一下。用同义词词典的问题主要在哪呢?因为词典是人工挖掘的,如果计算机纯靠词典去理解自然语言,那当我们搜"社区团购","awsl"等新词的时候,计算机就懵逼了。如何减少人为干预呢?接下来就要提到计数的方法。
先要说下什么是语料库,简单理解就是我们的训练数据,语料库中包含大量关于自然语言的实践知识,计数方法的本质就是从语料库里提取文本相关知识。要用计数方法,我们第一步要先切词,如果是英文,直接按标点空格split即可,如果是中文,就需要用jieba等工具去切词了。切完词后,计算机是不方便直接处理string的,因此我们对每个单词映射成唯一的ID。
接下来就是如何把每个单词用稠密向量表示了。word2vec一个很重要的假设就是,一个单词的含义由它的上下文决定,比如"I like you "和"I love you",我们知道like和love所在语境相似,所以他们含义相近。我们是否不通过skip-gram或者CBOW就利用上下午把单词变成稠密向量呢?当然!比如一句话"you say goodbye and i say hello.",如果窗口大小是1,比如say这个单词,它上下分别出现过you,goodby,i,hello,goodbye的上下文出现过say和and,我们可以把上文出现的单词,做bag of words。就变成了以下词表:
接下来算相似度,就可以用余弦相似度了:
计数方法的改进
统计上下文单词出现的次数,是存在问题的,这样会造成共现次数越多,相关性越高的情况,比如"the"和"car"出现的频率比"drive"和"car"高,但是"drive"和"car"相关性更高。因此解决办法就是用PMI去描述两个词的相关性,PMI定义如下:
p(x,y)表示两个单词共现的概率,p(x)和P(y)表示两个单词分别出现的概率,因此PMI值越高,单词相关性越高。由于两个单词可能从来没共现过,硬刺可以用PPMI:
有了PPMI的值,我们就可以把上述表格中的计数值替换成PPMI,这样就有了PPMI矩阵,我们就有了更好的单词向量。但是我们知道BOW的方法矩阵维度过高,我们可以用SVD等方法进行降维。
小结
本章介绍了同义词词典和基于计数的方法计算单词间的相关性,以及如何用PPMI矩阵做优化,下一章将详细介绍w2v的方法。
(注:该篇引用了不少"鱼"书的内容,结合了自己的思考,也强烈建议大家去阅读该书)
关注我们,一起完成年终KPI!