word2vec训练与相似度计算

  • 中文语料预处理

采用维基百科里的中文网页作为训练语料库,下载地址为:https://dumps.wikipedia.org/zhwiki/20190301/zhwiki-20190301-pages-articles.xml.bz2

维基百科提供的语料是xml格式的,因此需要将其转换为txt格式。由于维基百科中有很多是繁体中文网页,故需要将这些繁体字转换为简体字。另外,在用语料库训练词向量之前需要对中文句子进行分词,这里采用Jieba中文分词工具对句子进行分词。

from gensim.corpora import WikiCorpus
import jieba
from opencc import OpenCC

opencc = OpenCC('t2s')


def preprocess():
    space = ' '
    i = 0
    l = []
    zhwiki_name = './data/zhwiki-20190301-pages-articles.xml.bz2'
    with open('./data/reduce_zhiwiki.txt', 'w') as f:  # xml转换为txt
        wiki = WikiCorpus(zhwiki_name, lemmatize=False, dictionary={})  # 读取训练语料
        for text in wiki.get_texts():  # 文本
            for temp_sentence in text:  # 段落
                temp_sentence = opencc.convert(temp_sentence)  # 繁体转简体
                seg_list = list(jieba.cut(temp_sentence))  # 分词
                for temp_term in seg_list:
                    l.append(temp_term)  # 组合成列表
            f.write(space.join(l) + '\n')  # 写入txt文件
            l = []
            i = i + 1

            if i % 200 == 0:
                print('Saved ' + str(i) + ' articles')


if __name__ == '__main__':
    import time
    before = time.time()
    preprocess()
    after = time.time()
    print(str((after - before) / 60) + ' minutes')

处理后的语料如图:

word2vec训练与相似度计算_第1张图片

  • 向量化训练

利用gensim模块训练词向量,Word2Vec函数的参数如下:

# sg=0:使用CBOW模型训练词向量
# sg=1:使用skip-gram训练词向量
# size:词向量维度
# windows:当前词和预测词可能的最大距离
# min_count:最小出现次数,如果一个词出现的次数小于min_count,直接忽略该词
# workers:训练词向量时使用的线程数
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence


def train():
    wiki_news = open('./data/reduce_zhiwiki.txt', 'r')
    model = Word2Vec(LineSentence(wiki_news), sg=0, size=192, window=5, min_count=5, workers=8)  # 训练词向量
    model.save('zhiwiki_news.word2vec')


if __name__ == '__main__':
    train()

训练好的词向量存在下列文件中:

word2vec训练与相似度计算_第2张图片

  • 计算词语的相似度

# coding=utf-8
import gensim


def simularity():

    model = gensim.models.Word2Vec.load('./data/zhiwiki_news.word2vec')
    print(model.similarity('数据', '人工智能'))  # 相似度为0.29
    print(model.similarity('滴滴', '摩拜'))  # 相似度为0.39

    word = '北航'
    if word in model.wv.index2word:
        print(model.most_similar(word))  # 最相近的词


if __name__ == '__main__':
    simularity()

得到数据与人工智能的相似度为0.29,滴滴与摩拜的相似度为0.39,与北航最相近的词有:

[('天津大学', 0.708594799041748), ('哈工大', 0.7071467638015747), ('同济大学', 0.6879477500915527), ('浙大', 0.6827788949012756), ('湖南大学', 0.6754754185676575), ('水利系', 0.6699927449226379), ('深圳大学', 0.6659466624259949), ('西北工业大学', 0.6655755043029785), ('北京航空航天大学', 0.6644810438156128), ('上海大学', 0.663300633430481)]

 

你可能感兴趣的:(NLP)