# 1 离线画像业务

画像的构建作为推荐系统非常重要的环节,画像可以作为整个产品的推荐或者营销重要依据。需要通过各种方法来构建。

文章内容标签化:内容标签化,根据内容定性的制定一系列标签,这些标签可以是描述性标签。针对于文章就是文章相关的内容词语。

文章的关键词、主题词

# 2 TextRank 算法

TextRank 算法是一种基于图的用于关键词抽取和文档摘要的排序算法,由谷歌的网页重要性排序算法 PageRank 算法改进而来,它利用一篇文档内部的词语间的共现信息 (语义) 便可以抽取关键词,它能够从一个给定的文本中抽取出该文本的关键词、关键词组,并使用抽取式的自动文摘方法抽取出该文本的关键句。

TextRank 算法的基本思想是将文档看作一个词的网络,该网络中的链接表示词与词之间的语义关系。

TextRank 算法主要包括:关键词抽取、关键短语抽取、关键句抽取。

(1)关键词抽取(keyword extraction)
关键词抽取是指从文本中确定一些能够描述文档含义的术语的过程。对关键词抽取而言,用于构建顶点集的文本单元可以是句子中的一个或多个字;根据这些字之间的关系(比如:在一个框中同时出现)构建边。根据任务的需要,可以使用语法过滤器(syntactic filters)对顶点集进行优化。语法过滤器的主要作用是将某一类或者某几类词性的字过滤出来作为顶点集。

(2)关键短语抽取(keyphrase extration)
关键词抽取结束后,我们可以得到的 N 个关键词,在原始文本中相邻的关键词构成关键短语。因此,从 get_keyphrases 函数的源码中我们可以看到,它先调用 get_keywords 抽取关键词,然后分析关键词是否存在相邻的情况,最后确定哪些是关键短语。

(3)关键句抽取(sentence extraction)
句子抽取任务主要针对的是自动摘要这个场景,将每一个 sentence 作为一个顶点,根据两个句子之间的内容重复程度来计算他们之间的 “相似度”,以这个相似度作为联系,由于不同句子之间相似度大小不一致,在这个场景下构建的是以相似度大小作为 edge 权重的有权图。

# 3 TextRank 算法实现

(1)基于 Textrank4zh 的 TextRank 算法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# coding=utf-8
from textrank4zh import TextRank4Keyword, TextRank4Sentence
import jieba.analyse
from snownlp import SnowNLP
import pandas as pd
import numpy as np

#关键词抽取
def keywords_extraction(text):
tr4w = TextRank4Keyword(allow_speech_tags=['n', 'nr', 'nrfg', 'ns', 'nt', 'nz'])
# allow_speech_tags --词性列表,用于过滤某些词性的词
tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words',
pagerank_config={'alpha': 0.85, })
# text -- 文本内容,字符串
# window -- 窗口大小,int,用来构造单词之间的边。默认值为2
# lower -- 是否将英文文本转换为小写,默认值为False
# vertex_source -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点
# -- 默认值为`'all_filters'`,可选值为`'no_filter', 'no_stop_words', 'all_filters'
# edge_source -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点之间的边
# -- 默认值为`'no_stop_words'`,可选值为`'no_filter', 'no_stop_words', 'all_filters'`。边的构造要结合`window`参数

# pagerank_config -- pagerank算法参数配置,阻尼系数为0.85
keywords = tr4w.get_keywords(num=6, word_min_len=2)
# num -- 返回关键词数量
# word_min_len -- 词的最小长度,默认值为1
return keywords

# 关键短语抽取

1
2
3
4
5
6
7
8
9

def keyphrases_extraction(text):
tr4w = TextRank4Keyword()
tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words',
pagerank_config={'alpha': 0.85, })
keyphrases = tr4w.get_keyphrases(keywords_num=6, min_occur_num=1)
# keywords_num -- 抽取的关键词数量
# min_occur_num -- 关键短语在文中的最少出现次数
return keyphrases

# 关键句抽取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

def keysentences_extraction(text):
tr4s = TextRank4Sentence()
tr4s.analyze(text, lower=True, source='all_filters')
# text -- 文本内容,字符串
# lower -- 是否将英文文本转换为小写,默认值为False
# source -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来生成句子之间的相似度。
# -- 默认值为`'all_filters'`,可选值为`'no_filter', 'no_stop_words', 'all_filters'
# sim_func -- 指定计算句子相似度的函数

# 获取最重要的num个长度大于等于sentence_min_len的句子用来生成摘要
keysentences = tr4s.get_key_sentences(num=3, sentence_min_len=6)
return keysentences


def keywords_textrank(text):
keywords = jieba.analyse.textrank(text, topK=6)
return keywords


if __name__ == "__main__":
text = "来源:中国科学报本报讯(记者肖洁)又有一位中国科学家喜获小行星命名殊荣!4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式," \
"我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂。国家天文台党委书记、" \
"副台长赵刚在致辞一开始更是送上白居易的诗句:“令公桃李满天下,何须堂前更种花。”" \
"据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站," \
"获得国际永久编号第120730号。2018年9月25日,经国家天文台申报," \
"国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会," \
"正式将该小行星命名为“周又元星”。"
#关键词抽取
keywords=keywords_extraction(text)
print(keywords)

#关键短语抽取
keyphrases=keyphrases_extraction(text)
print(keyphrases)

#关键句抽取
keysentences=keysentences_extraction(text)
print(keysentences)

运行:

(2)基于 jieba 的 TextRank 算法实现

1
2
3
4
5
6
7
8
9
10
11
12
if __name__ == "__main__":
text = "来源:中国科学报本报讯(记者肖洁)又有一位中国科学家喜获小行星命名殊荣!4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式," \
"我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂。国家天文台党委书记、" \
"副台长赵刚在致辞一开始更是送上白居易的诗句:“令公桃李满天下,何须堂前更种花。”" \
"据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站," \
"获得国际永久编号第120730号。2018年9月25日,经国家天文台申报," \
"国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会," \
"正式将该小行星命名为“周又元星”。"

# 基于jieba的textrank算法实现
keywords=keywords_textrank(text)
print(keywords)

运行:小星星,中国,命名,天文家…

# 什么是 TF-IDF 算法?

TF(全称 TermFrequency),中文含义词频,简单理解就是关键词出现在网页当中的频次。

IDF(全称 InverseDocumentFrequency),中文含义逆文档频率,简单来说就是该关键词出现在所有文档里面的一种数据集合。

TF-IDF 用来评估字词对于文档集合中某一篇文档的重要程度。TF-IDF 的计算公式为:
TF-IDF = 某文档中某词或字出现的次数 / 该文档的总字数或总词数 * log(全部文档的个数 /(包含该词或字的文档的篇数)+1)

# 用户画像

用户标签化:这个过程就是需要研究用户对内容的喜好程度,用户喜欢的内容即当作用户喜好的标签。

在用户行为记录表中,我们所记下用户的行为在此时就发挥出重要的作用了。用户的浏览(时长 / 频率)、点击、分享 / 收藏 / 关注、其他商业化或关键信息均不同程度的代表的用户对这个内容的喜好程度。