陌路茶色/

[总结]Text Mining 部分

出发点:从 评论,文章等文本中找出能够区分/代表用户行为的关键词/关键短语,为用户打标签。
这部分分为 关键词挖掘,短语提取,短语排序 三部分

业务梳理

关键词挖掘

任务:如何从用户大量的评论数据中挖掘出满足业务需求的评论 或者是说如何找到一些对业务有正向帮助的评论

1.评论数据过滤:只取业务用户的评论,然后用一些业务相关的关键词来过滤评论语料
2.tfidf等方案挖掘候选关键词:分词,统计这些词的tfidf等指标,tfidf比较高的作为该业务的关键词
3.通过业务的label来排序这些词,挖掘特征:比如按用户维度聚合评论,业务用户会对应label(0 or 1),这样每条评论就会对应一个label,同时每条评论会对应若干的关键词,然后分析这些关键词对应的label为1的概率。最后会将这个概率比较高的关键词作为下一层模型的一个特征。
这个开始做的时候,立马就发现一些正向的关键词,并拿到业务方作为了模型很重要的特征,但也存在问题,词力度无法包含业务特有信息,于是重点放到了短语上,就有了后面的工作 短语提取,短语排序。

【这期间还用评论做了一个分类模型(主要就是一个textcnn),因为没有正负样本,所以用到了规则+active learning的方法,会在后面的 知识梳理 部分提到 】

短语提取+分类

前面的衍生,也是这部分的核心,主要是跟踪 韩家炜 团队的工作autoPhrase,包括论文梳理以及对应的代码阅读+串讲,然后照着原始CPP的代码用scala完成了spark的代码,这段时间也熟悉了Scala的spark开发,代码侧相对于之前加入了很多特征,包括词性,词embedding等等,以及做了字力度,词力度,ngram,语料选取,分类模型选取等等不同的尝试,最终的流程变成了如下:
截屏2021-10-22 下午4.25.07.png

1.语料筛选:因为涉及到大量业务的文本语料,有很多信息量很低的数据,比如'666'这种评论,这些都需要过滤掉
2.spark 生成候选,并提取候选特征:语料很多,单机上提取候选短语及特征难度会比较大,因此用spark搞
3.完整性判断(分类模型): 这部分之前是放到spark上用分布式xgb训练的,但是后面为了尝试不同的模型就用python搞了,后面发现公司有现成的xgb分布式训练以及推理服务,其实就可以直接把这套搬到线上做实时文本短语提取了。【关于label,会复用autophrase上的方案,用维基百科上的keyword以及领域已有的一些词作为正样本,其他样本作为负样本】
4.短语类别判断(多个二分类模型): 因为每个候选短语都会有对应的上下文,那么就可以利用这个来训练候选短语对应的embedding,拿到embedding后直接过xgb模型即可对词做分类【会提供若干类别词,大概几千条就可以训练的很好】
5.句子分词(维特比算法): 按照autophrase的代码,后面是有一个维特比算法来计算最佳分割点的,这样就可以将句子切分成若干个短语片段。【尝试过,还不错,但是可能没有太大意义】

短语排序

这部分可以参考RepPhrase,没做出较好的效果

业务侧使用方案

计算词的IV/WOE等来判断词的重要性,以及种子词扩展,短语分类等

技术梳理

短语挖掘

主要流程如下所示【本质上只做了短语挖掘】:
截屏2021-10-22 下午4.40.43.png
重点在于对候选短语挖掘了哪些特征,autophrase代码中分为一元特征和二元特征,对应的是单个token和多个token的情况,我后面实验发现有些badcase是由于分词造成的,而且分开来做不利于维护,于是直接基于字来做,不进行分词,最大候选短语长度设置为8,同时对低频的候选进行过滤。
特征挖掘包括了unigram和phrase:
截屏2021-10-23 下午2.57.42.png
截屏2021-10-23 下午2.58.18.png
还有一些比较重要的特征,如PMI,PKL在论文中有提到过,略。
接下来是模型训练,来判断候选短语是否是完整性短语,这块由于没有标注数据,所以很多方法都没办法很work,autophrase中使用的是RF,因为RF不需要大量的数据训练,而且对样本的容错很好:
截屏2021-10-23 下午3.23.00.png
论文的最后还有一部分是引入词性来优化完整性,本质上来说就是一个dp寻找最优切分序列的问题,实际训练发现没有明显区别,这部分就删除了,但在特征中加入了很多词性特征。
截屏2021-10-23 下午3.42.07.png
最后模型训练先用少量的数据训练一个RF模型,然后将分数比较低的样本作为负样本训练xgb pairwise模型,作为最终的结果。

你比如像这段基佬紫的颜色,是不是充满了视觉压迫力?

留下一条评论

暂无评论