ContentBase指的是以内容、文本为基础的挖掘算法,有简单的基于内容属性的匹配,也有复杂自然语言处理算法,下面分别讲述一下。
1.简单的内容属性匹配
比如我们按上面协同过滤的思路计算的看了又看推荐列表,根据一个商品来推荐相关或相似的商品,我们也可以用简单的内容属性匹配的方式。这里提出一种简单的实现思路:
把商品信息表都存到Mysql表product里,字段有这么几个:
商品编号:62216878
商品名称:秋季女装连衣裙2019新款
分类:连衣裙
商品编号:895665218
商品毛重:500.00g
商品产地:中国大陆
货号:LZ1869986
腰型:高腰
廓形:A型
风格:优雅,性感,韩版,百搭,通勤
图案:碎花,其它
领型:圆领
流行元素:立体剪裁,印花
组合形式:两件套
面料:其它
材质:聚酯纤维
衣门襟:套头
适用年龄:25-29周岁
袖型:常规袖
裙长:中长裙
裙型:A字裙
袖长:短袖
上市时间:2019年夏季
我们找商品的相似商品的时候,写个简单的SQL语句就可以了。代码如下所示:
select 商品编号 from product where 腰型='高腰' and 领型='圆领' and 材质='聚酯纤维' and 分类='连衣裙' limit 36;
这就是最简单的根据内容属性的硬性匹配,也属于ContentBase的范畴,只是没用上高大上的算法而已。
2.复杂一点的ContentBase算法:基于全文搜索引擎
比如我们对商品名称做中文分词,分词后拆分成几个词,在上面的SQL语句上加上模糊条件,代码如下所示:
SELECT 商品编号 FROM product WHERE 腰型='高腰' AND 领型='圆领' AND 材质='聚酯纤维' AND 分类='连衣裙' AND (商品名称 LIKE '%秋季%' OR 商品名称 LIKE '%女装%' OR 商品名称 LIKE '%连衣裙%' OR商品名称 LIKE '%新款%') LIMIT 36;
加上这些条件会比之前会更精准一些,但是商品名称模糊查询命中的那些商品的顺序是没有规则的,是随机的。应该是商品名称里包含秋季、女装、连衣裙、新款这几个词最多的那些商品排在前面,优先推荐才对。这时候用Mysql无法实现,这种情况就可以使用搜索引擎来解决了。
我们商品信息表的数据都存到Solr或ES的搜索索引里,然后拿上面例子中的商品名称作为一个Query大关键词直接从索引里面做模糊搜索就可以了。搜索引擎会算一个打分,分词后命中多的文档会排在前面去。
这是基于简单的搜索场景,比用Mysql强大了很多。那么现在有一个问题,商品名称比较短,作为一个关键词去搜索是可以的,但是如果是一篇阅读类的文章,去找内容相似的文章话,就不可能把整个文章的内容作为关键词去搜索,太长了。文章内容边几千字很正常。这个时候就需要对文章的内容做核心的有代表性的关键词提取,提取几个最重要关键词以空格拼接起来,再去当一个Query大关键词去搜索就可以了。下面来讲一下提取关键词的算法。
3.关键词提取算法
提取关键词也有很多种实现方式,TextRank、LDA聚类、KMeans聚类等都可以。我们根据实际情况选择一种方式就可以。
1)基于TextRank算法提取文章关键词
基于TextRank算法提取文章关键词走Solr搜索引擎计算文章-to-文章相似推荐列表D,TextRank算法基于PageRank。
将原文本拆分为句子,在每个句子中过滤掉停用词(可选),并只保留指定词性的单词(可选)。由此可以得到句子的集合和单词的集合。
每个单词作为pagerank中的一个节点。设定窗口大小为k,假设一个句子依次由下面的单词组成:
w1, w2, w3, w4, w5, ..., wn
w1, w2, ..., wk、w2, w3, ...,wk+1、w3, w4, ...,wk+2等都是一个窗口。在一个窗口中的任两个单词对应的节点之间存在一个无向无权的边。
基于上面构成图,可以计算出每个单词节点的重要性。最重要的若干单词可以作为关键词。
TextRank的代码实现给大家推荐一个开源分词工具,就是HanLP。HanLP是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点;提供词法分析(中文分词、词性标注、命名实体识别)、句法分析、文本分类和情感分析等功能。HanLP已经被广泛用于Lucene、Solr、ElasticSearch、Hadoop、Android、Resin等平台,有大量开源作者开发各种插件与拓展,并且被包装或移植到Python、C#、R、Javascript等语言上去。
HanLP已经实现了基于TextRank的关键词提取算法,效果非常不错。我们直接调用它的API就行了。代码如下所示:
String cOntent= "程序员(英文Programmer)是从事程序开发、维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚,特别是在中国。软件从业人员分为初级程序员、高级程序员、系统分析员和项目经理四大类。";
List keywordList = HanLP.extractKeyword(content, 5);
System.out.println(keywordList);
关键词提取和文本自动摘要算法一样,HanLP也提供了相应的实现,代码如下所示:
String document = "算法可大致分为基本算法、数据结构的算法、数论算法、计算几何的算法、图的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行算法、厄米变形模型、随机森林算法。\n" +
"算法可以宽泛的分为三类,\n" +
"一,有限的确定性算法,这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止。这类算法得出的结果常取决于输入值。\n" +
"二,有限的非确定算法,这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的。\n" +
"三,无限的算法,是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法。通常,无限算法的产生是由于未能确定的定义终止条件。";
List sentenceList = HanLP.extractSummary(document, 3);
System.out.println(sentenceList);
2)基于LDA潜在狄利克雷分配模型算法提取文章关键词
基于LDA潜在狄利克雷分配模型算法提取文章关键词走Solr搜索引擎计算文章-to-文章相似推荐列表。
LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。
LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。
3)k-means聚类提取关键词
k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。
提取关键词后,后面无非还是走的相关度搜索。但有些场景简单的相关度搜索不满足我们的需求,我们需要更复杂的搜索算法。这个时候我们就需要自定义排序函数了。Solr和ES都支持自定排序插件开发
4)自定义排序函数
不管是标题和内容的相似,更多的是文本的比较,常见的有余弦相似度、字符串编辑距离等,设计到语义的还有语义相似度,当然实际场景比如电商的商品还会考虑到商品销量、上架时间等等多种因素,这种情况是自定义的综合排序。
(1)余弦相似度计算文章相似推荐列表
余弦相似度,又称为余弦相似性。计算文本相似度,通过计算两个向量的夹角余弦值来评估它们的相似度。
将向量根据坐标值,绘制到向量空间中。如最常见的二维空间。
求得它们的夹角,并得出夹角对应的余弦值,此余弦值就可以用来表征,这两个向量的相似性。夹角越小,余弦值越接近于1,它们的方向更加吻合,则越相似。
(2)字符串编辑距离算法计算文章相似推荐列表
编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。
(3)语义相似度
词语相似度计算在自然语言处理、智能检索、文本聚类、文本分类、自动应答、词义排歧和机器翻译等领域都有广泛的应用,它是自然语言的基础研究课题,正在被越来越多的研究人员所关注。
我们使用的词语相似度算法是基于同义词词林。根据同义词词林的编排及语义特点计算两个词语之间的相似度。
同义词词林按照树状的层次结构把所有收录的词条组织到一起,把词汇分成大、中、小3类,大类有12个,中类有97个,小类有1400个。每个小类里都有很多的词,这些词又根据词义的远近和相关性分成了若干个词群(段落)。每个段落中的词语又进一步分成了若干个行,同一行的词语要么词义相同(有的词义十分接近),要么词义有很强的相关性。例如, 大豆!、 毛豆!和 黄豆!在同一行; 西红柿!和 番茄!在同一行; 大家!、 大伙儿!、 大家伙儿!在同一行。另外, 将官!、 校官!、 尉官!在同一行, 雇农!、 贫农!、 下中农!、 中农!、 上中农!、 富农!在同一行, 外商!、 官商!、 坐商!、 私商!也在同一行,这些词不同义,但很相关。
同义词词林词典分类采用层级体系,具备5层结构,随着级别的递增,词义刻画越来越细,到了第5层,每个分类里词语数量已经不大,很多只有一个词语,已经不可再分,可以称为原子词群、原子类或原子节点。不同级别的分类结果可以为自然语言处理提供不同的服务,例如第4层的分类和第5层 的分类在信息检索、文本分类、自动问答等研究领域得到应用。研究证明,对词义进行有效扩展,或对关键词做同义词替换可以明显改善信息检索、文本分类和自动问答系统的性能。
以同义词词林作为语义相似的一个基础,判断两段文本的语义相似度比较简单的方式可以对内容使用TextRank算法提取核心关键词,然后分别计算关键词和关键词的语义相似度,然后按加权平均值法得到总的相似度分值。
5)综合排序
其实在电商或者其他网站都会有一个综合排序、相关度排序、价格排序等等。综合排序是最复杂的,融合了很多种算法和因素进去,比如销量、新品、和用户画像个性化相关的因素等,算出一个总的打分。而用户画像本身可以单独成为一个子系统,下面我们就讲一下。
知乎视频www.zhihu.com
其它深度学习框架也有不错的开源实现,比如MXNet,后面请大家关注充电了么app,课程,微信群,更多内容请看新书《分布式机器学习实战(人工智能科学与技术丛书)》
《分布式机器学习实战》本书对应清华大学出版社京东自营链接地址:
Python编程零基础小白快速入门必听课