为什么在文字语言识别中使用n-gram代替单词?


12

在两个流行的语言识别库中,C ++的紧凑语言检测器2和Java的语言检测器都使用了(基于字符的)n-gram提取文本特征。为什么不使用单词袋(单个单词/词典)?单词袋和n-gram的优缺点是什么?

另外,n-grams模型在文本分类中还有哪些其他用途?

哎呀 似乎这里有一个类似的问题: 关于使用bigram(N-gram)模型为文本文档构建特征向量

但是有人可以给出更全面的答案吗?在识别语言的情况下哪个更好?

(希望我能正确理解n-gram和词袋的含义,哈哈,如果不能,请帮助我。)

Answers:


20

我认为最详细的答案可以在Mehryar Mohri关于该主题的广泛工作中找到。这是他关于该主题的演讲幻灯片之一的链接:http : //www.cims.nyu.edu/~mohri/amls/lecture_3.pdf

语言检测的问题是人类语言(单词)具有结构。例如,在英语中,字母“ u”后跟字母“ q”是很常见的,而音译阿拉伯语则不是这种情况。n-gram通过捕获此结构来工作。因此,某些语言的字母组合比其他语言更有可能。这是n-gram分类的基础。

另一方面,词袋依赖于搜索大型词典并实质上进行模板匹配。这里有两个主要缺点:1)每种语言都必须在文档中包含大量的单词词典,这将花费相对较长的时间进行搜索,并且2)如果单词中的所有单词都没有,单词袋将失败。训练集包含在测试集中。

假设您使用的是双字母组合(n = 2),并且字母表中有26个字母,那么该字母只有26 ^ 2 = 676个可能的双字母组合,其中许多将永远不会发生。因此,每种语言的“配置文件”(使用语言检测器的单词)需要一个非常小的数据库。另一方面,一袋词的分类器将需要完整的EACH语言词典,以确保可以根据给出的任何句子来检测该语言。

简而言之-可以使用相对较小的特征空间快速生成每种语言配置文件。有趣的是,n-gram只起作用,因为字母不是用某种语言绘制的,而是明确的杠杆作用。

注意:单词的n-gram数的一般公式为l ^ n,其中l是字母表中字母的数目。


我想对于某些接近的语言,除了使用n-gram之外,还使用单词列表会有所帮助。有时,我看到挪威文中的丹麦文被冠以拉丁文。我怀疑n-gram是区分这两种语言的好方法。
kjetil b halvorsen

感谢您的详细回答。但是我对此有一些疑问,首先您能解释一下“如果测试集中没有一个单词包含在测试集中,那么单词袋会失败”吗?其次,为什么在使用字典方法时CLD2使用4克重字符,导致英语中有456976个条目,而使用字典方法时却只能带来概要文件大小的一半(oxforddictionaries.com/words/…)?
dennis97519

1
@ dennis97519回复:“ word-of-words ...”假设您的字典仅包含英语的{“ dog”,“ cat”,“ turtle”,“ animal”}以及英语的{“ perro”,“ gato” ,“ tortuga”,“ animal”}(西班牙语)。您的字典将无法对以下句子进行分类:“驴是动物”,因为两个字典中都出现了“动物”一词,但其他词均不存在。这是一个极端的例子。关于4克语法:1)请记住,每种语言都需要一个词典,2)n克语法比较稀疏(更快的搜索),以及3)正如Dougal所说的,它们只能用几个字节表示。
justanotherbrain 2015年

1
@loretoparisi-有两个权衡:第一个是在模型复杂度(大N =更复杂)和泛化误差(您在某些测试集上做得如何)之间-您不想过度拟合。第二个折衷是计算复杂度。内存复杂度随着N呈指数增长。训练通常与文本中的单词数量成线性关系,因此,文本很长通常不是问题。也就是说,大文本通常在字典D中意味着更多的单词。因此,内存复杂度为O(D ^ N)。实际上,通常最好在计算上使用尽可能大的N。
justanotherbrain

1
@loretoparisi-如前所述,此后,N元语法趋于稀疏,但这并不总是正确的。如果您的特定文本稀疏,则使用不同的N进行交叉验证是找到最佳N的最佳方法(再次受计算约束)。
justanotherbrain

3

由于以下几个原因,使用字母N-gram代替单词:

1)给定语言所需的单词列表相当大,如果您将快速,更快,最快,斋戒,斋戒,斋戒...视为所有不同的单词,则可能为100,000。对于80种语言,您需要大约80倍的单词,占用大量空间-50兆字节以上。

2)26个字母的字母三字母组合的数量为26 ** 3或大约17,000,而对于四字母组合(N = 4),字母四字母组合的数量为450,000,覆盖使用该字母的所有语言。类似的数字,但N-gram的数字较大(30-100个字符)。对于Han脚本中具有4000多个字母的CJK语言,字母组合(N = 1)就足够了。对于某些Unicode脚本,每个脚本只有一种语言(希腊语,亚美尼亚语),因此不需要字母组合(所谓的n-gram N = 0)

3)使用单词时,如果没有字典中的单词,则根本没有信息,而使用字母N-gram时,该单词中通常至少有一些有用的字母组合。

CLD2对包括拉丁文,西里尔文和阿拉伯文在内的大多数Unicode脚本(字母)使用四字组,对CJK脚本使用四字组,对于其他脚本则使用零字组,并且还包括有限数量的非常独特且相当普遍的完整单词以及用于区分的单词对在统计上类似的语言的困难群体中,例如印度尼西亚语和马来语。字母二字组和三字组可能对区分少数几种语言(大约八种,请参阅https://docs.google.com/document/d/1NtErs467Ub4yklEfK0C9AYef06G_1_9NHL5dPuKIH7k/edit),但对区分数十种语言没有用。因此,CLD2使用四字组,将每个字母组合与使用该组合的前三种最可能的语言相关联。这样可以用约1.5 MB的表格覆盖80种语言,用约5MB的表格更详细地覆盖160种语言。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.