
目录一、数据下载二、向量的相似度计算三、N元语法四、酒店推荐系统总结我们平时在网上购物或者刷视频总能看到【猜你喜欢】即根据你的浏览内容猜测你的喜好但是这是怎么做的呢我们以酒店推荐系统来看看这个过程一、数据下载下载地址https://github.com/Thireshsidda/SeattleHotelsRecommender/blob/main/Seattle_Hotels.csv这个数据有三个字段name酒店名称, address酒店地址, desc 详细描述我们就是通过这些文字描述提取出特征转化为向量然后去做相似度的计算最终得到某个酒店最接近的N个酒店进行推荐。二、向量的相似度计算举个例子计算A和B的余弦相似度• 句子A这个程序代码太乱那个代码规范• 句子B这个程序代码不规范那个更规范• Step1分词句子A这个/程序/代码/太乱那个/代码/规范句子B这个/程序/代码/不/规范那个/更/规范• Step2列出所有的词这个程序代码太乱那个规范不更• Step3计算词频句子A这个1程序1代码2太乱1那个1规范1不0更0句子B这个1程序1代码1太乱0那个1规范2不1更1• Step4计算词频向量的余弦相似度句子A11211100句子B11101211用词频将这两个句子变成了8维向量。根据上面的公式cos 向量的对位相乘再相加/向量的模平方和开根号0.738结果接近1说明句子A与句子B是相似的。但是这里有一个问题假如我们将句子B变换一下【这个程序代码规范那个更不规范】我们可以看下根据上面的方法拆解句子B的向量不变那么和句子A的余弦相似度仍是0.738即句子AB是相似的但是我们读出来A和B的句子含义却完全相反。》这说明了衡量句子AB的相似度还和词的顺序有关。这样就会引出N-GramN元语法的概念三、N元语法N-Gram指的是给定一段文本其中的N个item的序列简单来说有一个句子ABCDE一元语法A B C D E二元语法AB BC CD DE三元语法ABC BCD CDE当一阶特征不够用时可以用N-Gram做为新的特征。比如在处理文本特征时一个关键词是一个特征但有些情况不够用需要提取更多的特征采用N-Gram可以理解是相邻两个关键词的特征组合。如上面的所举的句子AB就是按照一元语法来处理的。四、酒店推荐系统前面两段我们知道如何将文字转换为向量也知道了向量如何计算相似度。那么我们看下酒店推荐是怎么做的Step 1按照N元语法统计出现次数最多的单词只显示前20个。经过统计表格中共152家酒店以上三次计算让我们得到了三种特征这三种特征的数量加到一起的话一元语法特征数 二一元语法特征数 三元语法特征数总数是3347个。一个酒店就有3347维的向量152个酒店就形成了 152 个向量。一个酒店的描述可能也就100多个单词所以我们的向量里面大部分值都是0.停用词Stop words是一些高频的无用的词比如英文中有Imyarethe等中文有好的你的因为等。这些词在统计词频时都要去掉。Step 2计算。大家大概了解下过程。# 使用TF-IDF提取文本特征使用自定义停用词列表 tf TfidfVectorizer(analyzerword, ngram_range(1, 3), min_df0.01, stop_wordslist(ENGLISH_STOPWORDS)) # 行 文档数 df[desc_clean] 有 152 条酒店描述 # 列 特征词数 TfidfVectorizer 拟合后筛出 3347 个不同的 1~3-gram 词 # 矩阵元素[i, j] 第 i 家酒店在第 j 个词上的 TF-IDF 值 tfidf_matrix tf.fit_transform(df[desc_clean]) # 152 * 3347 # 因为TfidfVectorizer 默认norml2 每行被 L2 归一化为单位向量此时点积 余弦 # linear_kernel(A, B) 的数学含义是计算 A 与 B 的 点积矩阵 # cosine_similarities[i, j] 酒店 i 与酒店 j 的余弦相似度。 cosine_similarities linear_kernel(tfidf_matrix, tfidf_matrix) # (152, 152)1先把【酒店-特征值矩阵】的值处理成TF-IDF值TF词频这个很好理解一个词出现了多少次。IDF是逆向文档率用以衡量词的稀缺程度比如这个例子中hotelseattle这样的词出现的频率很高但反而不重要。假如hotel出现了150次列表中几乎每个描述中都出现了我们知道总共有152个酒店的描述。152/150 1几乎等于1而log1 0,说明hotel这个词几乎没有什么价值。TF-IDF是这两个值的乘积。2矩阵做余弦相似度计算使得矩阵变成了152 * 152的矩阵cosine_similarities[i, j] 酒店 i 与酒店 j 的余弦相似度。获得某个酒店的Id取得其他酒店和他的相似度排序取出最大前N个相似度的酒店。总结本篇文章所举得例子其实一共也就100多条数据但是向量的维度可以达到3000维如果继续加四元语法五元语法。。。那么矩阵会更大维度爆炸计算会更准确但是也更慢了。只要是做推荐都可以用这个逻辑去计算比如抖音视频推荐购物的商品推荐。只要我们能把这些内容向量化。