📜  FastText 工作和实现

📅  最后修改于: 2022-05-13 01:58:09.164000             🧑  作者: Mango

FastText 工作和实现

什么是快速文本?

FastText 是Facebook AI Research (FAIR) 的一个开源免费库,用于学习词嵌入和词分类。该模型允许创建无监督学习或监督学习算法来获得单词的向量表示。它还评估这些模型。 FastText支持 CBOW 和 Skip-gram 模型。

FastText 的用途:

  1. 它用于查找语义相似性
  2. 它还可以用于文本分类(例如:垃圾邮件过滤)。
  3. 它可以在几分钟内训练大型数据集。

FastText 的工作:

FastText 在训练词向量模型方面非常快。您可以在不到 10 分钟的时间内训练大约 10 亿个单词。通过深度神经网络构建的模型的训练和测试速度可能很慢。这些方法使用线性分类器来训练模型。



线性分类器:在本文中,标签表示为向量。我们找到向量表示,使得文本及其相关标签具有相似的向量。简单来说,文本对应的向量更接近其对应的标签。

为了找到给定关联文本的正确标签的概率分数,我们使用softmax函数:

  • 这里 travel 是标签,car 是与之相关的文本。

为了最大化正确标签的概率,我们可以使用梯度下降算法

这在计算上非常昂贵,因为对于每段文本,我们不仅必须获得与其正确标签相关联的分数,而且还需要获得训练集中所有其他标签的分数。这限制了这些模型在非常大的数据集上的使用。

FastText 通过使用分层分类器来训练模型来解决这个问题。

FastText 使用的分层分类器:

在这种方法中,它表示二叉树中的标签。二叉树中的每个节点都代表一个概率。标签由沿着给定标签的路径的概率表示。这意味着二叉树的叶节点代表标签。



FastText 使用 Huffman 算法来构建这些树,以充分利用类可能不平衡的事实。频繁出现的标签的深度小于不常见的标签。

使用二叉树可以加快搜索时间,因为不必遍历所有不同的元素,只需搜索节点即可。所以现在我们不必计算每个可能标签的分数,我们只需要计算通往一个正确标签的路径中每个节点的概率。因此,这种方法大大降低了训练模型的时间复杂度。

提高速度不会牺牲模型的准确性。

  • 当我们有未标记的数据集时,FastText 使用N-Gram 技术来训练模型。让我们更详细地了解这种技术是如何工作的——

让我们考虑数据集中的一个词,例如:“kingdom”。现在它会看一下“kingdom”这个词,并将它分解成它的 n-gram 组件,如下所示:

kingdom = ['k','in','kin','king','kingd','kingdo','kingdom',...]

这些是给定单词的一些 n-gram 组件。这个词会有更多的组成部分,但这里只列出了一些只是为了得到一个想法。可以根据您的选择选择 n-gram 组件的大小。 n-gram 的长度可以介于所选字符的最小和最大数量之间。您可以分别使用-minn-maxn标志来实现。

注意:当您的文本不是来自特定语言的单词时,使用 n-gram 将没有意义。例如:当语料库包含 id 时,它不会存储单词而是存储数字和特殊字符。在这种情况下,您可以通过将-minn-maxn参数选择为 0 来关闭 -gram 嵌入。

当模型更新时,fastText 会学习每个 n-gram 以及整个单词标记的权重。

以这种方式,每个标记/单词将被表示为其 n-gram 组件的总和和平均值。

  • 通过 fastText 生成的词向量包含有关其子词的额外信息。在上面的例子中,我们可以看到“kingdom”这个词的组成部分之一是“king”这个词。此信息有助于模型在两个词之间建立语义相似性。
  • 它还允许捕获语料库中给定单词的后缀/前缀的含义。
  • 它也允许为不同或罕见的词生成更好的词嵌入。
  • 它还可以为词汇外(OOV)词生成词嵌入。
  • 在使用 fastText 时,即使您不删除停用词,其准确性也不会受到影响。如果您喜欢,您可以对您的语料库执行简单的预处理步骤。
  • 由于 fastText 具有提供子词信息的特性,因此它也可以用于形态丰富的语言,如西班牙语、法语、德语等。

我们确实通过 fastText 获得了更好的词嵌入,但与 word2vec 或 GloVe 相比,它使用了更多的内存,因为它为每个词生成了很多子词。



FastText 的实现

首先,我们必须构建 fastText。为此,请按照以下步骤操作 –

In your terminal run the below commands-

$ wget https://github.com/facebookresearch/fastText/archive/v0.9.2.zip
$ unzip v0.9.2.zip
$ cd fastText-0.9.2
$ make

注意:如果您的 make 命令给出了类似这样的错误 – 'make' 不是内部或外部命令、可运行的程序或批处理文件。您可以通过单击链接下载 MinGW。

在此之后,您需要将其 bin 文件夹的路径添加到系统变量中,然后您可以使用它代替make 命令作为-

$ mingw32-make

我们已经成功构建了 fastText。

fastText 支持的命令是——

supervised              train a supervised classifier
 quantize                quantize a model to reduce the memory usage
 test                    evaluate a supervised classifier
 test-label              print labels with precision and recall scores
 predict                 predict most likely labels
 predict-prob            predict most likely labels with probabilities
 skipgram                train a skipgram model
 cbow                    train a cbow model
 print-word-vectors      print word vectors given a trained model
 print-sentence-vectors  print sentence vectors given a trained model
 print-ngrams            print ngrams given a trained model and word
 nn                      query for nearest neighbors
 analogies               query for analogies
 dump                    dump arguments,dictionary,input/output vectors


现在我已经获取了亚马逊评论数据集并将其保存为 amazon_reviews.txt。您还可以对数据执行一些预处理以获得更好的结果。

我们将训练一个skipgram模型。进入 fastText-0.9.2 目录后,运行以下命令-

$ fasttext skipgram -input amazon_reviews.txt -output model_trained

这里的输入文件是amazon_reviews.txt 。如果文件不在 dame 目录中,请确保提供文件的完整路径。 model_trained是为输出文件指定的名称。

您还可以根据您的要求显式添加其他参数,例如 epos 等。这里我们使用了默认值。



它首先开始读取输入文档中存在的单词。该文件由 3200 万字组成,预计到达时间约为 15 分钟。

它给出了神经网络学习率的详细统计数据,每个线程每秒处理多少单词。它还显示了随着模型的训练而不断减小的损失值。

模型训练好后,我们会生成两个文件,即model_trained.binmodel_trained.vec.bin文件包含模型的参数和字典。这是 fasttext 使用的文件。 .vec文件是一个包含词向量的文本文件。这是您将在应用程序中使用的文件。

我们现在将使用我们的词向量并对其执行一些操作-

1) 为给定的词寻找最近邻

要初始化最近邻居接口,请执行以下命令:

$ fasttext nn model_trained.bin

界面会询问您要查找最近邻的查询词。查询词“brutality”的输出是-

2) 进行单词类比



要对单词执行( A – B + C )形式的单词类比,您可以执行以下命令:

$ fasttext analogies model_trained.bin

A = king , B = man , C = women 的类比词是:


查询的第一个输出是“ queen ”,这是该查询可能的最正确答案。因此,我们训练的模型非常准确。

您还可以执行其他操作,例如使用测试数据文件测试模型、预测正确标签、获取给定单词的 n-gram 等。您可以使用 fasttext 中提供的上述命令来执行这些操作。