machine-learning - 在自然语言处理中是否有减少词汇量的好方法?
问题描述
在处理文本分类、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% (95%, 90%, 85%, ... ) 的总词频?或者有什么明智的方法可以减少词汇量,同时又不会严重影响 NLP 任务?
解决方案
一般来说,训练数据中最不常用的词也是最安全的丢弃。
对于“word2vec”和类似算法尤其如此。每个稀有词的用法可能没有足够多的变化示例来学习可靠的表示 - 与基于您确实拥有的少数非必要代表性示例的弱/特殊表示相反。
此外,稀有词不会在未来的文本中经常出现,从而降低它们在模型中的相对价值。
而且,通过自然语言材料中词频的典型“zipfian”分布,虽然每个单独的稀有词只出现几次,但这样的词总共有很多。因此,仅丢弃具有一到几个实例的单词通常会使词汇表(以及整个模型)显着缩小一半或更多。
最后,在 'word2vec' 中观察到,丢弃那些中间的稀有词——这些词的总数很多,尽管每个单独的只有质量有限的例子——幸存的更频繁的词向量的质量通常会提高。那些更重要的词有更少的干预低值“嘈杂”词将它们移出彼此的上下文窗口,或者通过交错的训练示例将模型的权重拉向其他方向。
(类似地,在足够的语料库中,使用由sample
参数控制的更积极的频繁词下采样通常可以提高词向量质量,同时还可以加快训练速度——尽管没有节省整体词汇量,因为没有词被完全消除那个设定。)
另一方面,“停用词”的数量不足以在丢弃时提供大量的词汇量节省。根据它们的存在是否有助于或损害您以后的步骤和最终结果来丢弃它们,而不是为了节省少量词汇驱动的模型空间。
请注意,对于 gensim 的Word2Vec
模型和相关算法,除了min_count
丢弃所有出现次数少于该值的单词的参数外,还有一个max_final_vocab
参数,它将动态选择min_count
足以实现不大于该max_final_vocab
值的最终词汇量大小的参数.
因此,如果您知道您有支持 100 万字模型的系统内存,则不必对min_count
值使用试错法来达到接近该值:您只需指定max_final_vocab=1000000, min_count=1
.
(另一方面,请注意max_vocab_size
参数。它应该只用于防止初始字数调查超出可用 RAM,因此应该设置为您的系统可以管理的最大值 - 远远大于任何值您希望您的实际最终词汇量大小。这是因为max_vocab_size
每当正在进行的调查达到该大小时(而不仅仅是在结束时)都会强制执行,并丢弃许多较小的字数,然后强制执行更高的下限每次强制执行。如果完全达到此限制,则意味着最终计数将仅为近似值 - 并且不断升级的地板意味着有时运行词汇将被修剪到仅占全部的 10% 左右max_vocab_size
。)
推荐阅读
- python - 如何使用 re 在变量中找到特定字符串并进行更改?
- java - 尝试添加向上按钮时,Android子操作栏与父操作栏保持不变
- apache-spark - 使用 Spark Structured Streaming 从 Kafka 主题读取:发布到 Kafka 主题的多行 JSON 是否可以被 Spark 解析?
- php - 如果选中复选框,则显示消息 hello 否则显示 hi
- python - 确定剪刀石头布的获胜者 [python]
- python - 使用 group by 绘制条形图
- node.js - 运行 junkins 作业时 no_proxy 节点配置不起作用
- amazon-cloudformation - 像云形成一样部署 serverless.yml
- python - md5sum 不匹配 python 生成的 md5
- python - 通过电子邮件发送数据帧