在sklearn中,当我们将句子传递给算法时,我们可以使用文本特征提取器,例如CountVectorizer、TfidfVectorizer等……我们会得到一个浮点数数组。
但是,当我们将如下格式的输入文件传递给vowpal wabbit时,我们会得到什么?
-1 |Words The sun is blue1 |Words The sun is yellow
vowpal wabbit 的内部实现中使用了什么?这些文本是如何转换的?
回答:
这里有两个独立的问题:
问题1: 为什么在使用 vowpal wabbit
时不能(也不应该)使用像 tf-idf
这样的转换?
回答1: vowpal wabbit
不是一个批量学习系统,而是一个在线学习系统。为了计算像 tf-idf
这样的度量(每个文档中的词频与整个语料库的对比),你需要先看到所有数据(语料库),并且有时需要对数据进行多次处理。vowpal wabbit
作为一个在线/增量学习系统,设计目的是处理那些你提前没有完整数据的问题。详见这个回答了解更多细节。
问题2: vowpal wabbit
是如何“转换”它看到的特征的?
回答2: 它并不进行转换。它只是将每个词特征即时映射到内存中的哈希位置。在线学习步骤由重复的优化循环(例如SGD 或 BFGS)驱动,逐个样本地最小化建模误差。你可以选择要优化的损失函数。
然而,如果你已经有了想要训练的完整数据,没有什么能阻止你先使用其他工具对其进行转换,然后将转换后的值输入给 vowpal wabbit
。这是你的选择。根据具体数据,使用转换预处理可能会比直接使用 vowpal wabbit
进行多次处理(查看 vw --passes
选项)得到更好或更差的结果。
为了完成回答,让我们再添加一个相关问题:
问题3: 我可以使用预转换的(例如 tf-idf
)数据与 vowpal wabbit
一起使用吗?
回答3: 是的,你可以。只要使用以下(转换后)的格式。不要使用单词,而是使用整数作为特征ID,并且由于任何特征都可以有一个可选的明确权重,使用 tf-idf
浮点数作为权重,遵循典型的 SVMlight 格式中的 :
分隔符:
-1 | 1:0.534 15:0.123 3:0.27 29:0.066 ...1 | 3:0.1 102:0.004 24:0.0304 ...
之所以这样有效,是因为 vw
有一个很好的特性,可以区分字符串和整数特征。它不会对看起来像整数的特征名称进行哈希处理(除非你明确使用 --hash_all
选项)。整数特征编号直接用作特征的哈希结果。