在两个流行的语言识别库中,C ++的紧凑语言检测器2和Java的语言检测器都使用了(基于字符的)n-gram提取文本特征。为什么不使用单词袋(单个单词/词典)?单词袋和n-gram的优缺点是什么?
另外,n-grams模型在文本分类中还有哪些其他用途?
哎呀 似乎这里有一个类似的问题: 关于使用bigram(N-gram)模型为文本文档构建特征向量
但是有人可以给出更全面的答案吗?在识别语言的情况下哪个更好?
(希望我能正确理解n-gram和词袋的含义,哈哈,如果不能,请帮助我。)
在两个流行的语言识别库中,C ++的紧凑语言检测器2和Java的语言检测器都使用了(基于字符的)n-gram提取文本特征。为什么不使用单词袋(单个单词/词典)?单词袋和n-gram的优缺点是什么?
另外,n-grams模型在文本分类中还有哪些其他用途?
哎呀 似乎这里有一个类似的问题: 关于使用bigram(N-gram)模型为文本文档构建特征向量
但是有人可以给出更全面的答案吗?在识别语言的情况下哪个更好?
(希望我能正确理解n-gram和词袋的含义,哈哈,如果不能,请帮助我。)
Answers:
我认为最详细的答案可以在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代替单词:
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种语言。