背景
目前千寻位置的内容生态运营因为业务涵盖了智能汽车、测绘、智慧城市、数字农业、智慧电网等多行业,内容体量非常大,各类文章/视频3万多篇,解决方案/产品200多个,现有的内容运营体系暴露出了一些亟待解决的问题:
- 原先的内容配置系统完全依赖业务同学手动配置TDK、相关文章/产品/解决方案,这项工作需要对每篇各行业领域内专业性很强的文章有正确理解,同时熟悉千寻所有的解决方案和产品,非常繁琐且耽误时间,效率很低
- 内容搜索完全依赖SQL的精确匹配,不仅查询出的内容相关性排序不准确,也基本会出现超时现象,影响用户的体验
- 用户在浏览相关信息时推荐的内容永远只有同类文章/视频阅读量最高的几篇内容,匹配度不高,大多数文章曝光量有限
随着千寻的业务深入到越来越多的行业,内容运营势必面临着内容多样化、专业化、规模化的问题,依赖传统的人工发布会占用运营同学大量的时间,且因为专业性问题投放匹配度也无法保证,内容投放的自动化、智能化势在必行。
对运营部门而言: 实现千寻内容推送的自动化、智能化,将摆脱内容多样化、规模化、专业化带来的运营瓶颈,帮助运营部门将更多的精力投入在基于准确数据优化用户增长和内容生态上,避免在重复工作上投入宝贵的时间;
对于用户而言: 通过千寻的内容生态,可以更快速地、更多地了解他们感兴趣的内容,并直接浏览与之对应的解决方案和产品;
思路
对于文章,我们目前主要的文章参数包含:标题、分类(单一)、标签(多个)、正文、来源等多累数据。那这些数据其实都是非结构化的,我们就需要对这些特征值进行处理,以期取得紧凑实值特征向量表示。处理这个问题其实要分成大概件事情来做:
- 分词
- 关键词提取
- 词向量
- 距离计算
内容分词
把内容中所有可以成词的词语都扫描出来,将文章打碎到词的粒度,同时根据TF * IDF(文章内词频和词条库词频)为每一个分词对于内容的重要程度打分,来进行语义分析。 分词的主要作用是把句子中所有的可以成词的词语都扫描出来,将文章打碎到词的粒度,来进行语义分析,更容易去除噪音,取得向量化数据,参考:
-
jieba结巴中文分词 github.com/fxsjy/jieba
-
HanLP 自然语言处理 中文分词 词性标注 命名实体识别 依存句法分析 关键词提取 新词发现 短语提取 自动摘要 文本分类 拼音简繁 hanlp.hankcs.com/
-
盘古分词-开源中文分词组件
盘古分词是一个中英文分词组件。作者eaglet 曾经开发过KTDictSeg 中文分词组件,拥有大量用户。 作者。基于之前分词组件的开发经验,结合最新的开发技术重新编写了盘古分词组件。 archive.codeplex.com/
-
Pullword-永久免费的可自定义的中文在线分词API pullword.com/
-
BosonNLP玻森中文语义开放平台提供使用简单、功能强大、性能可靠的中文自然语言分析云服务。bosonnlp.com/
因为我们前端团队相对熟悉基于TypeScript的NestJs作为服务端开发框架,所以支持 Javascript的jieba分词成为了我们解决分词步骤的首选库。
将文章打散成分词后,就会形成一个类似于下图的超级稀疏矩阵
这个矩阵中,每一行对应一篇文章,每一列对应一个词,第 i 行,第 j 列的元素,是字典中第 j 个词在第 i 篇文章中出现的分词。拿这样的矩阵,去做向量分析,其实是没有太大意义的,因为这样离散的特征会导致聚类的结果异常分散,导致基于此数据的预测,极大概率同已有模型数据的任何一篇文章相似度都极低,自然也无法得到致信的相似度推测。那应该怎么办呢?
我们需要评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF逆向文件频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处. 在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语来说,它的重要性可表示为:
以上式子中分子是该词在文件中的出现次数,而分母则是在文件中所有字词的出现次数之和。 参考TF-IDF的百度百科词条:baike.baidu.com/item/tf-idf… 最终得出的一篇文章的关键词数据大概是这个样子的:
关键词:
媒体 0.02155864734852778
高圆圆 0.020220281898126486
微 0.01671909730824073
宾客 0.014328439104001788
赵又廷 0.014035488254875914
复制代码
相似度比较
通过"余弦相似性"算法,利用每一篇内容/商品/解决方案描述中的分词权重向量集合,对比其中任意两者的相关性,得到一个0-1之间的相似数值
精确匹配
搜索内容依靠切分出的有意义词汇进行精确匹配,按照权重依次展现,检索速度快,相关性有数据依据
自动化执行
内容引擎将定期自动化分析整个内容生态中包含的文章、解决方案等,生成对应的分词词库,并对比它们的相关性,无需人工干预,关于内容推荐数据的写入,将会分为2个部分,独立完成更新:
- 文章信息表、关键词信息表作为一个整体,随着拉取接口,同步完成更新
- 关键词表,将会独立设计更新服务,单独完成更新,与文章本身的录入解耦
每次发布文章,更新一条对应数据(保证冷启动的文章,能够立即与旧文章执行比较操作,获得比较可靠的冷启动数据)每次拉取文章时,将会往Redis中计入一个zixunTime的变量,来存储拉取的最后一篇文章创建(更新)时间,作为下一次拉取动作触发的Index时间,防止重复收录多篇文章。
将相似度计算与新文章录入解藕,并让每次定时任务/手动触发所处理的文章相似度计算数量为定值(比如每次任务固定处理100次相似度计算)。我们就需要在每一次执行批量相似度计算时,在Redis记录一次已经执行到第N篇文章与第M篇文章的比较,当下一次批量相似度计算任务执行时,就会从第N篇文章与第M-1篇文章进行比较,直至M为1,或者N增加到大于文章信息表中最大的ID。
架构
新版本的Foxer系统所集成的自然语言处理引擎,基于NLP(自然语言处理)的词向量模型、分词算法和基于聚类分析算法的机器学习模型,具备了文本内容的理解能力,为内容平台提供了一系列基于准确数据的自动化分析能力:
- 文章关键词、摘要自动生成
- 页面SEO内容自动补全、优化
- 文章相似度、相关性比对
- 相关文章推荐
- 按关键词相关度排序的高效搜索引擎
- 基于内容和用户访问链路的产品、解决方案智能推荐
效果
发布流程简单化&自动化
Foxer 系统的自然语言处理引擎,引入了最新的jieba分词数据模型,根据分词算法,能够基于文章内容精确切分文章内容,获取最能代表文章的词汇和权重数据,并基于此给出文章的关键词、摘要等SEO相关信息,以搜索引擎的数据视角,最大限度地刻画文章内容的画像,自动高效地完成这类工作,几乎做到0人工干预,并进一步提高千寻内容站的搜索导向流量。文章TDK、相关内容无需填写,也可以根据内容自动生成,按月均100篇文章编辑,平均每篇阅读理解并相关配置节约10分钟计算,每个月可以为运营同学节约超过16个小时工作时间。
内容搜索速度快&质量高
根据分词算法,能够基于文章内容精确切分文章内容,获取最能代表文章的词汇和权重数据,并基于此给出文章的关键词、摘要等SEO相关信息,以搜索引擎的数据视角,最大限度地刻画文章内容的画像,自动高效地完成这类工作,几乎做到0人工干预,并进一步提高千寻内容站的搜索导向流量。站内的搜索引擎会自动匹配检索中最为重要的内容,搜索出相关内容,平均相应时间200MS,且会按照与搜索内容的相关性由高到低依次展现,旧版本的搜索引擎面对此类模糊的搜索词条,基本是检索超时(>5000ms)或者0匹配内容
相应速度 | 检出内容 | |
---|---|---|
新版搜索 | <200ms | 1000+ |
旧版搜索 | >5000ms | 0 |
用户粘性提升
新的相关文章推荐功能,基于分词权重,精准量化文章相似度,会引导用户持续了解最相关的资讯和专业文章,持续深度了解相关内容,提高重复流量,争取通过最直接的推荐在短时间内加深用户对于相关内容的了解。更进一步地,借助Foxer系统追踪的用户访问链路,我们可以根据已经有的用户从内容-》产品的链路,掌握相关内容过往实际用户最终购买的产品和解决方案历史,并基于此珍贵的用户行为数据,更精确地在相关内容上推荐产品和解决方案,砍掉中间漏斗链路,最大限度提升内容-》购买的转化,实现数据化精确运营