gensim流式训练word2vec模型,不需要一次性加载完整数据集
  TEZNKK3IfmPf 2023年11月14日 20 0

首先训练文本train_text.txt文件内容如下:

优惠的政策和政府对产业发展的重视也吸引了更多医美企业来成都寻觅机遇。2018年成都医美机构的数量一度飙升至407家,较之前一年激增131家
中国医学科学院整形外科医院也选择于2018年将首家京外分院——成都八大处医疗美容医院落地蓉城。不断增长的营收数据没有让人失望
成都八大处医疗美容医院院长唐勇告诉记者,在因新冠肺炎疫情停业近40天的情况下,该院2020年的营收相比2019年仍实现了约30%的增长
成都打造‘医美之都’的过程中,优惠的政策、聚合的资源、配套的宣传措施等为医美行业造起了‘势’,对行业发展起到积极的推动作用,城市产业氛围十分友好
实际上,随着“颜值经济”不断走热,医美逐渐成为部分当代中国人的“刚需”,其中恢复期短、风险较低的轻医美最受欢迎
出于对安全性、可靠性等因素的考虑,大量消费者自然而然地流动到医美资源集聚的城市“求美”,“医美旅游”悄然兴起
成都头部医美机构之一、四川华美紫馨医学美容医院2020年整体营收约6亿元。该院总经理薛红介绍,医院每年治疗人数中约20%都是专程前来的外地消费者
尤其最近几年,这部分消费者数量增长很快,来自甘肃、青海、云南、贵州等各个省份的都有

1. 训练word2vec模型

直接上代码,细节请参考代码内注释:

from gensim.models import Word2Vec
import multiprocessing
from torch.utils.data import IterableDataset, DataLoader
import jieba


class MyIterableDataset(IterableDataset):

    def __init__(self, file_path):
        super(MyIterableDataset, self).__init__()
        self.file_path = file_path  # 这里为文本数据的目录

    def parse_file(self):
        with open(self.file_path, 'r') as file_obj:
            for line in file_obj:
                line: list = list(jieba.cut(line))  # 直接分词
                yield line  # 这里yield返回一句分词后的结果

    def __iter__(self):
        return self.parse_file()  # 这一步非常重要,每一次迭代IterableDataset,都只会调用一次这个函数,注意这里是return


def train_word2vec(iter_data):
    model = Word2Vec(iter_data, vector_size=256, min_count=1, window=5, epochs=7,
                     workers=multiprocessing.cpu_count())  # 参数这个自己设置吧
    # model.save("word2vec_model.bin") # 保存模型
    # word2vec_model.wv.index_to_key[2] -> tuple
    return model


if __name__ == '__main__':
    dataset = MyIterableDataset('train_text.txt')
    dataloader = DataLoader(dataset)
    word2vec_model = train_word2vec(dataloader)  # 这个是训练完成的model
    # 但是我们看word2vec_model.wv.key_to_index,可以看到key是dict的形式,接下来我们把dict转为正常的字符串即可
    word2vec_model.save("word2vec_model.bin")

2. word2vec模型将key中的dict转为str

新建一个文件,然后代码如下:

from gensim.models import Word2Vec
from tqdm import tqdm
from gensim import utils
from numpy import float32 as REAL
import gensim


def word2vec_to_dict(word2vec_model) -> dict:
    word2vec_dict = {
     
       }
    for index in tqdm(word2vec_model.wv.index_to_key):
        key = index[0]
        value = word2vec_model.wv.get_vector(index)
        word2vec_dict[key] = value
    return word2vec_dict


def my_save_word2vec_format(save_file_name, word2veckeyedVector, binary=True):
    total_vec = len(word2veckeyedVector.index_to_key)  # 全部的单词数
    with utils.open(save_file_name, 'wb') as fout:
        print(total_vec, word2veckeyedVector.vector_size)
        fout.write(utils.to_utf8("%s %s\n" % (total_vec, word2veckeyedVector.vector_size)))
        # store in sorted order: most frequent words at the top
        for key in word2veckeyedVector.index_to_key:
            value = word2veckeyedVector.get_vector(key)
            if binary:
                value = value.astype(REAL)
                fout.write(utils.to_utf8(key) + b" " + value.tobytes())
            else:
                fout.write(utils.to_utf8("%s %s\n" % (key, ' '.join(repr(val) for val in value))))


if __name__ == '__main__':
    word2vec_model: Word2Vec = Word2Vec.load('word2vec_model.bin')  # 读取模型
    d = word2vec_to_dict(word2vec_model)  # 得到词库每个词的embedding

    m = gensim.models.keyedvectors.Word2VecKeyedVectors(vector_size=256)
    m.add_vectors(list(d.keys()), list(d.values()))
    my_save_word2vec_format(save_file_name='word2vec_format.txt', word2veckeyedVector=m)
    # 测试一下
    my_test_model = Word2Vec().wv.load_word2vec_format('word2vec_format.txt', binary=True) # 这一行读取模型
    print("相似度计算:", my_test_model.most_similar(['优惠', '成都']))
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   30   0   0 python开发语言
  TEZNKK3IfmPf   2024年05月31日   24   0   0 python
  TEZNKK3IfmPf   2024年05月31日   33   0   0 excelpython
  TEZNKK3IfmPf   2024年05月31日   22   0   0 python
TEZNKK3IfmPf