使用文本挖掘实现站点个性化推荐
技术背景一条信息是否能够让用户感兴趣,主要取决于这条信息的内容是否是用户关注的内容。而将用户感兴趣的信息推送给对应的用户,可以更好地发挥该信息的价值,否则,不仅对应信息的价值无法有效发挥,甚至会引起用户的情绪,因为如果用户对这条信息不感兴趣,那么这条信息对于该用户来说就相当于垃圾信息。 现在关键的问题是,如何判断出现有的信息中,哪些信息是用户感兴趣的信息,从而把这些用户可能感兴趣的信息推送给用户,这样对于用户来说,可以获取期望的内容,对于企业来说,这可以更好地获取商业利益。 比如,我们在使用今日头条的时候,你会发现推送过来的文章基本上都是我们感兴趣的文章,这些文章都是个性化推荐过来的。其实,如果我们可以将这项技术更好的利用,这可以改变更多领域。 可以想象,如果小说站点采用个性化推荐技术,那么当读者在读一本小说的时候,我们可以判断该读者的兴趣,并从小说库中选择出读者可能最感兴趣的小说,并将筛选出来的小说推荐给该读者,那么此时,对于读者和网站来说是双赢的,比如就读者而言,节省了小说筛选的成本,并且可以很方便地获得自己感兴趣的内容,就网站而言,将合适的内容推荐给合适的用户,更有利于用户的付费。除此之外,个性化推荐技术还可以应用到新闻站点、商城、视频站点等等方面。? 文本挖掘技术(Text Mining)简介文本挖掘技术(Text Mining)是数据挖掘技术中的一种,简单来说,文本挖掘技术就是对现有的一些文本信息进行分析、处理等,从而提取或计算出一些有价值的信息供我们使用的一种技术。 而在这篇文章中,我们主要用到文本挖掘技术中的分词、文本相似度计算等技术,而文本相似度计算我们主要会采用TF-IDF算法,相关理论知识各位读者可以自行了解,本篇文章中主要会进行实战的讲解。 将文本挖掘技术应用于个性推荐的思路 那么,我们如何将文本挖掘技术应用于个性推荐呢?? 比如,我们可以这样实现个性推荐:? 核心步骤现在我们已经明确了个性化推荐需求的实现思路,接下来我们整理一下实现的核心步骤。 我们可以采用以下步骤进行(以小说站点为例,其他站点类似):? 实现过程上面我们已经讲解了实践的核心步骤,接下来我们进行具体的实现,在此采用的开发语言是Python,需要的第三方库有:jieba、gensim,需要提前使用pip安装好,如下: pip install jieba pip install genism 首先我们假设一下情景(为了保证前后一致,同样以小说站点为例,其他类型站点参考即可),假如现在我们的服务器中有3本小说,分别是盗墓笔记(服务器中文件名为dmbj.html)、老九门(服务器中文件名为ljm.html)、鬼吹灯(服务器中文件名为gcd.html),现在读者正在看盗墓笔记,需要我们从老九门与鬼吹灯中(加入小说库中小说更多,计算方法也是一样的)推荐一本相似度高的小说给读者。 首先,我们需要读取站点中除读者当前正在阅读的这本小说之外的所有小说数据(当然也可以把读者正在阅读的这本小说读取一下,只不过这样的话后面的结果需要去除相似度为1的小说数据),如下所示: import urllib.request #读取老九门这本小说 d1=urllib.request.urlopen("http://127.0.0.1/ljm.html").read().decode("utf-8","ignore") #读取鬼吹灯这本小说 d2=urllib"http://127.0.0.1/gcd.html")"ignore") 读取了小说数据之后,接下来我们需要对要计算的多本小说数据分别进行分词,在这里,我们会使用jieba库进行分词处理,如下所示: import jieba data1=jieba.cut(d1) data2=jieba.cut(d2) 分词之后,我们需要对要计算的多本小说数据分别整理成指定格式,方便后续进行计算,如下所示: data11="" for item in data1: data11+=item+" " data21=item in data2: data21+=" " docs=[data11,data21] 随后,我们需要计算出各词语的频数,如下所示: tall=[[w1 for w1 in doc.split()] for doc in docs] from collections import defaultdict frequency=defaultdict(int) text in tall: token in text: frequency[token]+=1 统计出频数之后,我们可以过滤掉频率低的词语,当然这是在词语很多的情况下,如果本来就词语量有限,比如小说的内容非常少,那么此时我们就不需要过滤了。也就是说,是否需要过滤,主要取决于词语量的大小,若词语量大,连过滤之后分析效率会更高,若词语量过小,显然不应该再过滤,否则过滤之后的词语就更少了。具体过滤的方式如下,由于这几本小说的词语量很大,所以频数在25以下的词语我们都过滤掉了: tall=[[token text if frequency[token]>25] text in tall] 进行了词语的过滤之后,我们需要通过语料库建立词典,具体如下所示: dictionary=corpora.Dictionary(tall) 接下来,我们需要读取用户当前关注的小说的数据,由于刚才我们假设的情景中,用户正在读盗墓笔记这本小说,所以此时我们需要加载盗墓笔记这本小说的数据,具体如下所示: thisnoveldata=urllib"http://127.0.0.1/dmbj.html")"ignore") data3=jieba.cut(thisnoveldata) data31="" for item in data3: data31+=item+" " this_novel=data31 读取了用户当前关注的小说数据之后,我们可以将用户当前关注的小说的数据通过doc2bow转化为稀疏向量,具体如下所示: new_vec=dictionary.doc2bow(this_novel.split()) 随后,我们可以对稀疏向量进行进一步处理,得到新语料库,如下所示: corpus=[dictionary.doc2bow(text) 得到新语料库之后,我们可以将新语料库通过tfidfmodel进行处理,得到tfidf:tfidf=models.TfidfModel(corpus) |