FastText
ngram
fastText可以在词向量的训练和句子分类上取得非常好的表现,尤其表现在对罕见词进行字符粒度上的处理。
每个单词除了单词本身外还被表示为多个字符级别的n-grams(有时候也称为N元模子)
例如对于单词 matter.
当n=3时, fasttext对该词对字符ngram就表示为
1 | <ma, mat, att, tte, ter, er> |
其中< 和 > 是作为边界符号被添加,来将一个单词的ngrams与单词本身区分开来。
再举一个例子,如果单词mat属于我们的词汇表,则会被表示为
. 这么做刚好让一些短词以其他词的ngram出现,有助于更好的学习到这些短词的含义。
从本质上讲,这可以帮助你捕捉后缀/前缀的含义。
minn,maxn
可以通过-minn和-maxn这两个参数来控制ngrams的长度,这两个标志分别决定了ngrams的最小和最大字符数,也即控制了ngrams的范围。
这个模型被认为是一个词袋模型,因为除了用于选择n-gram的滑动窗口外,它并没有考虑对单词的内部结构进行特征选择。
它只要求字符落在窗口以内,但并不关心ngrams的顺序。
你可以将这两个值都设为0来完全关闭n-gram. 也就是不产生n-gram符号,单纯用单词作为输入.
当您的模型中的“单词”不是特定语音的单词时或者说字符级别的n-gram没有意义的时候,这会变得很有用。最常见的例子是当您将id作为您的单词输入。
在模型更新期间,fastText会学习到每个ngram以及整个单词符号的权重。
读取数据
虽然fastText的训练是多线程的,但是读取数据却是通过单线程来完成。而文本解析和分词则在读取输入数据时就被完成了。让我们来看看具体是怎么做到的:
FastText通过-input参数获取一个文件句柄用于输入数据。FastText不支持从stdin读取数据,它初始化两个向量word2int_和words_来跟踪输入信息。
word2int_是一个字符串到数值的映射集,索引键是单词字符串,根据字符串哈希值可以得到一个数值作为它的值,同时这个数值恰好就对应到了words_数组(std:::vector)的索引。
words_数组在读取输入时根据单词出现的顺序递增创建索引,每个索引对应的值是一个结构体entry,这个entry封装了单词的所有信息。条目包含以下信息:
1 | struct entry { |
https://baijiahao.baidu.com/s?id=1606667200878009384&wfr=spider&for=pc