(一)结构化文本
常说的数据埋点,其实可以理解成为结构化数据,这样的文本一般都是按照一定的正则表达式来输出的,很容易就转化成结构化数据。
从文本来获取结构化数据,是指?一些纯自然语言的文本,用户的动态,评论,日记,聊天记录,以及新闻资讯、课程、物品描述等,他们没有结构化,也不具备正则表达式,需要通过整理或者挖掘来获取结构化的信息。
面对这样的文本数据,要从中找到相应的维度,这些维度就是我们想生成的结构化数据,比如,关键词、分类、主题、实体名词等。
结构化文本的目的可以有很多,比如建立知识图谱,建立用户画像。下面的内容就是跟建立用户画像息息相关的。
建立用户的关键因素:第一是维度,第二个是量化。
按照用户向量化的手段来分,结构化用户向量的手段有三种:
1、查户口,数据层标签,原始数据标签
2、堆数据,算法层标签,通过统计工作得出用户标签【关键词,分类,主题,聚类,实体提取】
3、黑盒子,就是⽤机器学习⽅法,学习出⼈类⽆无法直观理解的稠密向量【词嵌入】
一、关键词的寻找
1、TF-IDF算法
TF 全称就是 Term Frequency,是词频的意思,IDF 就是 Inverse DocumentFrequency 是逆⽂文档频率的意思。TF-IDF 提取关键词的思想来⾃自信息检索领域,其实思想很朴素,包括了了两点:在⼀一篇⽂文字中反复出现的词会更更重要,在所有⽂文本中都出现的词更更不不重要。
将TF和IDF相乘就得到每一个词的权重,我们可以去top K的词作为关键词,K的选择可以是直接指定,也可以是高于平均数的一个数。
2、TextRank算法
有点像google的pagerank,
①每个节点把⾃自⼰己的权重平均分配给“和⾃自⼰己有连接“的其他节点;
②每个节点将所有其他节点分给⾃自⼰己的权重求和,作为⾃自⼰己的新权重;
③如此反复迭代第 ①、② 两步,直到所有的节点权重收敛为⽌止。
解释:
如果一个单词出现在很多单词后面的话,那么说明这个单词比较重要
一个TextRank值很高的单词后面跟着的一个单词,那么这个单词的TextRank值会相应地因此而提高
二、分类(内容的分类)
面对UGC的内容,希望发现内容的分类,从而在相应的分类模块展现;或者判断用户的兴趣。
1、svm算法
参照《《人工智能--一种现代的方法》《终极算法》 - 简书》
2、KNN算法
参照《《人工智能--一种现代的方法》《终极算法》 - 简书》
三、聚类(类别的发现)
1、LDA主题模型
分类是我们可以事先划分好的,但是主题却很难定义出来,每个人写的文章,它的主题会有很多的随机性,所以我们通过聚类的方式把文章里的核心主题聚类出来,经常出现的词,经常出现的句子就会聚集在一起,从而达到“高亮”的效果,也就是聚类。
通过聚类发现主题,或者说统计出主题。
四、实体识别(Named Entity Recognition,NER)
NER又称作专名识别,是自然语言处理中的一项基础任务,应用范围非常广泛。命名实体一般指的是文本中具有特定意义或者指代性强的实体,通常包括人名、地名、组织机构名、日期时间、专有名词等。NER系统就是从非结构化的输入文本中抽取出上述实体,并且可以按照业务需求识别出更多类别的实体,比如产品名称、型号、价格等。因此实体这个概念可以很广,只要是业务需要的特殊文本片段都可以称为实体。
通过实体识别,可以提炼出我们想要的数据。所以知道自己要什么也很重要。
1、基于规则与词典的识别
正则表达式、上下文无关文法
2、基于统计学的识别
HMM、CRF
3、基于深度学习的识别
LSTM
五、词嵌入
词嵌⼊表达是为了挖掘出字面意思之下的语义信息把特征数据向量化。通过词嵌入模型得到的词向量中既包含了词本身的语义,又蕴含了词之间的关联,同时具备低维、稠密、实值等优点,可以直接输入到计算机并进行后续分析。
六、关系抽取
是自然语言处理中的一项基础任务,应用范围非常广泛。
关系抽取 需要从文本中抽取两个或多个实体之间的语义关系。
1、基于模板的方法(hand-written patterns)
基于触发词/字符串
基于依存句法
2、监督学习(supervised machine learning)
机器学习
深度学习(Pipeline vs Joint Model)
3、半监督/无监督学习(semi-supervised and unsupervised)
Bootstrapping
Distant supervision
Unsupervised learning from the web
七、事件抽取
是自然语言处理中的一项基础任务,应用范围非常广泛。相当于一种多元关系的抽取。
事件抽取技术是从非结构化信息中抽取出用户感兴趣的事件,并以结构化呈现给用户。事件抽取任务可分解为4个子任务: 触发词识别、事件类型分类、论元识别和角色分类任务。其中,触发词识别和事件类型分类可合并成事件识别任务。事件识别判断句子中的每个单词归属的事件类型,是一个基于单词的多分类任务。论元识别和角色分类可合并成论元角色分类任务。角色分类任务则是一个基于词对的多分类任务,判断句子中任意一对触发词和实体之间的角色关系。
事件抽取任务总体可以分为两个大类:元事件抽取和主题事件抽取。元事件表示一个动作的发生或状态的变化,往往由动词驱动,也可以由能表示动作的名词等其他词性的词来触发,它包括参与该动作行为的主要成分 ( 如时间、地点、人物等) 。主题事件包括一类核心事件或活动以及所有与之直接相关的事件和活动,可以由多个元事件片段组成。当前主要是面对元事件抽取,关于主题事件抽取的研究较少。
总结:
通过上面的五种操作,我们产出了两种结果:
①结构化内容库
②内容分析模型:分类器模型,主题模型,实体识别模型,词嵌入模型
这些模型主要用在:当新的物品刚进入时,需要实时地被推荐出去,这时候对内容的实时分析,提取结构化内容,再于用户画像匹配。
(二)构建用户画像
我们把用户对物品的行为,消费或者没有消费看成是一个分类问题。⽤户⽤实际行动帮我们标注了若干数据,那么挑选出他实际感兴趣的特性就变成了了特征选择问题。
基 本 思 想 是 :
①把物品的结构化内容看成⽂档;
②把用户对物品的行为看成是类别;
③每个用户看⻅过的物品就是一个⽂本集合;
④在这个文本集合上使用特征选择算法选出每个⽤户关心的东西。
常用的算法是:卡方检验、信息增益
【PS:基于内容的推荐系统是一个推荐系统的孩童时代,用了用户画像,有了物品的画像,我们就可以计算相似度,来进行粗粒度的推荐,当然随着用户行为的丰富,用户画像的丰富,内容推荐也就不仅仅是孩童时代,而是可以使用机器学习的成人时代,比如用 LR逻辑回归,GBDT集成算法模型来做内容推荐】
(三)推荐算法
一、协同过滤
1、基于记忆的协同过滤
基于记忆的协同过滤,现在看上去极其简单,就是记住每个⼈人消费过什什么东⻄西,然后给他推荐相似的东⻄,或者推荐相似的人消费的东⻄。
A.基于用户的协同过滤(计算用户相似度)
第一步,构建用户和商品的向量矩阵。向量的数量是商品的数量,为用户的每一个向量打分
第二步,⽤每一个用户的向量,两两计算⽤户之间的相似度,设定一个相似度阈值或者设定一个最大数量,为每个用户保留与其最相似的用户。
第三步,为每⼀个⽤户产生推荐结果。
基于⽤户的协同过滤有两个产出:
相似用户列表;
基于用户的推荐结果。
所以我们不但可以推荐物品,还可以推荐用户。
B.基于物品的协同过滤(计算用户相似度)
基于用户的协同过滤有几个问题:
①用户数量往往比较⼤,计算起来非常吃⼒力,成为瓶颈;
②用户的口味其实变化还是很快的,不是静态的,所以兴趣迁移问题很难反应出来;
③数据稀疏,⽤户和用户之间有共同的消费行为实际上是⽐较少的,⽽且一般都是一些热门物品,对发现用户兴趣帮助也不大。
和基于用户的协同过不同,基于物品的协同过滤⾸首先计算相似物品,然后再根据用户消费过、或者正在消费的物品为其推荐相似的。它避免了基于用户的协同过滤:
①首先,物品的数量,或者严格的说,可以推荐的物品数量往往少于用户数量;所以一般计算物品之间的相似度就不不会成为瓶颈。
②其次,物品之间的相似度比较静态,它们变化的速度没有用户的⼝味变化快;所以完全解耦了用户兴趣迁移这个问题。
③最后,物品对应的消费者数量较大,对于计算物品之间的相似度稀疏度是好过计算⽤户之间相似度的。
它的基本步骤:
①构建⽤户物品的关系矩阵,矩阵元素可以是用户的消费行为,也可以是消费后的评价,还可以是对消费行为的某种量化如时间、次数、费⽤用等;
②假如矩阵的行表示物品,列表示⽤户的话,那么就两两计算⾏行行向量量之间的相似度,得到物品相似度矩阵,行和列都是物品;
③产⽣推荐结果,根据推荐场景不同,有两种产⽣结果的形式。一种是为某一个物品推荐相关物品,另一种是在个⼈首页产生类似“猜你喜欢”的推荐结果,一个是在物品场景,另一个则是在首页这种泛化的场景,泛化的场景需要根据用户的喜好来计算多物品的汇总排名。
基于物品推荐算法有: Slope One
【PS:
物品中心化:通过把评估值减去物品平均值,来平衡点极端分数的污染
用户中心化:通过把用户的评估值减去用户平均值,来平衡点用户的打分习惯的干扰
】
协同过滤的相似度计算方法
欧氏距离
余弦相似度
皮尔逊相似度
杰卡德相似度
【PS:基于记忆的协同过滤的相似度算法,就像基于模型的协同过滤的 “模型参数向量值”,只不过一个是人为设定的,一个是机器学出来的。 】
2、基于模型的协同过滤
基于模型的协同过滤则是从用户、物品特征向量中去学习⼀个模型。问题可以描述成是这样的,我们有m个物品,m个用户的数据,只有部分用户和部分数据之间是有评分数据的,其它部分评分是空白,此时我们要用已有的部分稀疏数据来预测那些空白的物品和数据之间的评分关系,找到最高评分的物品推荐给用户。对于这个问题,用机器学习的思想来建模解决,主流的方法可以分为:用关联算法,聚类算法,分类算法,回归算法,矩阵分解,神经网络,图模型以及隐语义模型来解决。下面我们分别加以介绍。
①用关联算法做协同过滤
一般我们可以找出用户购买的所有物品数据里频繁出现的项集活序列,来做频繁集挖掘,找到满足支持度阈值的关联物品的频繁N项集或者序列。如果用户购买了频繁N项集或者序列里的部分物品,那么我们可以将频繁项集或序列里的其他物品按一定的评分准则推荐给用户,这个评分准则可以包括支持度,置信度和提升度等。
常用的关联推荐算法有Apriori,FP Tree和PrefixSpan。
②用聚类算法做协同过滤
用聚类算法做协同过滤就和前面的基于用户或者项目的协同过滤有些类似了。我们可以按照用户或者按照物品基于一定的距离度量来进行聚类。如果基于用户聚类,则可以将用户按照一定距离度量方式分成不同的目标人群,将同样目标人群评分高的物品推荐给目标用户。基于物品聚类的话,则是将用户评分高物品的相似同类物品推荐给用户。
常用的聚类推荐算法有K-Means, BIRCH, DBSCAN和谱聚类。
③用分类算法做协同过滤
如果我们根据用户评分的高低,将分数分成几段的话,则这个问题变成分类问题。比如最直接的,设置一份评分阈值,评分高于阈值的就是推荐,评分低于阈值就是不推荐,我们将问题变成了一个二分类问题。虽然分类问题的算法多如牛毛,但是目前使用最广泛的是逻辑回归。为啥是逻辑回归而不是看起来更加高大上的比如支持向量机呢?因为逻辑回归的解释性比较强,每个物品是否推荐我们都有一个明确的概率放在这,同时可以对数据的特征做工程化,得到调优的目的。目前逻辑回归做协同过滤在BAT等大厂已经非常成熟了。
常见的分类推荐算法有逻辑回归和朴素贝叶斯,两者的特点是解释性很强。
④用回归算法做协同过滤
用回归算法做协同过滤比分类算法看起来更加的自然。我们的评分可以是一个连续的值而不是离散的值,通过回归模型我们可以得到目标用户对某商品的预测打分。
常用的回归推荐算法有Ridge回归,回归树和支持向量回归。
⑤用矩阵分解做协同过滤
用矩阵分解做协同过滤是目前使用也很广泛的一种方法。由于传统的奇异值分解SVD要求矩阵不能有缺失数据,必须是稠密的,而我们的用户物品评分矩阵是一个很典型的稀疏矩阵,直接使用传统的SVD到协同过滤是比较复杂的。
目前主流的矩阵分解推荐算法主要是SVD的一些变种,比如FunkSVD,BiasSVD和SVD++。这些算法和传统SVD的最大区别是不再要求将矩阵分解为UΣVTUΣVT的形式,而变是两个低秩矩阵PTQPTQ的乘积形式。
⑥用神经网络做协同过滤
用神经网络乃至深度学习做协同过滤应该是以后的一个趋势。目前比较主流的用两层神经网络来做推荐算法的是限制玻尔兹曼机(RBM)。在目前的Netflix算法比赛中, RBM算法的表现很牛。当然如果用深层的神经网络来做协同过滤应该会更好,大厂商用深度学习的方法来做协同过滤应该是将来的一个趋势。
⑦用图模型做协同过滤
用图模型做协同过滤,则将用户之间的相似度放到了一个图模型里面去考虑,常用的算法是SimRank系列算法和马尔科夫模型算法。对于SimRank系列算法,它的基本思想是被相似对象引用的两个对象也具有相似性。算法思想有点类似于大名鼎鼎的PageRank。而马尔科夫模型算法当然是基于马尔科夫链了,它的基本思想是基于传导性来找出普通距离度量算法难以找出的相似性。
⑧用隐语义模型做协同过滤
隐语义模型主要是基于NLP的,涉及到对用户行为的语义分析来做评分推荐,主要方法有隐性语义分析LSA和隐含狄利克雷分布LDA。
⑨基于集成学习的方法
由于集成学习的成熟,在推荐算法上也有较好的表现。一个可能取代逻辑回归的算法是GBDT。目前GBDT在很多算法比赛都有好的表现,而有工业级的并行化实现类库。
⑩基于矩阵分解的方法
矩阵分解,由于方法简单,一直受到青睐。目前开始渐渐流行的矩阵分解方法有分解机(Factorization Machine)和张量分解(Tensor Factorization)。
⑪基于深度学习的方法
目前两层的神经网络RBM都已经有非常好的推荐算法效果,而随着深度学习和多层神经网络的兴起,以后可能推荐算法就是深度学习的天下了?目前看最火爆的是基于CNN、RNN、LTSM的推荐算法。
二、推荐算法总结
推荐系统在技术实现上一般划分为三个阶段:挖掘、召回、排序(也可以叫融合)。
挖掘就是结构化分析,而召回呢是指用各种简单的、复杂的推荐算法筛选出一部分比较靠谱的结果,比如,说基于内容的推荐,会产⽣一些推荐结果,⽐如基于物品的协同过滤会产⽣一些结果,矩阵分解会产⽣一些结果,等等。因为各个结果并不规格一致,所以需要一个融合的机制,所以就有了模型融合,在机器学习中,有专⻔为融合⽽生的集成学习思想,比如GBDT,当然GBDT也可以即干召回也干融合。