基于word2vec的推荐系统
可用于推荐商品,图书,电影,课程,旅游景点,音乐…
效果
网址点我跳转
一、word2vec简介
Word2Vec是一种词向量表示方法,是在自然语言处理领域(NLP)的神经网络模型,包含两种模型架构:CBOW模型与Skip-Gram模型。
常用于:相似度计算、词类聚类、文本分类、句子和文档表示、搜索引擎优化、情感分析、主题建模以及问答系统。
二、对英文句子进行处理
流程:
1、获取数据
2、预处理
3、训练Word2Vec模型
4、预测并推荐
假设目前有十本图书数据,有标题与内容简介,目标:给定一个新的图书数据,然后预测与其相近的图书。
1、安装库
pip install gensim
pip install nltk==3.8.1
下载对应的punkt
用于分词,stopwords
用于去掉停用词。
点我下载
也可以在github下载nltk的数据:
点我下载
下载完成后,放到C:\Users\用户\nltk_data
下。
2、示例代码
# -*- coding: utf-8 -*-
"""
@contact: 微信 1257309054
@file: word2vec处理英文句子.py
@time: 2025/1/4 20:34
@author: LDC
"""
import numpy as np
import pandas as pd
from gensim.models import Word2Vec
from sklearn.metrics.pairwise import cosine_similarity
from nltk.corpus import WordListCorpusReader, stopwords
from nltk.tokenize import word_tokenize
# 可指定stopwords路径
# stopwords=WordListCorpusReader(root=r"C:\Users\ldc\nltk_data\corpora\stopwords", fileids="english")
def get_data():
"""
获取数据
:return:
"""
# 有一个包含图书描述的DataFrame
data = {
'book_id': ['travel', 'novel', 'story', 'tale', 'epic', 'detective', 'short stories', 'historical', 'science',
'mystery'],
'description': [
"This book is about adventure and travel.",
"A thrilling novel set in a dystopian future.",
"The story of a young girl's journey through space.",
"A heartwarming tale of love and loss.",
"An epic fantasy tale filled with magic and dragons.",
"A detective story with twists and turns.",
"A historical novel set in ancient Rome.",
"A collection of short stories about everyday life.",
"A science fiction novel with interstellar travel.",
"A mystery novel set in a small town."
]
}
df = pd.DataFrame(data)
return df
# 预处理函数
def preprocess_text(text):
# 分词
tokens = word_tokenize(text.lower())
# 去除停用词
stop_words = set(stopwords.words('english'))
filtered_tokens = [word for word in tokens if word.isalnum() and word not in stop_words]
return ' '.join(filtered_tokens)
def train(filename, sentences):
"""
训练模型
:param filename: 模型文件名
:param sentences: 用于训练的词向量
:return:
"""
# 预处理所有描述
'''
训练Word2Vec模型
使用Word2Vec训练模型 参数:vector_size: 词向量维度;window: 上下文的宽度,min_count为考虑计算的单词的最低词频阈值
workers:线程数,epochs:训练次数,negative:负采样,
sg:sg=1 表示使用 Skip-gram 模型,而 sg=0 表示使用 CBOW(Continuous Bag of Words)模型。
'''
model = Word2Vec(sentences, vector_size=100, window=5, min_count=3, workers=4, epochs=7, negative=10, sg=1)
model.save(filename) # 模型保存
return model
def get_book_vector(description, model):
"""
计算每本图书的向量表示
将描述中所有词的向量平均作为图书的向量
:param description:
:param model:
:return:
"""
tokens = word_tokenize(description.lower()) # 分词
filtered_tokens = []
# 去除停用词以及非向量词
# 去除停用词
stop_words = set(stopwords.words('english'))
for word in tokens:
if word.isalnum() and word not in stop_words:
if word in model.wv:
filtered_tokens.append(word)
if not filtered_tokens:
return np.zeros(model.vector_size)
book_vector = np.mean([model.wv[word] for word in filtered_tokens], axis=0)
return book_vector
def get_model(filename):
# 模型加载
return Word2Vec.load(filename)
def recommend_books(query_description, df, model, top_n=6):
"""
推荐图书
:param query_description: 需要预测的图书描述
:param df: 数据集
:param model: 模型
:param top_n: 推荐的数量
:return:
"""
# 获取训练数据的词向量
book_vectors = df['processed_description'].apply(lambda x: get_book_vector(x, model))
book_vectors = np.array(list(book_vectors))
# 获取需要预测文本的词向量
query_vector = get_book_vector(query_description, model)
# 逐一计算相似度
similarities = cosine_similarity([query_vector], book_vectors).flatten()
# 按照相似度降序排列
most_similar_indices = similarities.argsort()[::-1][:top_n + 1]
# 获取对应的图书名称
return df.iloc[most_similar_indices]
if __name__ == '__main__':
# 获取数据
df = get_data()
# 预处理
df['processed_description'] = df['description'].apply(preprocess_text)
# 将所有描述合并为一个长字符串,用于训练Word2Vec
sentences = df['processed_description'].tolist()
# 模型训练
filename = 'book.dat'
model = train(filename, sentences)
# 示例:推荐与“A science fiction novel with wilderness travel.”相似的图书
query_description = "A science fiction novel with wilderness travel."
recommended_books = recommend_books(query_description, df, model)
print(recommended_books[['book_id', 'description']])
输出:
book_id description
9 mystery A mystery novel set in a small town.
8 science A science fiction novel with interstellar travel.
7 historical A collection of short stories about everyday l...
6 short stories A historical novel set in ancient Rome.
5 detective A detective story with twists and turns.
4 epic An epic fantasy tale filled with magic and dra...
3 tale A heartwarming tale of love and loss.
三、对中文句子进行处理
1、安装库
pip install gensim
pip install jieba
2、示例代码
# -*- coding: utf-8 -*-
"""
@contact: 微信 1257309054
@file: word2vec处理中文句子.py
@time: 2025/1/4 23:06
@author: LDC
"""
import jieba
import numpy as np
import pandas as pd
from gensim.models import Word2Vec
from sklearn.metrics.pairwise import cosine_similarity
# 假设我们有一个包含图书描述的DataFrame
data = {
'book_id': ['智慧七柱', '张学良口述历史', '资本对决', '寂寞陈寅恪',
'亲爱的提奥·梵高传', '邂逅', '窥见上帝秘密的人·洛克菲勒自传',
'庆祝无意义', '苏东坡新传', '创始人'],
'description': [
"<p>本书记录了T·E·劳伦斯在沙漠中的战争回忆,被公认为英语文学中最伟大的现代史诗。第一次世界大战爆发后,劳伦斯毅然放弃考古工作,进入开罗军事情报部,负责中东地区的情报收集及战略建议。当时英军认为,以承诺让阿拉伯人在战后独立为名,使阿拉伯建国主义者与英国站在同一阵线,由内陆起兵反抗统治他们多年的奥斯曼土耳其帝国,将有助于协约国在中东地区取得压倒性胜利。劳伦斯因缘际会于1916年底成为阿拉伯起义运动领袖之一,费萨尔阵营中的英军联络官。至1918年,劳伦斯巧用机谋,在阿拉伯部落间引燃独立建国的燎原之火,善用阿拉伯部落擅长的游击战术,以及阿拉伯沙漠漫无边际、变化难测的特性,率领三千阿拉伯起义军,神出鬼没,专事破坏土耳其的补给铁路,牵制了五万以上的土耳其正规部队,创下历史上代价最小而获利巨大的战果。</p><p>他们由麦加北部出发,经过烈日无水的艰困地带,穿越世人畏惧的内夫得沙漠,以落后的武器、匮乏的火药与粮食,一站站攻下延布、沃季、阿卡巴、马安,于同年10月直抵土耳其统治重镇大马士革,完成争取自由的首要目标。很难想象,这位在沙漠中率领阿拉伯人击退土耳其现代部队的传奇人物当时未满三十岁。</p>",
"<p>《张学良口述历史》中,在张氏印象里,张作霖吃饭,四菜没汤;张作相节俭,一个鸡蛋分两餐;叶公超好色,顾维钧风流;蒋介石只剩下了个派头;汪精卫、陈壁君的奇妙夫妻档;胡汉民发牢骚;孙中山一句话论东北局势;郭松龄宁折不弯,吴佩孚浪得虚名;阎锡山见风使舵、张宗昌能战、孙传芳不甘寂寞;以及溥仪溥杰,没落的皇室家族的种种……张氏的口述,随兴而谈,随意而至,流于细碎,却趣味盎然,更往往于不经意间,好比在历史的铁屋子里,开出一片极窄的天窗,露出来的,是遍寻史书也不能得的真实。</p><p>在五光十色的中国近代史中,在百余年当政者的公私生活和政治成败的记录上,最多彩多姿的领袖人物“少帅”张学良将军,应该是独占鳌头了。他那带有浓厚传奇性和高度戏剧化的一生,在民国史上老中青三代的领袖中,真没有第二人可与其相比。尤其是他政治生涯中最后一记撒手锏的西安事变,简直扭转了中国历史,也改写了世界历史。</p>",
"<p>数千亿投资,近万亩土地,炙手可热的上海新城区规划,牵动了中国资本市场各投资大亨的心。华东第一投资集团的总裁夏远捷足先登,拿下新城区黄金地段的全部土地。深圳红岭集团携国际投资大鳄的千亿资本,强势登陆上海滩,欲图将第一投资手里的新城区黄金地段土地,全部收归囊 中。山雨欲来,夏远神秘失踪……</p><p>晨影咨询公司大老板洛闻,人称“天上的事,他知道一半;地上的事,他全知道”。与这场资本大战相关的各类消息,开始在晨影公司飞速流转。夏远的好友小徐哥、顾余笑纷纷卷入其中……</p><p>上海、深圳金融大鳄的资本对决,是一场世纪豪赌,底牌翻开的那一刻。</p>",
"<p>著名史家陈寅恪先生先后留学于日本、德国、瑞士、法国、美国等,通晓梵文、突厥文、满文等多种东西方语言文字。归国后先后任教于清华国学研究院等数所大学,建国前夕由京入粤,后受聘并任教于岭南大学,直至“文革”期间不幸去世。陈寅恪一生中为人们留下了大量著作,内容涉及历史、文学、宗教等多个领域,为后来人开辟了新的学术领域,更提供了新的治学方法,民国以来即广为学界所尊崇和推重。</p><p>本书作者在深入阅读有关资料的基础上对陈寅恪的人生历程、学术成就等进行了系统梳理和扼要介绍,尤其通过对诗文书信等相关文献的发掘对陈寅恪的晚年人生进行了重新解读,并对此前学界的相关成果有所辩证。</p>",
"<p>对许多人来说,梵高完美诠释了什么是疯狂的天才艺术家,但他也是一个善于思考、富于智慧的人。梵高的每一幅画作基本上都在他给弟弟提奥和友人的信中用诗一般的语言描述出来,在他的信中,人们可以读到他对艺术的信仰和独到见解,他对感情的态度以及他对待这个世界的方式。本书萃取梵高数百封信件之精华,将这位伟大艺术家的人生轨迹和闪光思想清晰地展现在读者面前。</p>",
"<p>本书是汪曾祺早期小说集,晚年重新修订,收录了《鸡鸭名家》《复仇》《寂寞与温暖》《金冬心》等名篇。作品通过对普通人平凡命运和生存状态的描述抒发生活内在的诗意,表达作者的人格理想和生活趣味,充满着对世道人心、人类命运的关注。汪曾祺小说创作承袭老庄的精神、废名沈从文的文学风格。汪曾祺对生活始终充满一种乐观主义的平民化态度,对日常生活的热爱,对民间审美观念的认同,使他的小说具有独特的风格。</p>",
"<p>在某种程度上,我所交往的是这个国家里最优秀的人,特别是在商界——这些人建立起美国的商业王国,他们生产的产品远销全球。我所要记录的事件对我而言具有重大的意义,它们在我记忆中留下了永不磨灭的印记。</p><p>如何把握公开个人隐私的尺度,或者说如何保护自己免受攻击,是一个颇具争议的问题。</p>",
"<p>六月的一个早晨,阿兰走在巴黎一条街道上,看到很多穿着低腰裤、露脐装的女人。看着她们裸露的肚脐,阿兰既觉得迷人,又感到困惑,情色不再以女人的大腿或乳房而是以女人的肚脐作为诱惑的中心,这意味着什么呢?</p><p>小说这样开篇,一场嬉笑怒骂的喜剧由此上演,围绕卢森堡公园这个舞台中心,阿兰、拉蒙、夏尔、凯列班四个好朋友轮番登场,顺着他们的脚步、他们的生活故事、他们三三两两的谈话,引出了巴黎街头的花季少女,市民热捧的夏加尔画展,斯大林二十四只鹧鸪的玩笑,尿急的苏维埃傀儡主席,自杀未遂却杀人的母亲,以及天堂纷纷堕落的天使……舞台上演着一部热闹非凡的人间喜剧,幕后却隐藏着作者冷静洞察的智慧:生与死、严肃与荒诞、历史与忘却、现实与梦境,昆德拉让我们在笑中漂浮,为世间的无意义狂欢。</p>",
"<p>苏东坡,天赋异禀的大文豪,无可救药的乐天派……</p><p>他的标签很多,却难以被标签定义。居高处为翰林学士,落低谷为狱中囚犯,一生波澜曲折都在诗里见。本书即以东坡诗词为主线,兼及东坡文集、后人笔记等百余种资料,以坚实的考订和热情的笔触,呈现出一个立体的东坡形象。</p><p>全新增订版特别收录《寻找李一冰》和《缥缈孤鸿影──父亲与〈苏东坡新传〉》,追寻谜样作者和出版缘由,附录《苏轼及宋朝大事年表》。</p><p>◎人生为何不快乐,只因未读苏东坡</p><p>苏东坡是中国文化史上罕见的全才,在诗、文、书、画等方面都有不俗成就。如此天才,一生都颠沛流离,但他却能超越个人的悲哀,既超脱现实,又有烟火气。这种旷达的态度也指引我们获得自己的快乐之道。</p><p>◎余秋雨高度评价的传记经典,全新增订</p><p>余秋雨先生在《苏东坡突围》一文中直接引用本书原文,并高度评价此书文字典雅,作者归结甚有见地。本书已出版近四十年,此次全新增订,收录《寻找李一冰》和《缥缈孤鸿影:父亲与<苏东坡新传>》。</p><p>◎以诗词为主线,参考百余种书目,还原真实、立体的东坡形象</p><p>诗言志,所以本书十之八九取材于东坡诗词,以触摸他内心的喜怒哀乐。此外,作者参考东坡文集和后人笔记等百余种资料,考证坚实,笔触细腻,还原一个真实、立体的东坡形象。</p><p>◎典雅现代的装帧设计,四色彩插,极具典藏价值</p><p>典雅与现代并行的装帧风格,封面选用纹理极强的手揉纸,手工粘贴纹理温厚的环保幼棉,并烫金印鉴。四色彩插,采用100g细腻纯质纸印刷,直观展现苏东坡及其相关的画像、作品。</p>",
"<p>大多数男人从一来到这世上,就不得不面对两件事:你从哪里来?要往哪里去?</p><p>从三流大学毕业的曹原,却不用面对第二个问题。他是一个天生的创业家,活力四射、激情洋溢、上得三十三重天、下得三十三重地狱。在创业的路上,他无比荣耀、目标坚定地向前走着。</p><p>但创业的光景与先前的想象迥然不同,反差之一就是曹原本以为做老板可以每天盘算挣多少钱,结果轮到他做老板却是每天盘算剩多少钱。</p><p>正当他看不到前景时,命运让他遇上三个人,他的人生得以发生重大转折。</p><p>施颖,一直出国未遂的“闲人”。她佩服曹原的执着,网站做得那么烂居然还能硬着头皮做下去。她后来成了曹原红颜知己与得力助手。</p><p>许克,在外企格恩公司担任“业务发展”。一次总部派他去帮助成都分公司赢得德塞克公司的设备竞标,他积极开展工作,但由于不谙公司潜规则,最终落得遭自己人暗算还无人同情的地步。黯然神伤的他决定“不做家猪做野猪”,投靠偶然认识的曹原一起打天下,九帮网从此形成“土鳖”与“海龟”的黄金搭档。</p><p>郝书忠,自学成才的“黑客”。因为喜欢施颖,甘愿拿低工资进入九帮网,从此网站再也没有技术上的后顾之忧。郝书忠告诉曹原:“我看过不少家网站,做得好、活下来的,靠的都不是技术,甚至,靠的都不是网站本身。”</p><p>一个公司尤其是一个网络公司少不了要打一下知名度。他们想到了最传统的方式——向媒体投放广告。他们请来了邹某,谁知邹某是个道貌岸然的文化骗子,损失近万元的曹原痛定思痛,决心自己炒作自己来引发各路媒体关注。九帮网靠性感美女和反日大旗一炮打响。</p><p>有了知名度后还得有好的商业模式赚到钱,不然开公司就成了献爱心。靠着自己有庞大客户群撑腰,曹原他们双管齐下,用上得了台面(谈判)和上不了台面(闹事)的手段最终逼迫各商家付给他们服务费,九帮网基本度过了自己的生存危机。</p><p>能生存了,就要求发展,快速发展的一条捷径是借助资本力量。就像初次借助媒体力量那样,曹原、许克这帮菜鸟又被一个“慈祥”的前辈乔先生用巧妙的手段骗去了20%的股份。</p><p>苦尽甘来,初次融资成功后的曹原他们马上体会到:“在资本面前,连资本家都是渺小的。”九帮网被迫开始了疯狂的扩张,而扩张的目的就是为了第二次融资时能估个好价。第二次融资成功后,曹原他们又被勒令要好好做业绩,因为九帮网要准备上市了。此时的曹原站在了人生的十字路口,公司的走向正远离他的理想,同时事业有成的他遇到了新的爱情诱惑……</p>",
]
}
df = pd.DataFrame(data)
def get_stopwords():
"""
获取停用词
"""
with open('stopwords.txt', encoding='utf-8') as f2: # 可根据需要打开停用词库,然后加上不想显示的词语
con = f2.readlines()
stop_words = list()
for i in con:
i = i.replace("\n", "") # 去掉读取每一行数据的\n
stop_words.append(i)
return set(stop_words)
# 预处理函数
def preprocess_text(text):
# 分词
tokens = jieba.cut(text, cut_all=False)
# 去除停用词
stop_words = get_stopwords()
filtered_tokens = [word for word in tokens if word.isalnum() and word not in stop_words]
return ' '.join(filtered_tokens)
# 预处理所有描述
df['processed_description'] = df['description'].apply(preprocess_text)
# 将所有描述合并为一个长字符串,用于训练Word2Vec
sentences = df['processed_description'].tolist()
# 训练Word2Vec模型
model = Word2Vec(sentences, vector_size=100, window=5, min_count=3, workers=4, epochs=7, negative=10, sg=1)
# 计算每本图书的向量表示
# 这里我们简单地将描述中所有词的向量平均作为图书的向量
def get_book_vector(description, model):
# tokens = jieba.cut(description, cut_all=False)
# filtered_tokens = [word for word in tokens if word.isalnum() and word in model.wv]
tokens = jieba.cut(description, cut_all=False)
# 去除停用词
stop_words = get_stopwords()
filtered_tokens = []
for word in tokens:
if word.isalnum() and word not in stop_words:
if word in model.wv:
filtered_tokens.append(word)
if not filtered_tokens:
return np.zeros(model.vector_size)
book_vector = np.mean([model.wv[word] for word in filtered_tokens], axis=0)
return book_vector
book_vectors = df['processed_description'].apply(lambda x: get_book_vector(x, model))
book_vectors = np.array(list(book_vectors))
# 定义一个函数来推荐图书
def recommend_books(query_description, top_n=6):
query_vector = get_book_vector(query_description, model)
similarities = cosine_similarity([query_vector], book_vectors).flatten()
print('similarities', similarities)
most_similar_indices = similarities.argsort()[::-1][:top_n + 1] # 排除第一个(自身)
return df.iloc[most_similar_indices]
# 示例:推荐与“A science fiction novel with interstellar travel.”相似的图书
query_description = "<p>刘强东,一个勇往直前的铁腕企业家、电子商务领域的靠谱冒险家、一个超级战士。</p><p>一个真正的战士需要的是战场。1998年,他在中关村将自己变成了个体户。2004年,他光脚进入电子商务领域。2011年,他的京东商城销售额突破300亿元。2012年,京东商城销售额又将达到怎样的高点,600亿元?1000亿元?明年,京东会创下全世界最高IPO融资?</p><p>刘强东是如何炼成的?《刘强东·注定震惊世界》告诉你一切。</p>"
recommended_books = recommend_books(query_description)
print(recommended_books[['book_id', 'description']])
输出:
similarities [0.9998696 0.9997333 0.999809 0.999809 0.9997246 0.9998696
0.999875 0.9997981 0.99985784 0.99972975]
book_id description
6 窥见上帝秘密的人·洛克菲勒自传 <p>在某种程度上,我所交往的是这个国家里最优秀的人,特别是在商界——这些人建立起美国的商业...
5 邂逅 <p>本书是汪曾祺早期小说集,晚年重新修订,收录了《鸡鸭名家》《复仇》《寂寞与温暖》《金冬心...
0 智慧七柱 <p>本书记录了T·E·劳伦斯在沙漠中的战争回忆,被公认为英语文学中最伟大的现代史诗。第一次...
8 苏东坡新传 <p>苏东坡,天赋异禀的大文豪,无可救药的乐天派……</p><p>他的标签很多,却难以被标签...
3 寂寞陈寅恪 <p>著名史家陈寅恪先生先后留学于日本、德国、瑞士、法国、美国等,通晓梵文、突厥文、满文等多...
2 资本对决 <p>数千亿投资,近万亩土地,炙手可热的上海新城区规划,牵动了中国资本市场各投资大亨的心。华...
7 庆祝无意义 <p>六月的一个早晨,阿兰走在巴黎一条街道上,看到很多穿着低腰裤、露脐装的女人。看着她们裸露...
四、基于Word2Vec的图书推荐系统
效果:
网址点我跳转