NLP:词向量Skip-gram word2vec

本文介绍了NLP中的word2vec模型,特别是Skip-gram方法,通过text8数据集进行实战。首先,文章讲解了word2vec的基本概念,然后详细阐述了数据预处理步骤,包括下载和清洗语料、切词、构建词典和ID映射。接着,通过二次采样优化数据,并构建训练数据。最后,定义了Skip-gram网络结构并进行训练,展示了训练过程和模型评估。
摘要由CSDN通过智能技术生成

简介

今天学长向大家介绍NLP基础

NLP:词向量Skip-gram word2vec

0 前言

今天,学长给大家介绍NLP中应用非常广泛的一个领域,当然这个应用已经很成熟了——文本处理,在文本处理中,其中最为核心的就是Word2vec模型,我们通过text8数据集对word2vec中的Skip-gram进行实战。

1 项目介绍

2013年,Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注。首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;其次,该工具得到的训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。随着深度学习(Deep Learning)在自然语言处理中应用的普及,很多人误以为word2vec是一种深度学习算法。其实word2vec算法的背后是一个浅层神经网络。另外需要强调的一点是,word2vec是一个计算word vector的开源工具。当我们在说word2vec算法或模型的时候,其实指的是其背后用于计算word vector的CBoW模型和Skip-gram模型。接下来我们就是通过text8数据集进行word2vec中Skip-gram实战。

2 数据集介绍

我们本次项目使用的数据集是text8数据集,这个数据集里包含了大量从维基百科收集到的英文语料,我们可以通过代码下载数据集,下载后的文件被保存在当前目录的text8.txt文件内。当然,为了防止大家网速以及各种原因下载不成功数据集,本人将数据集上传了一份在百度网盘上,大家可以自行下载[验证码:40g3]。由于该数据集特别大,我们可以通过Linux中的查看末尾几行的命令大致看一下相关的数据集内容,命令如下:

在这里插入图片描述

3 项目实现

3.1 数据预处理

首先导入必要的第三方库

import io
import os
import sys
import requests
from collections import OrderedDict 
import math
import random
import numpy as np
import paddle
import paddle.fluid as fluid
from paddle.fluid.dygraph.nn import Embedding

接下来就是数据预处理,首先,找到一个合适的语料用于训练word2vec模型。前面也说明了:我们选择text8数据集,这个数据集里包含了大量从维基百科收集到的英文语料,我们可以通过如下代码下载数据集,下载后的文件被保存在当前目录的text8.txt文件内。当然,我们也可以直接从本人给的数据集直接导入项目路径即可,具体实现如下:

#下载语料用来训练word2vec
def download():
    #可以从百度云服务器下载一些开源数据集(dataset.bj.bcebos.com)
    corpus_url = "https://dataset.bj.bcebos.com/word2vec/text8.txt"
    #使用python的requests包下载数据集到本地
    web_request = requests.get(corpus_url)
    corpus = web_request.content
    #把下载后的文件存储在当前目录的text8.txt文件内,选择自己项目所在的路径
    with open("./text8.txt", "wb") as f:
        f.write(corpus)
    f.close()
download()

接下来,把下载的语料读取到程序里,并打印前800个字符看看语料的样子,代码如下:

#读取text8数据
def load_text8():
    with open("./text8.txt", "r") as f:
        corpus = f.read().strip("\n")
    f.close()
    return corpus
corpus = load_text8()
#打印前800个字符,简要看一下这个语料的样子
print(corpus[:800])

打印效果如下:

在这里插入图片描述

一般来说,在自然语言处理中,需要先对语料进行切词。对于英文来说,可以比较简单地直接使用空格进行切词,其实也可以用第三方库nltk直接进行切分,为了让大家更好的学习这一块,因此,尽可能的自己写所对应的代码,实现如下:

#对语料进行预处理(分词)
def data_preprocess(corpus):
    #由于英文单词出现在句首的时候经常要大写,所以我们把所有英文字符都转换为小写,
    #以便对语料进行归一化处理(Apple vs apple等)
    corpus = corpus.strip().lower()
    corpus = corpus.split(" ")
    return corpus
corpus = data_preprocess(corpus)
print(corpus[:50])

打印效果如下:

在这里插入图片描述

在经过切词后,需要对语料进行统计,为每个词构造ID。一般来说,可以根据每个词在语料中出现的频次构造ID,频次越高,ID越小,便于对词典进行管理。代码如下:

#构造词典,统计每个词的频率,并根据频率将每个词转换为一个整数id
def build_dict(corpus):
    #首先统计每个不同词的频率(出现的次数),使用一个词典记录
    word_freq_dict = dict()
    for word in corpus:
        if word not in word_freq_dict:
            word_freq_dict[word] = 0
        word_freq_dict[word] += 1
    #将这个词典中的词,按照出现次数排序,出现次数越高,排序越靠前
    #一般来说,出现频率高的高频词往往是:I,the,you这种代词,而出现频率低的词,往往是一些名词,如:nlp
    word_freq_dict = sorted(word_freq_dict.items(), key = lambda x:x[1], reverse = True)    
    #构造3个不同的词典,分别存储,
    #每个词到id的映射关系:word2id_dict
    #每个id出现的频率:word2id_freq
    #每个id到词典映射关系:id2word_dict
    word2id_dict = dict()
    word2id_freq = dict()
    id2word_dict = dict()
    #按照频率,从高到低,开始遍历每个单词,并为这个单词构造一个独一无二的id
    for word, freq in word_freq_dict:
        curr_id = len(word2id_dict)
        word2id_dict[word] = curr_id
        word2id_freq[word2id_dict[word]] = freq
        id2word_dict[curr_id] = word
    return word2id_freq, word2id_dict, id2word_dict
word2id_freq, word2id_dict, id2word_dict = build_dict(corpus)
vocab_size = len<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值