背景
目标
快消的业务方提出了需求:希望能够通过电商平台的宝贝标题文本数据,挖掘不同商家推出的新的概念或者以此发现一些新的概念,如护肤概念的早c晚a
业务->技术
- 交付
概念呈现的方式是词。而新就包含了时间的概念,必须要指定“新”这个概念开始的时间 - 数据
形如“雅诗兰黛第七代小棕瓶精华面部精华淡纹修护律波肽收缩毛孔”。发现相对于传统的中文数据,宝贝标题数据有以下特点:1)不存在主谓宾等语法限制,是多个词块的直接拼接;2)包含品牌、系列、产品、成分、功效等
因此,一般的ner方法是用不了了,因为假设我们现在标注了“早c晚a”为新词,而可能2个月后大家都在说,那么“早c晚a”也就不新了。关键词抽取就更不谈了,关键≠新。因此,比较合适的方法就是将文本中的词都找出来,然后将当前时间段的结果,减去已有的词,留下的即为新词
技术
新词发现
使用新词发现技术的人,最绕不开的就是这篇博客《互联网时代的社会语言学:基于SNS的文本数据挖掘》。在这篇博客中,原博作者从统计学角度去描述一个词:词内部的字符搭配较为固定,而词的头和尾与外部的字符搭配较为多样。具体的例子就是,在快消领域中当我们看到“烟酰”时,我们的第一反应会是“烟酰胺”,除此以外我们很少能想到其他的组合。而看到“烟酰胺”时,我们却很难判断前后是什么词,可能是“含烟酰胺”,“涂烟酰胺”,“用烟酰胺”等等很多不同的组合。而这种“很少”与“很多”就可以通过语料统计出来,这两种特征原博作者分别称之为“凝固度”和“自由度”
凝固度
$$
min(\frac{p(abc)}{p(a)p(bc)},\frac{p(abc)}{p(ab)p(c)})
$$
n-gram就对比n-1种切分方式。当词的长度超过2时,就有不同的切分,同时考虑多种切分是为了避免,错误的切分方式高估了词的凝固度。如“的电影”,其中p(的)是非常大的自由度
$$
min(EL, ER)\
$$
其中:- $EL = Entropy_{left}(string) = \sum_{w_{i}\in{W_{m}}}p(w_{i}|string)log_{e}p(w_{i}|string)$
- $ER = Entropy_{left}(string) = \sum_{w_{i}\in{W_{n}}}p(w_{i}|string)log_{e}p(w_{i}|string)$
即词与外界的搭配,可以看到词有左边界与右边界,因此存在左邻字集合与右邻字集合。我们使用信息熵来衡量一个文本片段与外部的搭配有多么随机
回溯
苏神在其博客中中文分词系列,提出:分词就是在相关性较弱的字符处,将文本截断,因而从切词的角度实现新词发现。只是之前的方法都只考虑了相邻2grams的相关性,而升级后的算法同时考虑了多字内部的凝固度(词在任一位置的相关性都是较强的)。从公式上来看依旧是:$min(\frac{p(abc)}{p(a)p(bc)},\frac{p(abc)}{p(ab)p(c)})$,但实现方式如下:
- 选取固定的n,在语料上统计2grams、3grams、…、ngrams,计算内部凝固度,保留大于阈值的结果,构成集合$G$。一般n越大,阈值越大,博客中使用{2:5, 3:25, 4:125}。实际使用中,可以通过总体的凝固度选择分位点
- 切分:用上述grams对语料进行切分(粗糙的分词),并统计频率。切分的规则是,只要一个片段出现在前一步得到的集合G中,这个片段就不切分,比如“各项目”,只要“各项”和“项目”都在$G$中,这时候就算“各项目”不在$G$中,那么“各项目”还是不切分,保留下来
- 回溯:经过第二步,“各项目”会被切出来(因为第二步保证宁放过,不切错)。回溯就是检查,如果它是一个小于等于n字的词,那么检测它在不在$G$中,不在就出局;如果它是一个大于n字的词,那个检测它每个n字片段是不是在$G$中,只要有一个片段不在,就出局。还是以“各项目”为例,回溯就是看看,“各项目”在不在3gram中,不在的话,就得出局
原先的方法是一个阈值,判断所有ngram的可能,而回溯则是计算n-1种切分各自的凝固度,每个凝固度都与阈值的判断,且能够满足大于n个字符的检验
笔者在在快消数据中,使用该回溯算法后发现,词的粒度很大概率会被切分得很细。原因是在快消数据中,很多概念都是已有短词的组合,如“屏障修护”,我们是不希望被切分成“屏障” + “修护”的,这两个词单独出现在业务上价值较低。因此回溯方法可能更适合法律、医疗等专业名词较多的行业
工具
smoothnlp
$L_{S}(EL,ER)= ln\frac{EL·e^{ER}+ER·e^{EL}}{|EL-ER|}$hellonlp
$L_{S}(EL,ER)= ln\frac{EL·e^{ER}+ER·e^{EL}}{|EL-ER|}$
下面是一些关键词抽取,在当前任务上效果不好,理由如开头所述
keybert + keyphrasevectorizers
keybert使用语义相似性来优化相关性,MMR来优化多样性。keyphrasevectorizers则使用词性信息,可以通过自定义词性pattern来产生特定结果UCPhrase
使用深度学习的方式,弱监督地构造训练集,并训练二分类ner模型。原文使用社媒数据,出现相同hashtag的文本作为一个集合$S$,指定词长度n,统计该集合中出现大于2次的ngrams片段,作为正例,其余作为负例,采样构成数据集
词包分词
有了新词发现的结果后,加入已有词包对文本进行分词。对于当前任务来说,由于宝贝标题是多个关键词的直接拼接,因此词的边界是很难区分的。如“雅诗兰黛保湿水润肤乳”,正常结果是“雅诗兰黛”、“保湿水”、“润肤乳”,但是很可能会分成“保湿”、“水润”、“肤乳”,需要额外设计算法处理
想法
- 得根据业务的需求和数据的特征进行合理的算法选择,盲目追求新技术投入产出比未必高
- 在工业界,有时数据标准化处理比算法更重要
- 当不能简单地选择人工标注+模型时,如何无监督/弱监督地启动一个项目,并且能够后期不断地提升效果,是一个算法工程师应该在项目初期就考虑的