前面我们已经计算得到tfidf的结果‘tfidf_keywords_values’和textrank的结果‘textrank_keywords_values’。
下面要计算基于tfidf
和textrank
计算离线文章画像
所谓文章画像,就是给文章定义一些主题词和关键词,用来代表这篇文章。
关键词和主题词最大的区别在于
- 主题词是经过规范化处理的。
- 关键词是文章中权重较高的词。
这个项目中,我们采用tfidf和textrank两种方式得到了每篇文章两组权重前20的词组,对于如何确定主题词和关键词,我们处理的方式是:
1) 关键词:textrank处理的topN个词,其权重乘以对应词的逆文档频率(较少个别意义不大的词在多个文档中出现导致权重过高)
2) 主题词:textrank和tfidf计算结果的共同出现的词
一、文章关键词
因为我们是将每篇文章的textrank处理得到的topN个词乘以idf,消除在多篇文章出现的词带来的权重影响,所以要分别加载textrank_keywords_values和idf_keywords_values
# 加载idf逆文档频率
idf = ktt.spark.sql("select * from idf_keywords_values") #
# 加载textrank_keywords_values
textrank_keywords_df = ktt.spark.sql("select * from textrank_keywords_values")
# 重命名idf的keyword列为keyword1
idf = idf.withColumnRenamed("keyword", "keyword1")
# 按照keyword关键词作连接,相当于在textrank结果右边补充对应词的逆文档频率
result = textrank_keywords_df.join(idf,textrank_keywords_df.keyword==idf.keyword1)
# 利用withcolumn方法新增‘weights’列,数据=textrank词权重X该词的idf,最后只选择需要的列
keywords_res = result.withColumn("weights", result.textrank * result.idf).select(["article_id", "channel_id", "keyword", "weights"])
以上计算已经得到最终的结果,但是每篇文章的每个关键词和权重都是单独一列,因此利用文章id进行聚合,将关键词结果放在一起,让结果以字典形式展现
# spark sql的dataframe注册临时表temptable,方便用sql语句操作
keywords_res.registerTempTable("temptable")
# 根据文章id进行分组,一篇文章的所有textrank关键词用collect_list聚合成list,weights同理
merge_keywords = ktt.spark.