练习word2vec和torch包做文本向量化

导包

import jieba
with open("NBA新闻.txt", "r", encoding="utf-8") as file_in:
    with open("text_corpus.txt", "w", encoding="utf-8") as file_out:
        row = file_in.readline()
        while row:
            jieba.load_userdict('dict.txt')
            word = jieba.cut(row,cut_all=False)
            words = ' '.join(word)+"\n"
            file_out.write(words)
            row = file_in.readline()

Word2Vec文本向量化

from gensim.models import Word2Vec  
from gensim.models.word2vec import LineSentence  
import logging

# 配置日志,避免训练过程中的警告信息
# logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

# 假设我们有一个名为'text_corpus.txt'的文本文件,每行包含一个句子,句子中的单词由空格分隔
# sentences = LineSentence('ext_corpus.txt')  # 加载文本数据

# 训练Word2Vec模型
# 参数可以根据你的数据和需求进行调整
#参数如vector_size(向量维度)、window(上下文窗口大小)、min_count(最小词频)和workers(工作线程数)都可以根据你的数据集和需求进行调整
# model = Word2Vec(sentences, vector_size=100, window=15, min_count=1, workers=4)

# 保存模型,以便后续使用
# model.save("word2vec.model")

# 加载已保存的模型
model = Word2Vec.load("word2vec.model")

# 查找单词的向量表示
# vector = model.wv['丹佛掘金']  # 假设'apple'在我们的词汇表中
# print(len(vector))
# print(vector)

# 查找最相似的单词
similar_words = model.wv.most_similar('领导')
print(similar_words)

torch文本向量化

import torch  
import torch.nn as nn  
import torch.optim as optim  

# 超参数  
vocab_size = 10000  # 词汇表大小  
embedding_dim = 50  # 嵌入维度  
output_dim = 2      # 输出维度(例如,二分类任务)  
num_epochs = 5      # 训练轮数  
batch_size = 64     # 批处理大小  
learning_rate = 0.001 # 学习率  
  
# 模拟文本数据(实际中你会从文本数据集中获取这些索引)  
# 这里我们随机生成一些单词索引作为示例  
text_indices = torch.randint(0, vocab_size, (batch_size, 10))  # (batch_size, sequence_length)  
  
# 标签数据(随机生成)  
labels = torch.randint(0, output_dim, (batch_size,))  
  
# 定义模型  
class SimpleEmbeddingModel(nn.Module):  
    def __init__(self, vocab_size, embedding_dim, output_dim):  
        super(SimpleEmbeddingModel, self).__init__()  
        self.embedding = nn.Embedding(vocab_size, embedding_dim)  
        self.fc = nn.Linear(embedding_dim, output_dim)  
  
    def forward(self, text_indices):  
        # 取文本序列中最后一个单词的嵌入(简化的例子)  
        embedded = self.embedding(text_indices)[:, -1, :]  
        output = self.fc(embedded)  
        return output  
  
# 实例化模型  
model = SimpleEmbeddingModel(vocab_size, embedding_dim, output_dim)  
  
# 定义损失函数和优化器  
criterion = nn.CrossEntropyLoss()  
optimizer = optim.SGD(model.parameters(), lr=learning_rate)  
  
# 训练模型  
for epoch in range(num_epochs):  
    # 前向传播  
    outputs = model(text_indices)  
    loss = criterion(outputs, labels)  
  
    # 反向传播和优化  
    optimizer.zero_grad()  
    loss.backward()  
    optimizer.step()  
  
    # 打印统计信息  
    if (epoch+1) % 1 == 0:  
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}')  
  
# 训练完成后,你可以通过调用model.embedding来获取嵌入层  
# 例如,查询索引为5的单词的嵌入向量  
embedding_vector = model.embedding(torch.tensor([5], dtype=torch.long))  
print(embedding_vector)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 PyTorch 实现 Word2Vec 的基本步骤: 1. 数据预处理:将原始文本数据转换为神经网络可以理解的形式。可以使用 NLTK 等自然语言处理库来进行分词、去停用词等操作。 2. 构建神经网络模型:Word2Vec 通常使用两种架构模型:CBOW(Continuous Bag of Words)和 Skip-gram。CBOW 模型从上下文中预测中心词,Skip-gram 模型从中心词预测上下文。这里以 Skip-gram 为例。 3. 定义损失函数:Word2Vec 的目标是最大化词向量之间的相似度,可以使用 softmax 函数和交叉熵作为损失函数。 4. 训练模型:使用反向传播算法和随机梯度下降法来更新模型的参数,使得损失函数最小化。 下面是一个简单的 PyTorch 实现代码: ``` import torch import torch.nn as nn import torch.optim as optim class SkipGram(nn.Module): def __init__(self, vocab_size, embedding_dim): super(SkipGram, self).__init__() self.embeddings = nn.Embedding(vocab_size, embedding_dim) self.linear = nn.Linear(embedding_dim, vocab_size) def forward(self, center_word): center_embed = self.embeddings(center_word) out = self.linear(center_embed) log_probs = nn.functional.log_softmax(out, dim=1) return log_probs # 定义数据和超参数 data = ['I', 'love', 'NLP', 'and', 'deep', 'learning'] vocab_size = len(set(data)) embedding_dim = 10 batch_size = 1 learning_rate = 0.001 # 定义模型、损失函数和优化器 model = SkipGram(vocab_size, embedding_dim) criterion = nn.NLLLoss() optimizer = optim.SGD(model.parameters(), lr=learning_rate) # 训练模型 for epoch in range(100): for i in range(len(data)): center_word = torch.tensor([i]) log_probs = model(center_word) loss = criterion(log_probs, torch.tensor([i])) optimizer.zero_grad() loss.backward() optimizer.step() # 获取词向量 word_embeddings = model.embeddings.weight.detach().numpy() ``` 这个实现很简单,只能处理单个词语,处理文本需要使用更复杂的方法。需要注意的是,Word2Vec 训练需要大量的数据和计算资源,特别是在大规模语料库上训练时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值