详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法
TF-IDF的基本原理
算法思想
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。 TF-IDF的主要思想是:如果某个词在某篇文章中出现的频率高,并且在其他文章中很少出现,则认为该词可以作为该篇文章的关键词。
计算公式
求某篇文章中某个词的TF-IDF的计算公式:
TF为词频,指的是该词在该文章中出现的频率;IDF为逆文档频率,衡量该词在所有文章中的出现频率。
TF的计算公式:
IDF的计算公式:
其中log的底数为自定义取值,一般取e。
相似度计算原理
下面通过一个简单的例子介绍利用TF-IDF计算文本相似度的原理。
假设词库中共有5个词:
dictionary = (word0,word1,word2,word3,word4)
计算其中两个文本 text1 = (word0,word1) 和 text2 = (word0,word4) 的相似度。
首先计算每个文本中每个词的tfidf权重,构成两个维度与dictionary一一对应的向量,结果如下:
text1_vec = ( 0.2,0.3 ,0,0,0 )
text2_vec = ( 0.5,0 ,0,0,0.1 )
其中,当某词的tfidf权重为0,则代表该文本中没有该词或权重非常小,可以忽略。
然后,利用余弦相似度,计算两个向量的距离,即代表两个文本的相似度。
A、B两个向量的余弦相似度计算公式如下:
所以,sim_t1&t2 = (0.2×0.5)÷[ (0.2²+0.3²)½×(0.5²+0.1²)½ ] = 0.1149
微型图书推荐案例
案例背景
根据以下三本书的内容简介及小明的自我介绍,向小明推荐一本最合适的书。
现有书籍如下:
book0:《书法学习》先介绍了楷书的学习,后介绍了行书的学习
book1:《编程世界》介绍了基本算法以及编程实践
book2:《语法手册》英语学习的必备工具
小明的自我介绍:
小明:我叫小明,我喜欢编程,刚开始学习,还是个新手。
案例说明:
我们可以很容易的看出,book0的关键词是“书法”;book1的关键词是“编程”;book2的关键词是“语法”;小明自我介绍的关键词是“编程”。所以可以很迅速地做出判断,应将《编程世界》推荐给小明,这是因为我们从小学习汉语,已经在脑海中建立语言模型。
而交给计算机程序处理这个问题时,它首先也需要通过大量的文本训练在内存中建立模型,然后作出判断。例如用TF-IDF算法对book0作分析:通过遍历所有的文本信息,计算机发现尽管book0中出现3次“学习”,2次“介绍”,但都不能作为关键词,因为“学习”也在book2中出现了,“介绍”也在book1中出现了,所以它们都是汉语中的常用词汇,不能作为关键词,而可以选择“书法”、“楷书”、“行书” 作为关键词。
这只是微型案例,我们人类的解决的速度可能要比计算机快,但面对海量数据时,计算机将远胜于人类。
开发工具
1.Python3.x
2.结巴分词
3.gensim
gensim是一款强大的自然语言处理工具(python的第三方库),用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。 它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法。
本项目利用基于gensim的TF-IDF算法计算文本相似度,项目引用如下:
import jieba
from gensim import corpora, models, similarities
数据预处理
预处理包括对图书信息和小明信息进行分词和加载停用词等操作,预处理后的信息分别保存到列表books_list [ ] 和xiaoM_list [ ] 中
book0 = "《书法学习》先介绍了楷书的学习,后介绍了行书的学习"
book1 = "《编程世界》介绍了基本算法以及编程实践"
book2 = "《语法手册》英语学习的必备工具"
xiaoM = "我叫小明,我喜欢编程,刚开始学习,还是个新手"
图书信息预处理
books = []
books.append(book0)
books.append(book1)
books.append(book2)
books_list = []
for book in books:
book_list = [word for word in jieba.cut(book)