fastText1
Install
如果直接用 pip install fasttext
会报一堆错误,所以用以下方法安装:
1 | git clone https://github.com/facebookresearch/fastText.git |
这样安装后会出现在powershell中可以import fasttext
,但在Anaconda Prompt中或者pycharm中无法import的问题。报错:ImportError:DLL load failed
解决方案是conda中activate 另一个环境,pip install fasttext
,这时会发现base中已经安装好了,不用重新下载,直接安装,发现是可以的。
之后回到base,pip uninstall fasttext
, 再重新 pip install fasttext
根据新环境中已经安装好的包,重新安装。
fastText2
fastText model
1 | class Model(nn.Module): |
nn.Embedding, 可以看做一个字典,字典中每个索引对应一个词和词的embedding形式。利用这个模块,可以给词做embedding的初始化操作。 padding_idx 如果给定,则遇到padding_idx中的索引,则将其位置填0(0是默认值)。
其中 config.n_gram_vocab会在运行过程中赋值,config.n_vocab = len(vocab),config.n_gram_vocab = 250499
模型输入: [batch_size, seq_len]
embedding层:随机初始化, 词向量维度为embed_size,2-gram和3-gram同理:
word: [batch_size, seq_len, embed_size]
2-gram:[batch_size, seq_len, embed_size]
3-gram:[batch_size, seq_len, embed_size]拼接embedding层:
[batch_size, seq_len, embed_size * 3]求所有seq_len个词的均值
[batch_size, embed_size * 3]全连接+非线性激活:隐层大小hidden_size
[batch_size, hidden_size]全连接+softmax归一化:
[batch_size, num_class]==>[batch_size, 1]
build_dataset
1 | build_dataset |
如果路径有词表,直接加载,如果没有则生成词表。
1 | def build_vocab(file_path, tokenizer, max_size, min_freq): |
生成的词表按照词频降序排列,从0开始赋值,eg:{‘市民’: 0, ‘反映’: 1, ‘问题’: 2, ‘来电’: 3, ‘希望’: 4}
最后添加 UNK, PAD = ‘\self.embedding = nn.Embedding(config.n_vocab, config.embed, padding_idx=config.n_vocab - 1)
,padding_idx=config.n_vocab - 1表示当遇到\
1 | build_dataset |
load_dataset: 首先对于数据集的每一行操作,根据’\t’分割content和标签,label = label.replace('"', "")
是因为某些分割后的标签后会出现一个引号,原因还不明白。之后根据pad_size少补多截,seq_len表示内容的词数(如果超过pad_size则为pad_size,如果小于则为实际长度)
words_line储存该句所有单词的编号,如果找不到则为UNK。
14918087这些数字,就是用几个质数做的简单的哈希函数,可以修改,目的就是把所有n-gram都映射到一个词表中。
最后训练时通过 words_line,bigram,trigram找到对应在词表embedding、2gram embedding、3gram embedding中的位置,进行平均
DatasetIterater
1 | iter = DatasetIterater(dataset, config.batch_size, config.device) |
1 | class DatasetIterater(object): |