自然语言处理中的二值化

Seb*_*ndt 11 nlp classification machine-learning libsvm

二值化是将实体的彩色特征转换为数字向量(通常是二进制向量)的行为,以便为分类器算法提供良好的示例.

如果我们将句子"猫吃狗"二进制化,我们可以先为每个单词分配一个ID(例如cat-1,ate-2,the-3,dog-4),然后简单地将单词替换为它的ID给出了矢量<3,1,2,3,4>.

给定这些ID,我们还可以通过给每个字四个可能的槽创建二进制向量,并将对应于特定单词的槽设置为1,给出向量<0,0,1,0,1,0,0,0 ,0,1,0,0,0,0,0,1>.据我所知,后一种方法通常被称为词袋方法.

现在,对于我的问题,一般来说,描述自然语言处理的特征,特别是基于转换的依赖解析(使用Nivres算法)时,最好的二值化方法是什么?

在这种情况下,我们不希望编码整个句子,而是编码解析的当前状态,例如堆栈中的顶部单词和输入队列中的第一个单词.由于订单具有高度相关性,因此排除了词袋方法.

有了最好的,我指的是,使数据的最可理解的分类方法,而无需使用了不必要的内存.例如,如果只有2%的双子星实际存在,我不想要一个单词bigram使用4亿个特征来获得20000个独特单词.

由于答案也取决于特定的分类器,我最感兴趣的是最大熵模型(liblinear),支持向量机(libsvm)和感知器,但是也欢迎适用于其他模型的答案.

Mik*_*ike 5

这实际上是一个非常复杂的问题。您必须做出的第一个决定是是否对您的输入标记(您的话)进行词形化。如果你这样做,你会大大减少你的类型数量,并且你的语法解析变得不那么复杂。但是,将令牌词形化需要大量工作。现在,在计算机语言中,这项任务大大减少了,因为大多数语言使用一组明确定义的符号(如空格或句点或诸如此类)将关键字或变量名分开。

第二个关键决定是您将在事后处理数据。“词袋”方法,以您提供的二进制形式,忽略词序,如果您正在对文本进行摘要或可能是 Google 风格的搜索,而您不关心在哪里,这完全没问题单词出现,只要它们出现。另一方面,如果您正在构建诸如编译器或解析器之类的东西,则顺序非常重要。您可以使用标记向量方法(如在您的第二段中),或者您可以扩展词袋方法,使得词袋向量中的每个非零条目都包含标记的线性索引位置在短语中。

最后,如果您要构建解析树,那么您想要使用标记向量方法的原因很明显,因为为 bag-of 中的每个单词维护子短语 id 是一个很大的麻烦-words 向量,但很容易在标记向量中制作“子向量”。事实上,Eric Brill 为他的词性标注器使用了一个 token-id 序列,这真的很简洁。

你介意我问你在做什么具体的任务吗?