zoukankan      html  css  js  c++  java
  • 文本分布式表示(三):用gensim训练word2vec词向量

    今天参考网上的博客,用gensim训练了word2vec词向量。训练的语料是著名科幻小说《三体》,这部小说我一直没有看,所以这次拿来折腾一下。

    《三体》这本小说里有不少人名和一些特殊名词,我从网上搜了一些,作为字典,加入到jieba里,以提高分词的准确性。

    一、gensim中关于word2vec的参数说明

    这一部分其他博客整理的比较清楚了,我也就不抄过来了。看这个链接:

    https://www.cnblogs.com/pinard/p/7278324.html 

    二、gensim训练word2vec词向量

    (一)第一步:jieba加载自定义词典

    词典是每个词单独一行,然后加入的时候,要注意把换行符去掉:word.strip(),不然你会惊奇地发现我的词典加进去了怎么没效果呢?

    #encoding=utf8
    import jieba
    from gensim.models import word2vec
    import gensim
    
    # 第一步:加入字典
    def add_dict():
        f = open('./text/special_nouns.txt','r', encoding='utf-8')
        for word in f:
            jieba.suggest_freq(word.strip(),tune=True)
        f.close()
        
    add_dict()

    (二)第二步:读取小说文本,进行分词,并保存分词结果

    一般小说下载下来,文档的原始编码格式不是 UTF-8,而是 GBK,所以要进行编码转换。看其他博客转来转去比较麻烦,我是没转成功。。。然后我就直接把文档另存为 UTF-8 格式了。

    jieba分完词后,要把结果用空格 ' ' 符号连接起来:' '.join(jieba.cut(document)), 词语之间用空格隔开,这才是正确的输入格式。 

    #  第二步:读取三体小说的文本,并进行分词
    def document_segment(filename):
        f = open(filename, 'r',encoding='utf-8')
        document = f.read()
        document_cut = ' '.join(jieba.cut(document))      
        with open('./text/The_three_body_problem_segment.txt','w',encoding='utf-8') as f2:
            f2.write(document_cut)     # 
        f.close()
        f2.close()
        
    document_segment('./text/The_three_body_problem.txt')

    (三)第三步:用CBOW模型训练词向量

    LineSentence这个方法把传入的文件转化为一个迭代器,这个文件需要是每一行就是一个句子,每个句子中的词之间用空格隔开。

    word2vec 相关的参数都在包word2vec.Word2Vec中,sg=0表示用CBOW模型来训练,hs=1表示加速方法为层次softmax,min_count=1表示词的词频低于1就会被丢弃,实际上没丢弃任何词语。

    windows=3 表示滑动窗口为3,上下文词各取1个。size=100表示词向量维度是100。

    之所以这么设置是因为这个语料比较小。

    def train_w2v(filename):
        
        text = word2vec.LineSentence(filename)
        model = word2vec.Word2Vec(text, sg=0,hs=1,min_count=1,window=3,size=100)
        model.save('./my_model')
        
    train_w2v('./text/The_three_body_problem_segment.txt')

    (四)第四步:导入模型,简单应用

    导入保存好的模型后,一个是根据词把相应的词向量取出来,可以看到,取了三个词的词向量,所以词向量矩阵为3*100维。

    然后是计算两个词之间的相似度。再就是得到和某个词比较相关的词的列表。

    # 导入保存好的模型
    model = word2vec.Word2Vec.load('./my_model')
    
    # 取出词语对应的词向量。
    vec = model[['红岸','水滴','思想钢印']]
    print('三个词的词向量矩阵的维度是:', vec.shape,'')
    print('-------------------------------我是分隔符------------------------')
    # 计算两个词的相似程度。
    print('叶文洁和红岸的余弦相似度是:', model.similarity('叶文洁', '红岸'),'')
    print('-------------------------------我是分隔符------------------------')
    # 得到和某个词比较相关的词的列表
    sim1 = model.most_similar('叶文洁',topn=10)
    for key in sim1:
        print('和叶文洁比较相关的词有',key[0],',余弦距离是:',key[1])
    三个词的词向量矩阵的维度是: (3, 100) 。
    -------------------------------我是分隔符------------------------
    叶文洁和红岸的余弦相似度是: 0.27795327-------------------------------我是分隔符------------------------
    和叶文洁比较相关的词有 章北海 ,余弦距离是: 0.9233694672584534
    和叶文洁比较相关的词有 他 ,余弦距离是: 0.9116515517234802
    和叶文洁比较相关的词有 罗辑 ,余弦距离是: 0.9056273698806763
    和叶文洁比较相关的词有 汪淼 ,余弦距离是: 0.8981802463531494
    和叶文洁比较相关的词有 吴岳 ,余弦距离是: 0.8976055979728699
    和叶文洁比较相关的词有 她 ,余弦距离是: 0.893031895160675
    和叶文洁比较相关的词有 程心 ,余弦距离是: 0.8800253868103027
    和叶文洁比较相关的词有 丁仪 ,余弦距离是: 0.8800160884857178
    和叶文洁比较相关的词有 云天明 ,余弦距离是: 0.8763566613197327
    和叶文洁比较相关的词有 她们 ,余弦距离是: 0.875525712966919
  • 相关阅读:
    CSUOJ 1525 Algebraic Teamwork
    CSUOJ 1531 Jewelry Exhibition
    CSUOJ 1532 JuQueen
    POJ 2195 Going Home
    hiho week 37 P1 : 二分·二分查找之k小数
    POJ 2186 Popular Cows
    ZOJ 2532 Internship
    RQNOJ PID496/[IOI1999]花店橱窗布置
    POJ 3026 Borg Maze
    laravel框架总结(五) -- 服务提供者(提及契约Contracts)
  • 原文地址:https://www.cnblogs.com/Luv-GEM/p/10615461.html
Copyright © 2011-2022 走看看