@ 2018-05-28
前面有一篇文章介绍了什么用户画像、如何构建画像。实际生产中,有很多的文本数据,比如个人签名、发表评论、对话等等,当然像朋友圈和私信对话这种还是有隐私保护的,这里只是举个栗子。另一个最直观的例子就是今日头条这样的大厂以文本为主要内容,用户对新闻类型的偏好成为推荐过程中的主要副产品,即用户画像。
上文提到过,推荐系统的使命是在用户和物品之间建立连接,用户有用户画像,物品自然也有物品画像。新闻内容、标题、商品标签、描述等都是物品画像的内容,物品画像可以很好的版主丰富用户画像。
Text is everywhere~
使用用户和物品的文本信息构建用户画像,大致有以下两个步骤:
1. 把所有非结构化的文本结构化,去粗取精,保留关键信息;
2. 根据用户行为数据把物品的结构化结果传递给用户,与用户自己的结构化信息合并。
第一步是关键,也是基础,其准确性、覆盖率、粒度都决定了用户画像的质量。第二步会把物品的文本分析结果,按照用户历史行为把物品画像传递给用户。那么如何传递?
成熟的文本挖掘、NLP算法有以下几类:
1. 关键词提取:是最基础的物品画像的标签来源,也为其他文本分析提供数据基础,如TF-IDF,TextRank;
2. 实体识别:人、位置、地点、著作、影视剧、历史事件和热点事件等,最长基于词典的方法结合CRF模型;
3. 内容分类:将文本按照分类体系分类,用分类来表达较粗粒度的结构化信息;
4. 文本:在无人制定分类体系的前提下,无监督地将文本划分成多个类簇也很常见,别看不是标签,类簇编号也是用户画像的常见构成;
5. 主题模型:从大量已有文本中学习主题向量,然后再预测新的文本在各个主题上的概率分布情况,也很实用,其实这也是一种聚类思想,主题向量也不是标签形式,也是用户画像的常用构成;
6. 嵌入:也就是Embedding,从词到篇章,无不可以学习这种嵌入表达。嵌入表达是为了挖掘出字面意思之下的语义信息,并且用有限的维度表达出来。
下面是几种常用的文本结构化算法:
TF-Term Frequency是词频,IDF-Inverse Document Frequency是逆文档频率。TF-IDF提取关键词的思想是来自于信息检索领域,其思想很朴素:1)在一篇文章中反复出现的词更重要;2)在所有文档中都出现的词更不重要。而这两个点分别用TF和IDF两个指标表示。
- TF,词频,在要提取关键词的文档中出现的次数;
- IDF,在现有所有文档中,统计没歌词出现在了多少个文档中,记为 n n ,一共有多少文档记为 N N ,
计算出TF和IDF后,将两项相乘,就得到每个词的权重。
TextRank和Google的PageRank有一些关系,PageRank用来衡量网页重要性,而TextRank与之类似:
1. 文本中,设定一个窗口宽度,比如 K 个词,统计窗口内的词和词的共现关系,将其看成无向图。图就是网络,由存在连接关系的节点构成,所谓无向图,就是节点之间的连接关系不考虑从谁出发,有关系就对了;
2. 所有词初始化的重要性都为1;
3. 每个节点把自己的权重平均分配给“和自己有连接”的其他节点;
4. 每个节点将所有其他节点分给自己的权重求和,作为自己的新权重;
5. 如此反复迭代第 3、4 两步,直到所有的节点权重收敛为止。
通过 TextRank 计算后的词语权重,呈现出这样的特点:那些有共现关系的会互相支持对方成为关键词。
内容分类即短文本分类,较常见的经典算法有SVM,NaiveBayes,在工具上最常用的是Facebook开源的FastText。文本分类在现在信息流充斥的各APP或Web平台随处可见,知乎、今日头条、微信、微博……,文本分类的结果,可以被用来作为用户冷启动时的兴趣探索手段。
这应该算得上是一个NLP技术,命名实体识别(也常常被简称为 NER,Named-Entity Recognition)在 NLP 技术中常常被认为是序列标注问题,和分词、词性标注属于同一类问题。而所谓序列标注,就是给一个字符序列,从左往右遍历每个字符,一边遍历一边对每个字符分类,分类的体系因序列标注问题不同而不同,分词问题、磁性问题、实体识别。
对于序列标注问题,通常的算法就是隐马尔科夫模型(HMM)或者条件随机场(CRF),我们在推荐系统中主要是挖掘出想要的结构化结果,对其中原理有兴趣再去深入了解。实体识别还有比较实用化的非模型做法:词典法。提前准备好各种实体的词典,使用trie-tree数据结构存储,拿着分好的词去词典里找,找到了某个词就认为是提前定义好的实体了。
传统聚类方法在文本中的应用,今天逐渐被主题模型(Topic Model)取代,同样是无监督模型,以 LDA 为代表的主题模型能够更准确地抓住主题,并且能够得到软聚类的效果,也就是说可以让一条文本属于多个类簇。
LDA 模型需要设定主题个数,如果你有时间,那么这个 K 可以通过一些实验来对比挑选,方法是:每次计算 K 个主题两两之间的平均相似度,选择一个较低的 K 值;如果你赶时间,在推荐系统领域,只要计算资源够用,主题数可以尽量多一些。
另外,需要注意的是,得到文本在各个主题上的分布,可以保留概率最大的前几个主题作为文本的主题。LDA 工程上较难的是并行化,如果文本数量没到海量程度,提高单机配置也是可以的,开源的 LDA 训练工具有 Gensim,PLDA 等可供选择。
著名的《LDA数学八卦》是靳志辉大牛所作,大牛原来在腾讯广点通任高级研究员,2018年开始走上了创业这条不归路,《正态分布的前世今生》也是大牛的杰作,有兴趣的感觉找资源拜读~
Embedding其实是一个数学概念,以此前如为例:词嵌入,也叫word embedding,前面的结构化方案,除了 LDA,其他都是得到一些标签,而这些标签无一例外都是稀疏的,而词嵌入则能够为每一个词学习得到一个稠密的向量。
拿着这些向量可以做以下的事情:
1. 计算词和词之间的相似度,扩充结构化标签;
2. 累加得到一个文本的稠密向量;
3. 用于聚类,会得到比使用词向量聚类更好的语义聚类效果。
这方面当然就属大名鼎鼎的 Word2Vec了。Word2Vec 是用浅层神经网络学习得到每个词的向量表达,Word2Vec 最大的贡献在于一些工程技巧上的优化,使得百万词的规模在单机上可以几分钟轻松跑出来,得到这些词向量后可以聚类或者进一步合成句子向量再使用。
前面把用户的文本、物品的文本进行结构化后得到了诸如标签(关键词、分类)、主题、嵌入向量,接下来就是如何把物品的这些标签传递给用户。有这么多的标签要传递给用户,到底哪些标签是用户最感兴趣或者换句话说,到底是哪些特性吸引了用户进行消费?
如果把用户对物品的行为,消费或者没有消费看成是一个分类问题,用户用实际行动帮我们标注了若干数据,那么挑选出他实际感兴趣的特性就是特征选择的问题。最常用的特征选择方法有卡方检验和信息增益。
卡方检验(CHI)本身是一种特征选择方法。前面的TF-IDF和TextRank都是无监督关键词提取算法,而卡方检验(CHI)则是有监督的,需要提供分类标注信息。为什么需要呢?在文本分类任务中,挑选关键词就得为了分类任务服务,而不仅仅是挑选出一种直观上看着重要的词。卡方检验本质上在检验“词和某个类别C相互独立”这个假设是否成立,和这个假设偏离越大,就越说明这个词和这个类别C暗中有一腿,那当然这个词就是关键词了。
计算一个词 wi w i 和一个类别 Cj C j 的卡方值,需要统计四个值:
1. 类别为 Cj C j 的文档中出现词 wi w i 的文档数A;
2. 词 wi w i 在非 Cj C j 的文档中出现的文档数B;
3. 类别为 Cj C j 的文档中没有出现词 wi w i 的文档数C;
4. 词 wi w i 在非 Cj C j 的文档中没有出现的文档数D;
形式化成下面的表格比较好理解:
卡方检验 | 属于类别 Cj C j | 不属于类别 Cj C j | 总计 |
---|---|---|---|
包含词 wi w i | A | B | A+B |
不包含词 wi w i | C | D | C+D |
总计 | A+C | B+D | N=A+B+C+D |
然后按照如下公式计算每一个词和每一个类别的卡方值:
信息增益(Information Gain)是一种有监督的关键词选择方法,也需要标注信息,理解信息熵后再理解信息增益就容易了。信息增益的计算分为3个步骤:
1. 统计全局文本的信息熵;
2. 统计每个词的条件熵,就是知道了一个词后在统计文档的信息熵,只不过这里要分别计算包含词和不包含词两部分的信息熵,再按照各自文本比例加权平均;
3. 两者相减就是每个词的信息增益。
信息增益应用最广的就是数据挖掘中的决策树,经典的决策树分类算法挑选分裂节点时就是计算各个属性的信息增益,始终挑选信息增益最大的节点作为分裂节点。
卡方检验和信息增益不同之处在于:前者是针对每一个行为单独筛选一套标签出来,后者是全局统一筛选。
用户画像对推荐系统是非常必要的,如果产品涉及大量的文本,那么如何利用文本信息来构造画像就是上面提到的两个步骤:1)结构化文本信息;2)为用户挑选其有信息量的结构化数据,作为其画像内容。