自训练和增量训练word2vec模型

1、自己准备训练语料文件

根据自己的业务场景准备训练数据,比如用户在商城上的同购行为序列或同浏览行为序列。

我们希望通过自己训练业务相关的语料word2vec模型来获得词嵌入、词相关性查询等。

1.1 准备语料库文件

# 示例:准备自己的一个大规模的语料库文件
df = spark.sql("""
select hist_item_seq from dmb_dev.dmb_dev_item_sku_sequencewhere item_seq_len >=2group by hist_item_seq
""")
df.show(6, False)corpus_file = 'large_corpus_sku_name.txt'
df.toPandas().to_csv(corpus_file, sep=' ', index=False, mode='w',header=False )
"五粮液 金密鉴 52度浓香型高度白酒 500ml 五粮液红密鉴(陈酿)6瓶整箱装,五粮液 金密鉴 52度浓香型高度白酒 500ml 五粮液红密鉴(
陈酿)6瓶整箱装,五粮液(WULIANGYE)酒五粮液密鉴浓香型白酒礼盒白酒整箱口粮酒送礼收藏宴请佳品 52度 500mL 6瓶 红密鉴,五粮液(W
ULIANGYE)酒五粮液密鉴浓香型白酒礼盒白酒整箱口粮酒送礼收藏宴请佳品 52度 500mL 6瓶 红密鉴"
"珍酒贵州珍酒 珍十五 2021年份酒 53度酱香型白酒 送礼商务 53%vol 500mL 6瓶 整箱装,珍酒贵州珍酒 珍十五 2021年份酒 53度酱香型白
酒 送礼商务 53%vol 500mL 6瓶 整箱装,珍酒珍十五 酱香型白酒整箱装 53度 500ml*6瓶酒中珍品 大曲坤沙"
"茅台(MOUTAI) 汉酱酒 酱香型白酒 51度 500ml*6瓶 整箱装,习酒贵州习酒 53度 圆习酒 老习酒 500ml*6  整箱装  酱香型白酒,剑南春 
水晶剑 浓香型白酒 喜宴名酒 38度 500mL 6瓶 整箱装"
"洋河 蓝色经典 天之蓝 42度 520ml*6瓶 整箱装 绵柔浓香型白酒 送礼,洋河【官方授权】蓝色经典 口感绵柔浓香型500ml*2瓶白酒 梦之蓝M3 45度 礼盒装,洋河 梦之蓝M3 45度 500ml*2瓶 礼盒装 绵柔浓香型白酒,洋河梦之蓝M3  52度 500ml*2瓶 礼盒装 绵柔浓香型白酒,洋河
之蓝M3  52度 500ml*2瓶 礼盒装 绵柔浓香型白酒"
"五粮液股份 五粮春 浓香型四川宜宾白酒粮食酒 五粮春 45度  500ml*6瓶整箱,五粮液股份 五粮春 浓香型四川宜宾白酒粮食酒 五粮春 45
度  500ml*6瓶整箱,洋河 梦之蓝M6+ 52度 550ml*2瓶 礼盒装 绵柔浓香型白酒"
"茅台(MOUTAI)53度500ml贵州茅台酒 飞天茅台,茅台(MOUTAI)53度500ml贵州茅台酒 飞天茅台 2023单瓶500ML,茅台(MOUTAI)贵州茅台
酒 飞天茅台礼盒 53度 酱香型白酒 500ml*2两瓶装"

2、全量自训练word2vec模型

2.1 读取语料文件

# 定义函数来读取语料库文件
def read_corpus(file_path):lines = []with open(file_path, 'r', encoding='utf-8') as f:for i, line in enumerate(f):lines.append(line.replace('"','').replace(' ','').strip().split(','))  # 每行按,分割好了return linescorpus = read_corpus(corpus_file)
corpus[:5]            

2.2 训练 Word2Vec 模型

# 设置 Word2Vec 模型的参数
vector_size = 20  # 设置词向量的维度
window = 5  # 窗口大小,控制上下文窗口的大小
min_count = 2  # 最小词频,过滤掉低频词
sg = 0  # 0表示使用 CBOW 模型,1示使用 Skip-Gram 模型# 训练 Word2Vec 模型
model = Word2Vec(corpus, vector_size=vector_size, window=window, min_count=min_count, sg=sg)

2.3 保存和读取模型

# 保存训练好的模型
model.save('word2vec_model_1batch_train_sku_name.w2v')# 模型加载
import gensim
model1 = gensim.models.word2vec.Word2Vec.load('word2vec_model_1batch_train_sku_name.w2v').wv
model1.similarity('茅台贵州茅台53度飞天茅台500ml*1瓶酱香型白酒单瓶装', '剑南春 水晶剑 52度 500ml*6瓶  浓香型白酒 整箱装')

2.4 查看TopN相似和 词与词之间的相似系数

# 查看商品 TopN 相似性商品
model.wv.most_similar('国台 十五年 酱香型白酒 53度 500ml单瓶装 15酱酒 茅台镇纯粮食酱酒', topn=10)for item_ta in ['茅台贵州茅台53度飞天茅台500ml*1瓶酱香型白酒单瓶装', '剑南春 水晶剑 52度 500ml*6瓶  浓香型白酒 整箱装']:# 查看print("\n%s商品 TopN 相似性商品为: "%item_ta)print(model.wv.most_similar(item_ta, topn=10))

2.5 获取用户向量

# 获取用户向量
model.wv['茅台贵州茅台53度飞天茅台500ml*1瓶酱香型白酒单瓶装']

3、增量训练word2vec模型

3.1 增量训练

from gensim.models import Word2Vec
import logging# 设置日志级别以便查看进度
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)# 假设有一个大规模的语料库文件
corpus_file = 'large_corpus_sku_name.txt'# 定义 Word2Vec 模型的参数
vector_size = 100  # 词向量维度
window = 5  # 窗口大小
min_count = 5  # 最小词频,过滤掉低频词
workers = 4  # 使用多少个 CPU 核心来训练模型# 初始化空的 Word2Vec 模型
model = Word2Vec(vector_size=vector_size, window=window, min_count=min_count, workers=workers)# 逐步加载和训练数据
def read_and_train_model(model, corpus_file, chunk_size=10000):with open(corpus_file, 'r', encoding='utf-8') as f:lines = []for i, line in enumerate(f):lines.append(line.strip().replace('"','').split(','))  # 假设每行已经分好词了,按空格分割if i > 0 and i % chunk_size == 0:if model.corpus_count == 0:# 第一次建立词汇表model.build_vocab(lines)else:# 更新词汇表model.build_vocab(lines, update=True)# 训练模型model.train(lines, total_examples=len(lines), epochs=model.epochs)# 清空 lines 列表,以便下一个批次数据lines = []# 处理最后一个不完整的数据块if lines:if model.corpus_count == 0:model.build_vocab(lines)else:model.build_vocab(lines, update=True)model.train(lines, total_examples=len(lines), epochs=model.epochs)# 开始增量学习
read_and_train_model(model, corpus_file)# 保存训练好的模型
model.save('word2vec_model_increase_train_sku_name.w2v')

3.2 查看商品 TopN 相似性商品

# 查看商品 TopN 相似性商品
model.wv.most_similar('茅台(MOUTAI)53度飞天酱香型白酒500ml单瓶装', topn=10)

4、模型局限性: 不能识别不在语料库中的词

5、解决方法:使用fasttext模型

5.1 fasttext模型训练

from gensim.models import FastText
# 模型训练
model = FastText(vector_size=20, window=3, min_count=1)  # instantiate
model.build_vocab(corpus_iterable=corpus)
model.train(corpus_iterable=corpus, total_examples=len(corpus), epochs=10) #或者
model2 = FastText(vector_size=20, window=3, min_count=1, sentences=common_texts, epochs=10)

5.2 查询不在词库中的词向量

print(model.wv['【浓香】五粮液甲辰龙年纪念酒(5瓶装)'])
print(model.wv.most_similar('【浓香】五粮液甲辰龙年纪念酒(5瓶装)', topn=10))

到这里虽然能解决不在词库中词的词向量查询问题,但高相关词(商品)的检索又变得有偏了,缺乏一定的多样性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RDMA通信4:MR(Memory Region, 内存区域)基本概念和作用

MR简介 RDMA通信中MR(Memory Region)指的是由RDMA软件层在内存中规划出的一片区域,用于存放收发的数据。IB协议中,用户在申请完用于存放数据的内存区域之后,都需要通过调用IB框架提供的API注册MR,才能让RDMA网卡访问这片内存区域…

正则表达式概述

一、正则表达式概述 正则表达式(Regular Expression,简称regex或regexp)是一种强大的文本处理工具,它使用一种特定的模式来描述和匹配一系列符合某个句法规则的字符串。在Python中,我们可以使用re模块来操作正则表达式…

2.1、matlab绘图汇总(图例、标题、坐标轴、线条格式、颜色和散点格式设置)

1、前言 在 MATLAB 中进行绘图是一种非常常见且实用的操作,可以用来可视化数据、结果展示、分析趋势等。通过 MATLAB 的绘图功能,用户可以创建各种类型的图形,包括线图、散点图、柱状图、曲线图等,以及三维图形、动画等复杂的可视…

数据中台 | 3分钟带你读懂数据中台的由来

1.数据中台产生的原因 数据中台的概念起源于中国阿里巴巴集团提出的“大中台,小前台”战略。这一理念的核心在于通过构建强大的中台体系,为前端的快速创新和个性化业务需求提供强有力的支持。具体到数据中台,其设计初衷是为了应对企业内部数…

springboot在加了mapper之后报错

springboot在加了mapper之后报错 最后发现是spring boot版本不兼容,spring-boot-starter-parent换成3.0.5之后可以了

计算机基础-IO

一、裸机中的IO 我们先看下计算机的组成部分: 从图中我们很清楚的看到Input/Output 即为 IO,也就是计算机主机和外部设备进行信息的交换。 这种交换可能是磁盘IO也有可能是网络IO。 二、操作系统中的IO 操作系统分为内核态和用户态,且默认…

云WAF如何实现对XSS攻击的检测和阻断?

云WAF对XSS攻击的检测和阻断机制 云WAF(Cloud Web Application Firewall)是一种基于云平台的网络安全解决方案,专门设计用来保护Web应用程序免受各种网络攻击,包括跨站脚本攻击(XSS)。云WAF通过以下几个关…

活动预告|8月3日 Streaming Lakehouse Meetup · Online 与你相约!

随着大数据分析技术的发展,越来越多的企业采用了数据湖架构。基于 Lakehouse 的架构优势,结合 Flink 的 Streaming 实时流处理能力,Flink 推出了新一代的“Streaming Lakehouse”技术。这一技术旨在能够让数据在湖上自由流动,为用…

js 习题 3

文章目录 绪论12345678910 求最长公共后缀111213 最大公约数1415结语 绪论 『虽有遗憾,绝不后悔。』—— 「古剑奇谭」 1 let buf"";process.stdin.on("readable",function(){let chunkprocess.stdin.read();if(chunk){bufchunk.toString();} …

HTTP/1.1、1.2、1.3详细信息和主要区别

HTTP(超文本传输协议)是一种用于传输超文本(例如网页)的应用层协议。HTTP/1.1 是当前最广泛使用的版本,而 HTTP/2 和 HTTP/3 是其后续版本,旨在提高性能和效率。以下是这些版本的详细信息和主要区别 HTTP/…

从零开始创建vue3项目——包含项目初始化、element-plus、eslint、axios、router、pinia、echarts

项目启动 初始化vue3项目 这里建议先下载pnpm,下载速度更快,如果还没下载可以使用 npm install -g pnpm 如果遇到报错问题,如下 可以在命令行输入下面的指令以切换到淘宝镜像源 npm config set registry https://registry.npm.taobao.org…

2024最佳游戏引擎排行

游戏产业几十年来一直是一个大生意,而且发展势头迅猛。据估计,全球游戏市场在 2025 年每年将达到 5031.4 亿美元,2023 年为 3960 亿美元。 尽管如今有市面上有各种各样的解决方案,但游戏开发人员和管理者在选择适合他们需求的游戏…

LINUX操作系统安全

一、概述内容 操作系统负责计算机系统的资产管理,支撑和控制各种应用程序运行,为用户提供管理计算机系统管理接口。操作系统也是构成网络信息系统的核心关键组件,其安全可靠性决定了计算机系统的安全性和可靠性。 操作系统安全是指满足安全…

kettle从入门到精通 第八十课 ETL之kettle kettle中的json对象字段写入postgresql中的json字段

场景:源数据库表为mysql的其中有json字段,通过kettle 查询出来 插入到目标数据库 postgresql中,对应的表中也有json字段。。但是报错,提示kettle查询出来是varchar的的字段,无法插入到目标数据库中。 1、创建测试表。 …

golang设置远程调试

1. 目标机器构建安装dlv https://github.com/go-delve/delve go build之后将编译号的dlv命令路径添加到PATH里 2. 目标机器下载源代码并且运行dlv dlv debug --headless --listen:2345 --api-version2 --accept-multiclient 3.本机添加go remote 4. 设置断点即可

披荆斩棘:Python开发者在市场低迷期快速找到工作的策略

披荆斩棘:Python开发者在市场低迷期快速找到工作的策略 在瞬息万变的科技领域,市场低迷期对各个领域的专业人士来说都充满了挑战。Python开发者以其灵活性和专业性著称,但也无法完全避免经济波动的影响。然而,通过采取正确的策略…

Cesium高性能渲染海量矢量建筑

0、数据输入为类似Geojson的压缩文件和纹理图片,基于DrawCommand命令绘制; 1、自定义建筑几何,包括顶点、法线、纹理等; 2、自定义纹理贴图,包括按建筑高度贴图、mipmap多级纹理; 3、自定义批处理表&…

PHP商城案例

http://www.e9933.com/

使用DuiLib进行UI开发的虚函数解析及控件绑定、响应与消息处理

DuiLib是一个开源的基于DirectUI思想的Windows界面库,提供了灵活且易用的UI界面开发能力。在使用DuiLib进行开发时,我们常常会遇到一些虚函数,它们在不同的阶段被调用,以完成各种初始化和消息处理工作。本文将详细介绍DuiLib中的一…