详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法

本文介绍了如何利用gensim库基于TF-IDF算法实现文本相似度推荐。通过详细阐述TF-IDF的基本原理,计算公式和相似度计算方法,结合微型图书推荐案例,展示了如何在Python中构建模型,处理数据并计算相似度,最终确定最合适的推荐书目。
摘要由CSDN通过智能技术生成

TF-IDF的基本原理

算法思想

TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。 TF-IDF的主要思想是:如果某个词在某篇文章中出现的频率高,并且在其他文章中很少出现,则认为该词可以作为该篇文章的关键词。

计算公式

求某篇文章中某个词的TF-IDF的计算公式:

TF-IDF = TF × IDF

TF为词频,指的是该词在该文章中出现的频率;IDF为逆文档频率,衡量该词在所有文章中的出现频率。
TF的计算公式:
TF = 该词在该文章中出现次数 ÷ 该文章中的总词数

IDF的计算公式:
IDF = log[ 文章总数 ÷ (出现该词的文章数+1) ]

其中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两个向量的余弦相似度计算公式如下:
Alt
所以,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) 
namespace ServiceRanking { /// <summary> /// Summary description for TF_IDFLib. /// </summary> public class TFIDFMeasure { private string[] _docs; private string[][] _ngramDoc; private int _numDocs=0; private int _numTerms=0; private ArrayList _terms; private int[][] _termFreq; private float[][] _termWeight; private int[] _maxTermFreq; private int[] _docFreq; public class TermVector { public static float ComputeCosineSimilarity(float[] vector1, float[] vector2) { if (vector1.Length != vector2.Length) throw new Exception("DIFER LENGTH"); float denom=(VectorLength(vector1) * VectorLength(vector2)); if (denom == 0F) return 0F; else return (InnerProduct(vector1, vector2) / denom); } public static float InnerProduct(float[] vector1, float[] vector2) { if (vector1.Length != vector2.Length) throw new Exception("DIFFER LENGTH ARE NOT ALLOWED"); float result=0F; for (int i=0; i < vector1.Length; i++) result += vector1[i] * vector2[i]; return result; } public static float VectorLength(float[] vector) { float sum=0.0F; for (int i=0; i < vector.Length; i++) sum=sum + (vector[i] * vector[i]); return (float)Math.Sqrt(sum); } } private IDictionary _wordsIndex=new Hashtable() ; public TFIDFMeasure(string[] documents) { _docs=documents; _numDocs=documents.Length ; MyInit(); } private void GeneratNgramText() { } private ArrayList GenerateTerms(string[] docs) { ArrayList uniques=new ArrayList() ; _ngramDoc=new string[_numDocs][] ; for (int i=0; i < docs.Length ; i++) { Tokeniser tokenizer=new Tokeniser() ; string[] words=tokenizer.Partition(docs[i]); for (int j=0; j < words.Length ; j++) if (!uniques.Contains(words[j]) ) uniques.Add(words[j]) ; } return uniques; } private static object
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值