写在前边:目前已经通过爬虫等手段获取了千万级的文章类数据,但是目前这些数据是只是简单的基于表层的应用,相对粗粒度的统计,文本之间的很多信息并没有被良好的利用起来。为了提高数据的使用率并获取更多有用信息,尝试用常见的NLP来计算文章之间的相似度,探索文章与文章之间的关联关系,了解文章的传播范围,为后续灵活使用数据提供技术基础。
1、设计思路
1.1、 数据分析
- 数据样式上复杂。在数据探索阶段发现除了有汉语、英语,同时也有不少藏文、特殊符号构成的文章,样式上相对多样,对数据处理有更高的要求
- 数据长度相对较长,大部分都是长文本类数据,一篇文章长的有上万个词语,对数据处理时候的速度影响较大,且在词语数量过多的情况下,会有不少无效词语对整片文章造成“中庸”的影响,即钝化的文章的特征
- 文章内夹杂大量emoji符号,在对文章进行分析的时候,很难去定义符号的含义,如果不考虑这类数据的特征时,实际上有大量的信息被忽略了
- 语义分析复杂,在长文本的特征提取时,使用常规的句法分析工具,提取“主+谓+宾”之类的,作为文本的切分结果。但是句法分析的耗时比较高,适合数据量小的场景,在精度要求没那么高的时候不考虑句向量分析。
1.2、流程设计
-
存量数据相似度计算
-
新增数据相似度计算
2、前期准备
2.1、 表设计
-
word_vec
字段名称 字段英文名 字段类型 文章id id int 文章向量 vec varchar -
similarity_results
字段名称 字段英文名 字段类型 文章id id int 与id进行对比的文章id hit_id int 相似度 similarity float
2.2、 腾讯词向量包下载
考虑到有实时需求,不再通过tf-idf来提取特征。采用腾讯词向量包来计算向量
2.3、 用到的python包
gensim 提取词向量
jieba 分词
mysql.connector mysql连接器
numpy 计算包
json 解析json
time 获取时间
kafka 消费topic
sklearn 机器学习包
2.4、 MysqlBinlog实时读取
需要提前安装部署deb