machine-learning - 在自然语言处理中是否有减少词汇量的好方法?

标签 machine-learning deep-learning nlp gensim

在进行文本分类、QA 等任务时,语料库生成的原始词汇通常太大,包含大量“不重要”的单词。我见过的减少词汇量的最流行的方法是丢弃停用词和低频词。

例如,在gensim

gensim.utils.prune_vocab(vocab, min_reduce, trim_rule=None):
    Remove all entries from the vocab dictionary with count smaller than min_reduce.
    Modifies vocab in place, returns the sum of all counts that were pruned.

但在实践中,设置最小计数是经验性的,并且似乎不太准确。我注意到词汇表中每个单词的词频通常遵循长尾分布,如果我只保留占据 X% 的前 K 个单词(95%, 90%, 85%, ... ) 的总词频?或者有什么明智的方法可以减少词汇量,而又不会严重影响 NLP 任务?

最佳答案

最近确实有一些进展试图解决这个问题。最值得注意的可能是子字单元(也称为字节对编码或 BPE),您可以将其想象为类似于单词中的音节的概念(但不相同!);然后,像 basketball 这样的词可以转换为 bas @@ket @@ballbasket @@ball 等变体。请注意,这是一个构建的示例,可能不会反射(reflect)实际选择的子词。

这个想法本身是 relatively old (1994年的一篇文章),但最近被 Sennrich et al. 所普及。 ,并且基本上用于每个必须处理大词汇量的最先进的 NLP 库。

这个想法的两个最大的实现可能是 fastBPE和谷歌的SentencePiece .

使用子词单元,您现在基本上可以自由地确定固定的词汇量大小,然后算法将尝试针对单词多样性的混合进行优化,并基本上将“更复杂的单词”分成几个部分,这样您的所需的词汇量可以覆盖语料库中的任何单词。不过,对于确切的算法,我强烈建议您查看链接的论文或实现。

关于machine-learning - 在自然语言处理中是否有减少词汇量的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60166663/

相关文章:

python - K-Arms Bandit Epsilon-贪心策略

python - Pytorch:获取最终层的正确尺寸

machine-learning - 使用数据集训练模型

java - deeplearning4j中datavec示例的gradle构建文件

classification - 构建平均图像文件时出错(Caffe)

c++ - 单词到音节转换器

java - 如何将单词归类到相应的类别?

algorithm - 谷歌如何识别没有空格的2个词?

machine-learning - 预测 RF 后的数据归一化

python - Keras 自定义指标迭代