在sklearn中,当我们将句子传递给算法时,我们可以使用文本特征提取器,如countvectorizer,tf-idf vectoriser等...我们得到一个浮点数组。
但是当传递给vowpal wabbit输入文件时我们得到的是这样的:
-1 |Words The sun is blue
1 |Words The sun is yellow
vowpal wabbit的内部实现中使用了什么?这段文字如何改变?
答案 0 :(得分:5)
这里有两个不同的问题:
Q1: 在使用tf-idf
时,为什么不能(而且不应该)使用vowpal wabbit
之类的转换?
A1: vowpal wabbit
不是批量学习系统,它是一个在线学习系统。为了计算像tf-idf
这样的度量(每个文档中的术语频率与整个语料库),您需要首先看到所有数据(语料库),有时会对数据进行多次传递。 vowpal wabbit
作为在线/增量学习系统,旨在解决 不 提前获得完整数据的问题。请参阅This answer for a lot more details。
Q2: vowpal wabbit
如何“转换”它看到的功能?
A2: 它没有。它只是将每个单词功能即时映射到内存中的哈希位置。在线学习步骤由重复的优化循环(SGD或BFGS)示例驱动,以最小化建模错误。您可以选择loss function进行优化。
但是,如果您已经拥有想要训练的完整数据,那么在将变换后的值提供给vowpal wabbit
之前,没有什么可以阻止您对其进行转换(使用任何其他工具)。这是你的选择。根据特定数据,使用转换预传可能会获得更好或更差的结果,而不是使用vowpal wabbit
本身运行多次传递而无需进行初步转换(签出vw --passes
选项)。
要完成答案,我们添加另一个相关问题:
Q3: 我可以使用tf-idf
的预转换(例如vowpal wabbit
)数据吗?
A3: 是的,你可以。只需使用以下(转换后)表单即可。使用整数作为要素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
选项)。整数特征编号直接使用,就好像它们是特征的散列结果一样。