vocab 文本_如何以最佳方式处理word2vec的vocab中没有的单词

我有一个大约1000万个句子的列表,每个句子最多包含70个单词。在

我对每个单词运行gensim word2vec,然后计算每个句子的简单平均值。问题是我使用min_count=1000,所以很多单词不在vocab中。在

为了解决这个问题,我将vocab数组(包含大约10000个单词)与每个句子相交,如果这个交集中至少还有一个元素,它将返回它的简单平均值,否则,它将返回一个零向量。在

问题是,当我在整个数据集上运行平均值时,计算每个平均值都要花费很长的时间,即使是拆分为多个线程,我希望得到一个运行速度更快的更好的解决方案。在

我在ec2r4.4xlarge实例上运行这个。在

我已经尝试过切换到doc2vec,这要快得多,但是结果不如word2vec的简单平均值。在word2vec_aug_32x = Word2Vec(sentences=sentences,

min_count=1000,

size=32,

window=2,

workers=16,

sg=0)

vocab_arr = np.array(list(word2vec_aug_32x.wv.vocab.keys()))

def get_embedded_average(sentence):

sentence = np.intersect1d(sentence, vocab_arr)

if sentence.shape[0] > 0:

return np.mean(word2vec_aug_32x[sentence], axis=0).tolist()

else:

return np.zeros(32).tolist()

pool = multiprocessing.Pool(processes=16)

w2v_averages = np.asarray(pool.map(get_embedded_average, np.asarray(sentences)))

pool.close()

如果你有什么不同的算法或技术的建议,有相同的目的,句子嵌入,并能解决我的问题,我很乐意阅读。在

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Word2vec是一种在自然语言处理广泛使用的技术,它可以将单词映射到向量空间,从而可以更好地处理文本数据。在文本分类任务,我们可以使用Word2vec来将文本数据转换为向量表示,从而更好地进行分类。 下面是一个使用PyTorch实现Word2vec处理文本分类的示例代码: ```python import torch import torch.nn as nn import torch.optim as optim import numpy as np from collections import Counter #定义Word2Vec模型 class Word2Vec(nn.Module): def __init__(self, vocab_size, embedding_dim): super(Word2Vec, self).__init__() self.embedding = nn.Embedding(vocab_size, embedding_dim) self.linear1 = nn.Linear(embedding_dim, 128) self.linear2 = nn.Linear(128, vocab_size) def forward(self, x): x = self.embedding(x) x = torch.mean(x, dim=1) x = nn.functional.relu(self.linear1(x)) x = self.linear2(x) return x #定义数据预处理函数 def preprocess(text): words = text.lower().split() word_counts = Counter(words) sorted_vocab = sorted(word_counts, key=word_counts.get, reverse=True) int_to_vocab = {k: w for k, w in enumerate(sorted_vocab)} vocab_to_int = {w: k for k, w in int_to_vocab.items()} int_words = [vocab_to_int[w] for w in words] return int_words, vocab_to_int, int_to_vocab #定义训练函数 def train(model, optimizer, criterion, data): for i in range(0, len(data), batch_size): inputs = np.array(data[i:i+batch_size]) inputs = torch.from_numpy(inputs) targets = inputs.clone().detach() optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, targets) loss.backward() optimizer.step() #定义测试函数 def test(model, vocab_to_int, int_to_vocab, test_word): test_word_id = vocab_to_int[test_word] test_word_tensor = torch.from_numpy(np.array([test_word_id])) model.eval() with torch.no_grad(): test_word_vector = model.embedding(test_word_tensor) similarities = [] for i in range(len(vocab_to_int)): if i != test_word_id: word_tensor = torch.from_numpy(np.array([i])) with torch.no_grad(): word_vector = model.embedding(word_tensor) similarity = torch.cosine_similarity(test_word_vector, word_vector) similarities.append((int_to_vocab[i], similarity.item())) similarities.sort(key=lambda x: x[1], reverse=True) for word, sim in similarities[:10]: print(word, sim) #定义参数和数据 text = "Natural language processing is a subfield of linguistics, computer science, and artificial intelligence concerned with the interactions between computers and human language." embedding_dim = 300 batch_size = 64 epochs = 100 lr = 0.001 data, vocab_to_int, int_to_vocab = preprocess(text) vocab_size = len(int_to_vocab) model = Word2Vec(vocab_size, embedding_dim) optimizer = optim.Adam(model.parameters(), lr=lr) criterion = nn.CrossEntropyLoss() #训练模型 for epoch in range(epochs): train(model, optimizer, criterion, data) print("Epoch: {} / {}...".format(epoch+1, epochs)) #测试模型 test_word = "processing" test(model, vocab_to_int, int_to_vocab, test_word) ``` 在这个示例,我们首先定义了一个Word2Vec模型,它包括一个嵌入层、一个线性层和一个ReLU激活函数。然后我们定义了一个数据预处理函数,它将原始文本转换为数字列表,并生成一些辅助的词汇表。接下来我们定义了一个训练函数,它将数据分成小批量,对模型进行训练。最后,我们定义了一个测试函数,它使用余弦相似度比较某个单词与词汇表的其他单词之间的相似度,并打印出最相似的10个单词。 在这个示例,我们使用了一个简单的文本数据,并对其进行了训练和测试。如果你想处理更大的数据集,你可以将代码稍微修改一下,例如使用数据加载器来加载数据,或者使用更复杂的模型来获得更好的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值