如何在 Facebook FastText 上处理一系列 n-gram?
How to work with a range of n-grams on Facebook FastText?
我正在尝试从命令行使用 FastText. It has a bunch of options along with a facility to train 训练文本分类器。其中一个选项是 wordNgrams
.
在我的特定数据集中,我发现许多不相关的查询被高可信度分类,因为它们共享相似的标记。所以,我的计划是忽略 unigram
个标记并从 bigram
开始。现在我通过设置 wordNgrams = 5
从第 1 克到第 5 克,但我的计划是从第 2 克到第 5 克。但似乎 FastText
不支持这个。有什么办法可以做到这一点,这需要最小化这些 False Positives
.
据我所知,即使 Facebook 的 fasttext
允许用户使用 -minn
和 -maxn
设置 character-n-grams(子词信息)的范围,它仅提供单个 -wordNgrams
参数设置最大长度 word-multigrams.
然而,-supervised
模式也是以 order-oblivious 方式组合所有给定标记的情况。因此,您可以在自己的预处理中创建您想要的 n-grams (或其他 token-represented 特征)的任何组合,然后将它们传递给 fasttext
(它将被视为所有 unigrams) .只要在训练中应用与后面分类中相同的预处理,效果应该是一样的。
(您甚至可以使用 sklearn
CountVectorizer
的预处理。)
不过,请记住 ~Erwan 在评论中的警告:添加如此多不同的特征会增加过度拟合的风险,这可能会显示为您陈述的问题“许多不相关的查询被高度自信地分类,因为它们共享相似的代币”。 (该模型因包含如此多的 n-grams 而变得很大,它记住了 training-data 中的特殊细节。这导致它误入歧途,将 non-generalizable 推论应用于 out-of-training 数据。 )
我正在尝试从命令行使用 FastText. It has a bunch of options along with a facility to train 训练文本分类器。其中一个选项是 wordNgrams
.
在我的特定数据集中,我发现许多不相关的查询被高可信度分类,因为它们共享相似的标记。所以,我的计划是忽略 unigram
个标记并从 bigram
开始。现在我通过设置 wordNgrams = 5
从第 1 克到第 5 克,但我的计划是从第 2 克到第 5 克。但似乎 FastText
不支持这个。有什么办法可以做到这一点,这需要最小化这些 False Positives
.
据我所知,即使 Facebook 的 fasttext
允许用户使用 -minn
和 -maxn
设置 character-n-grams(子词信息)的范围,它仅提供单个 -wordNgrams
参数设置最大长度 word-multigrams.
然而,-supervised
模式也是以 order-oblivious 方式组合所有给定标记的情况。因此,您可以在自己的预处理中创建您想要的 n-grams (或其他 token-represented 特征)的任何组合,然后将它们传递给 fasttext
(它将被视为所有 unigrams) .只要在训练中应用与后面分类中相同的预处理,效果应该是一样的。
(您甚至可以使用 sklearn
CountVectorizer
的预处理。)
不过,请记住 ~Erwan 在评论中的警告:添加如此多不同的特征会增加过度拟合的风险,这可能会显示为您陈述的问题“许多不相关的查询被高度自信地分类,因为它们共享相似的代币”。 (该模型因包含如此多的 n-grams 而变得很大,它记住了 training-data 中的特殊细节。这导致它误入歧途,将 non-generalizable 推论应用于 out-of-training 数据。 )