本文为🔗365天深度学习训练营内部文章
原作者:K同学啊
本次将加入Word2vec使用PyTorch实现中文文本分类,Word2Vec 则是其中的一种词嵌入方法,是一种用于生成词向量的浅层神经网络模型,由Tomas Mikolov及其团队于2013年提出。Word2Vec通过学习大量文本数据,将每个单词表示为一个连续的向量,这些向量可以捕捉单词之间的语义和句法关系。数据示例如下:
1.加载数据
import time
import pandas as pd
import torch
from torch.utils.data import DataLoader, random_split
import torch.nn as nn
import torchvision
from torchtext.data import to_map_style_dataset
from torchvision import transforms,datasets
from torchtext.data.utils import get_tokenizer
from torchtext.vocab import build_vocab_from_iterator
from gensim.models.word2vec import Word2Vec
import numpy as np
import jieba
import warnings
warnings.filterwarnings('ignore')
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
'''
加载本地数据
'''
train_data = pd.read_csv('train.csv',sep='\t',header=None)
print(train_data.head())
# 构建数据集迭代器
def coustom_data_iter(texts,labels):
for x,y in zip(texts,labels):
yield x,y
x = train_data[0].values[:]
y = train_data[1].values[:]
zip 是 Python 中的一个内置函数,它可以将多个序列(列表、元组等)中对应的元素打包,成一个个元组,然后返回这些元组组成的一个迭代器。例如,在代码中 zip(texts,labels)就是将 texts 和labels 两个列表中对应位置的元素一一打包,成元组,返回一个迭代器,每次迭代返回一个元组(x,y)其中x是 texts 中的一个元素,y是 labels 中对应的一个元素。这样,每次从迭代器中获取一个元素,就相当于从 texts 和 labels 中获取了一组对应的数据。在这里,zip 函数主要用于将输入的 texts 和labels打包成一个可迭代的数据集,然后传给后续的模型训练过程使用。
2.数据预处理
1)构建词典
# 1.构建词典
# 训练 Word2Vec 浅层神经网络模型
w2v = Word2Vec(vector_size=100, # 是指特征向量的维度,默认为100
min_count=3) # 可以对字典做截断,词频少于min_count次数的单词会被丢弃掉,默认为5
w2v.build_vocab(x)
w2v.train(x,total_examples=w2v.corpus_count,epochs=20)
Word2Vec可以直接训练模型,一步到位。这里分了三步 第一步构建一个空模型 第二步使用 build_vocab 方法根据输入的文本数据x构建词典。build_vocab 方法会统计输入文本中每个词汇出现的次数,并按照词频从高到低的顺序将词汇加入词典中。 第三步使用 train 方法对模型进行训练,total_examples 参数指定了训练时使用的文本数量,这里使用的是 w2v.corpus_count 属性,表示输入文本的数量
# 将文本转化为向量
def average_vec(text):
vec = np.zeros(100).reshape((1,100))
for word in text: