如何解释 Hashingvectorizer 表示?

数据挖掘 nlp 文本挖掘 预处理
2022-03-14 05:15:11

我无法真正理解用于文本特征提取的 Hashingvectorizer 背后的逻辑。我可以遵循 Bag of Word 或 TFiDF 的逻辑,其中特征是每个文档的所有/某些单词/N-gram 的值,因此可以计算表示向量之间的(不)相似性。

  1. 但是,在散列的情况下,怎么能想象任意数量的特征呢?
  2. 这些特征是纯合成特征,与原词没有相关性吗?
  3. 它是否能够像其他矢量化器一样从一些训练集(通过“拟合”)中学习并将学习到的特征应用于新句子(通过“转换”)?
  4. 散列是否代表任何语义距离,例如 word2vec 的单词?如何?
1个回答

基本背景

  1. 想象一下计数向量化器的过程:您首先创建一个词汇表,它将每个单词(或 n-gram)映射到一个整数索引(文档术语矩阵中的索引)。然后,对于每个文档,您计算一个单词出现的次数,并将该值设置在适当的索引处,以构建文档的向量表示。
  2. 这可能会创建大量的特征,因为每个 n-gram/token 都是一个特征。
  3. 即使你想通过使用一些技巧来限制特征的总数,比如出现前 N 个单词,你仍然需要计算所有单词计数的映射并将其保存在内存中。这在某些应用程序中可能会令人望而却步。
  4. TfIDf 也会出现类似的问题,您还需要存储单词到文档出现的映射以计算 IDf 部分。
  5. 无论哪种方式,您都在对数据进行多次传递和/或潜在的大量内存消耗。
  6. 问题还在于界限或可预测性:您不知道第一阶段的潜在内存使用情况。
  7. 散列矢量化器可以一次通过数据为所有文档构建文档表示,并且仍然保持内存有限(不一定很小,大小取决于哈希表的大小)。
  8. 在一次通过中,您计算​​令牌的哈希值。根据哈希值,您可以增加哈希表(哈希表实现底层的数组)中特定索引的计数。您无需查看语料库中的所有其他文档即可获得当前文档的表示。
  9. 这引起了表示准确性的问题。两个不同的令牌可能有哈希冲突。

所以你实际上是在交易 [表示准确性和解释力] Vs。[空间(有界的可预测内存使用)和时间(数据没有多次传递)]

回答您的具体问题

  1. 输入词和特征之间存在(排序)相关性:通过散列函数。但是这种相关性可能存在缺陷(散列冲突)并且没有逆变换(你不能说特征编号 207 代表什么词)。
  2. 没有适合和转变。对于固定的哈希函数,不会发生特定于数据集的学习(ala word2vec)。
  3. 距离没有语义解释。两个词语义相似的词在表示中可能不会彼此靠近。只要两个几乎(语法上,基于标记)相似的文档足够接近,它就可以用于文本分类。

为什么它会起作用?

鉴于这些信息,您的怀疑是正确的:为什么这应该有效?答案是经验性的:像散列这样的随机表示在实践中工作得相当好(基于精确计数的表示的好处并不是那么大)。可能也有一些理论上的解释,但我不太了解。如果好奇,您可能可以阅读这篇论文