FastText
标签(空格分隔): 自然语言处理
FastText
FastText 论文链接
综述
FastText不是一种特殊的机构,而是一种思想,就是为了更快的求得结果。
用于文本分类的FastText(pytorch)
class FastText(BasicModule):
def __init__(self, config, vectors=None):
super(FastText, self).__init__()
self.config = config
self.embedding = nn.Embedding(config.vocab_size, config.embedding_dim)
if vectors is not None:
self.embedding.weight.data.copy_(vectors) ## 将词向量嵌入到self.embedding中去
self.pre = nn.Sequential(
## 这里相当于将原来的300维度的向量转化成600维度的
nn.Linear(config.embedding_dim, config.embedding_dim * 2),
nn.BatchNorm1d(config.embedding_dim * 2),
nn.ReLU(True)
)
self.fc = nn.Sequential(
## 这里会把600维度的向量转化成19维度,也就是通过两个线性层转化成想要的y(目标值)的维度,下面这行是第一个线性层
nn.Linear(config.embedding_dim * 2, config.linear_hidden_size),
nn.BatchNorm1d(config.linear_hidden_size),
nn.ReLU(inplace=True),
## 这里是第二个线性层
nn.Linear(config.linear_hidden_size, config.label_size)
)
def forward(self, sentence):
embed = self.embedding(sentence) # seq * batch * emb 2000 * 64 * 300 ## 这里每一个句子都是64句,每句2000个词语,所以sentence的维度是2000*64
embed_size = embed.size() ## 2000 * 64 * 300
embed.contiguous().view(-1, self.config.embedding_dim) # 128000 * 300 这里相当于把batch中的每一个句子中的每一个词都拼接起来,所以12800就是这么来的
out = self.pre(embed.contiguous().view(-1, self.config.embedding_dim)).view(embed_size[0], embed_size[1], -1)
mean_out = torch.mean(out, dim=0).squeeze() # batch * 2emb 64 * 600 ## 这里相当于对每一个2000长度的句子取平均
logit = self.fc(mean_out)
return logit