自训练和增量训练word2vec模型

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

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

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

1.1 准备语料库文件

python 复制代码
# 示例:准备自己的一个大规模的语料库文件
df = spark.sql("""
select hist_item_seq from dmb_dev.dmb_dev_item_sku_sequence
 where item_seq_len >=2
 group 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 )
bash 复制代码
"五粮液 金密鉴 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 读取语料文件

python 复制代码
# 定义函数来读取语料库文件
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 lines

corpus = read_corpus(corpus_file)
corpus[:5]            

2.2 训练 Word2Vec 模型

python 复制代码
# 设置 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 保存和读取模型

python 复制代码
# 保存训练好的模型
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相似和 词与词之间的相似系数

python 复制代码
# 查看商品 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 获取用户向量

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

3、增量训练word2vec模型

3.1 增量训练

python 复制代码
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 相似性商品

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

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

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

5.1 fasttext模型训练

python 复制代码
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 查询不在词库中的词向量

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

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

相关推荐
边缘计算社区17 分钟前
首个!艾灵参编的工业边缘计算国家标准正式发布
大数据·人工智能·边缘计算
游客52028 分钟前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
一位小说男主28 分钟前
编码器与解码器:从‘乱码’到‘通话’
人工智能·深度学习
深圳南柯电子1 小时前
深圳南柯电子|电子设备EMC测试整改:常见问题与解决方案
人工智能
Kai HVZ1 小时前
《OpenCV计算机视觉》--介绍及基础操作
人工智能·opencv·计算机视觉
biter00881 小时前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
吃个糖糖1 小时前
35 Opencv 亚像素角点检测
人工智能·opencv·计算机视觉
qq_529025291 小时前
Torch.gather
python·深度学习·机器学习