tensor版CBOW

小小技能

1

key = ['a','b','c']
value = [1,2,3]

vocab = dict(zip(key,value))
print(vocab)

运行效果:

{'a': 1, 'b': 2, 'c': 3}

2

key = ['a','b','c']

vocab = dict(zip(key,range(3)))
print(vocab)

运行效果:

{'a': 0, 'b': 1, 'c': 2}

读语料

all_word = []
with open('./enwik9_text','r') as f:
    for line in f.readlines():
        all_word.extend(line.strip().split(' '))
print(len(all_word))
print(all_word[0:10])

words = list(set(all_word))
words.sort()
print(len(words))
print(words[0:100])

运行效果:

124301826
['anarchism', 'originated', 'as', 'a', 'term', 'of', 'abuse', 'first', 'used', 'against']
833184
['a', 'aa', 'aaa', 'aaaa', 'aaaaa', 'aaaaaa', 'aaaaaaa', 'aaaaaaaa', 'aaaaaaaaa', 'aaaaaaaaaaa', 'aaaaaaaaaaaa', 'aaaaaaaaaaaaaaarg', 'aaaaaaaaaaaaahhhhhhhh', 'aaaaaaaaaah', 'aaaaaaaaab', 'aaaaaaaaaghghhgh', 'aaaaaacceglllnorst', 'aaaaaaccegllnorrst', 'aaaaaad', 'aaaaaaf', 'aaaaaah', 'aaaaaalmrsstt', 'aaaaaannrstyy', 'aaaaabbcdrr', 'aaaaaction', 'aaaaae', 'aaaaaf', 'aaaaahh', 'aaaaand', 'aaaaanndd', 'aaaaargh', 'aaaab', 'aaaabb', 'aaaabbbbccc', 'aaaabbbbccccddddeeeeffff', 'aaaabbbbccccddddeeeeffffgggg', 'aaaad', 'aaaae', 'aaaaf', 'aaaah', 'aaaahnkuttie', 'aaaar', 'aaaargh', 'aaaassembly', 'aaaatataca', 'aaaax', 'aaaay', 'aaab', 'aaaba', 'aaabb', 'aaabbbccc', 'aaac', 'aaad', 'aaadietya', 'aaae', 'aaaeealqoff', 'aaaf', 'aaagaaaaaa', 'aaagaattat', 'aaagctactc', 'aaaggacggu', 'aaagh', 'aaah', 'aaahh', 'aaahs', 'aaai', 'aaaimh', 'aaajj', 'aaake', 'aaalac', 'aaam', 'aaamazzarites', 'aaan', 'aaargh', 'aaarm', 'aaarrr', 'aaas', 'aaasthana', 'aaate', 'aaathwan', 'aaavs', 'aaay', 'aab', 'aaba', 'aabaa', 'aabab', 'aababb', 'aabach', 'aabb', 'aabba', 'aabbb', 'aabbcc', 'aabbirem', 'aabbs', 'aabbtrees', 'aabc', 'aabdul', 'aabebwuvev', 'aabehlpt', 'aabel']

语料总字数 124301826 跟 fasttext是一样的

fasttext构建的词典有:218316个不重复的word (token)

我们这里用set得到的是833184个不重复的word (token),根据上面打印的信息来看,fasttext去除了614868没有意义的word

去除无意义单词

enchant库-67406

参考:https://blog.csdn.net/hpulfc/article/details/80997252

1.安装包

pip install pyenchant
import enchant

words = ['a', 'aa', 'aaa', 'aaaa', 'aaaaa', 'aaaaaa', 'aaaaaaa', 'aaaaaaaa', 'aaaaaaaaa', 'aaaaaaaaaaa', 'aaaaaaaaaaaa', 'aaaaaaaaaaaaaaarg', 'aaaaaaaaaaaaahhhhhhhh', 'aaaaaaaaaah', 'aaaaaaaaab', 'aaaaaaaaaghghhgh', 'aaaaaacceglllnorst', 'aaaaaaccegllnorrst', 'aaaaaad', 'aaaaaaf', 'aaaaaah', 'aaaaaalmrsstt', 'aaaaaannrstyy', 'aaaaabbcdrr', 'aaaaaction', 'aaaaae', 'aaaaaf', 'aaaaahh', 'aaaaand', 'aaaaanndd', 'aaaaargh', 'aaaab', 'aaaabb', 'aaaabbbbccc', 'aaaabbbbccccddddeeeeffff', 'aaaabbbbccccddddeeeeffffgggg', 'aaaad', 'aaaae', 'aaaaf', 'aaaah', 'aaaahnkuttie', 'aaaar', 'aaaargh', 'aaaassembly', 'aaaatataca', 'aaaax', 'aaaay', 'aaab', 'aaaba', 'aaabb', 'aaabbbccc', 'aaac', 'aaad', 'aaadietya', 'aaae', 'aaaeealqoff', 'aaaf', 'aaagaaaaaa', 'aaagaattat', 'aaagctactc', 'aaaggacggu', 'aaagh', 'aaah', 'aaahh', 'aaahs', 'aaai', 'aaaimh', 'aaajj', 'aaake', 'aaalac', 'aaam', 'aaamazzarites', 'aaan', 'aaargh', 'aaarm', 'aaarrr', 'aaas', 'aaasthana', 'aaate', 'aaathwan', 'aaavs', 'aaay', 'aab', 'aaba', 'aabaa', 'aabab', 'aababb', 'aabach', 'aabb', 'aabba', 'aabbb', 'aabbcc', 'aabbirem', 'aabbs', 'aabbtrees', 'aabc', 'aabdul', 'aabebwuvev', 'aabehlpt', 'aabel']

d = enchant.Dict('en_US')
for word in words:
    if d.check(word): 
        print(word)

运行此代码会有一个报错: 

报错参考:https://installati.one/install-enchant-ubuntu-20-04/

ImportError: The 'enchant' C library was not found and maybe needs to be installed.

安装包 :

sudo apt install enchant

再次运行代码:

import enchant

words = ['a', 'aa', 'aaa', 'aaaa', 'aaaaa',
### CBOW模型的基本概念与原理 连续词袋模型(Continuous Bag-of-Words Model,简称CBOW)是word2vec中的一种重要模型,用于生成单词的分布式表示。该模型的核心思想是通过上下文预测目标词,即利用一个固定大小的上下文窗口中的多个上下文单词来预测当前的目标单词。这种预测过程使得模型能够学习到词语之间的语义关系,并将这些信息编码为低维、稠密的向量形式。 在CBOW模型中,输入层接收的是上下文单词的one-hot编码表示。这些one-hot向量经过嵌入矩阵映射后,得到对应的词向量。接着,隐藏层对所有上下文单词的词向量进行平均操作,从而得到一个统一的上下文向量。这个上下文向量随后被传递给输出层,在那里它通过一个softmax函数来计算每个可能的目标词出现的概率分布。最终,具有最高概率的词被视为模型的预测结果。[^4] CBOW模型的一个关键优势在于它可以将自然语言转化为固定长度的向量,这为后续使用常规机器学习方法提供了便利。例如,可以将这些词向量作为特征输入到其他机器学习系统(如支持向量机SVM或神经网络等),以完成特定任务,比如文本分类和情感分析等实际场景中的应用。[^1] 通过这种方式,整个大系统由两部分组成:一部分负责生成单词的分布式表示(即word2vec),另一部分则专注于解决具体问题(如情感分类的SVM)。 值得注意的是,尽管CBOW模型能够有效地捕捉词汇间的共现模式,但在实现过程中也可能会遇到一些挑战。比如,在训练过程中如果发现某个单词的词向量各个维度上的值都相同,则可能是由于初始化不当或者优化过程中梯度更新不充分所致。这种情况下的词向量确实缺乏区分度,因此需要仔细检查模型的设计与参数设置,确保每个维度都能独立地参与到学习过程中去。[^3] 为了更好地理解CBOW的工作机制,可以通过编写代码来构建简单的CBOW模型实例。以下是一个基于Python和深度学习框架PyTorch实现的基础示例: ```python import torch from torch import nn, optim from torch.utils.data import Dataset, DataLoader # 假设我们有一个简单语料库 corpus = "the quick brown fox jumps over the lazy dog".split() vocab = set(corpus) word_to_idx = {word: i for i, word in enumerate(vocab)} idx_to_word = list(vocab) # 定义超参数 EMBEDDING_DIM = 5 # 词向量维度 CONTEXT_SIZE = 2 # 上下文窗口大小 VOCAB_SIZE = len(vocab) # 创建数据集 class CBOWDataset(Dataset): def __init__(self, corpus, context_size): self.contexts = [] self.targets = [] for i in range(context_size, len(corpus) - context_size): context = [corpus[i - 2], corpus[i - 1], corpus[i + 1], corpus[i + 2]] target = corpus[i] self.contexts.append(context) self.targets.append(target) def __len__(self): return len(self.targets) def __getitem__(self, idx): context_indices = [word_to_idx[word] for word in self.contexts[idx]] target_index = word_to_idx[self.targets[idx]] return torch.tensor(context_indices), torch.tensor(target_index) dataset = CBOWDataset(corpus, CONTEXT_SIZE) dataloader = DataLoader(dataset, batch_size=8, shuffle=True) # 定义CBOW模型 class CBOW(nn.Module): def __init__(self, vocab_size, embedding_dim, context_size): super(CBOW, self).__init__() self.embeddings = nn.Embedding(vocab_size, embedding_dim) self.linear1 = nn.Linear(context_size * embedding_dim, 128) self.linear2 = nn.Linear(128, vocab_size) def forward(self, inputs): embeds = self.embeddings(inputs).view((inputs.shape[0], -1)) # 将输入展平 out = torch.relu(self.linear1(embeds)) out = self.linear2(out) log_probs = torch.log_softmax(out, dim=1) return log_probs model = CBOW(VOCAB_SIZE, EMBEDDING_DIM, CONTEXT_SIZE) loss_function = nn.NLLLoss() optimizer = optim.SGD(model.parameters(), lr=0.01) # 训练模型 for epoch in range(100): # 进行多轮迭代 total_loss = 0 for contexts, targets in dataloader: model.zero_grad() log_probs = model(contexts) loss = loss_function(log_probs, targets) loss.backward() optimizer.step() total_loss += loss.item() print(f'Epoch {epoch}, Loss: {total_loss}') ``` 这段代码展示了如何从零开始创建并训练一个基础本的CBOW模型。首先定义了一个包含少量句子的小型语料库;然后根据此语料库构造了适合于CBOW训练的数据集类;接着实现了CBOW模型本身以及相应的损失函数和优化器;最后执行了训练循环,每一轮都会遍历整个数据集一次,并打印出当前周期内的总损失值。这样的实践有助于加深对CBOW模型工作原理的理解,同时也为进一步探索更复杂的自然语言处理任务打下了坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值