字节 vs 字符 vs 单词 - n-gram 的粒度是多少?

Posted

技术标签:

【中文标题】字节 vs 字符 vs 单词 - n-gram 的粒度是多少?【英文标题】:Bytes vs Characters vs Words - which granularity for n-grams? 【发布时间】:2014-03-06 13:59:59 【问题描述】:

至少可以考虑 3 种类型的 n-gram 来表示文本文档:

字节级 n-gram 字符级 n-gram 词级 n-gram

我不清楚哪一个应该用于给定任务(聚类、分类等)。我在某处读到,当文本包含拼写错误时,字符级 n-gram 优于单词级 n-gram,因此“玛丽爱狗”仍然与“玛丽 lpves 狗”相似。

在选择“正确”表示时是否需要考虑其他标准?

【问题讨论】:

【参考方案1】:

评估。选择表示的标准是任何可行的方法

确实,字符级别(!= 字节,除非您只关心英语)可能是最常见的表示,因为它对拼写差异很稳健(如果您查看历史记录,则不必是错误;拼写变化)。因此,出于拼写纠正的目的,这很好用。

另一方面,Google Books n-gram 查看者在他们的书籍语料库中使用单词级别的 n-gram。因为他们不想分析拼写,而是随着时间的推移术语的使用;例如“儿童保育”,其中单个词不如它们的组合有趣。这被证明在机器翻译中非常有用,通常被称为“冰箱磁铁模型”。

如果您不处理国际语言,字节也可能是有意义的。

【讨论】:

【参考方案2】:

对于与文本相关的任务,我会彻底放弃字节级 n-gram,因为字节不是任何有意义的表示。

在剩下的 2 个级别中,字符级别的 n-gram 将需要更少的存储空间,并且随后将保存更少的信息。它们通常用于语言识别、作者识别(即指纹识别)、异常检测等任务。

对于单词级别的 n-gram,它们可能具有相同的用途,甚至更多,但它们需要更多的存储空间。例如,您将需要多达几 GB 的数据来在内存中表示一个有用的英语单词 3-gram 子集(用于通用任务)。然而,如果您需要处理的文本集有限,那么词级 n-gram 可能不需要那么多存储空间。

至于错误的问题,足够大的单词 n-gram 语料库也会包含并表示它们。此外,还有多种平滑方法来处理稀疏性。

n-gram 的另一个问题是它们几乎永远无法捕获所需的全部上下文,因此只能对其进行近似。

您可以在经典的Foundations of Statistical Natural Language Processing 中阅读有关 n-gram 的更多信息。

【讨论】:

【参考方案3】:

我将字符 ngrams 用于小字符串,将单词 ngrams 用于较大文本块的文本分类。问题在于哪种方法会或多或少地保留您需要的上下文......

一般来说,对于文本分类,单词 ngram 将有助于消除词义歧义,其中字符 ngram 很容易混淆,并且您的特征可能完全模棱两可。对于无监督集群,这将取决于您希望集群的通用程度,以及您希望文档收敛的基础。我发现词干提取、停用词删除和单词二元组在相当大的语料库上的无监督聚类任务中效果很好。

字符 ngram 非常适合小字符串的模糊字符串匹配。

我喜欢将一组克视为一个向量,并想象将向量与你拥有的克进行比较,然后问问自己,你所比较的内容是否保持足够的上下文来回答你试图回答的问题。

HTH

【讨论】:

以上是关于字节 vs 字符 vs 单词 - n-gram 的粒度是多少?的主要内容,如果未能解决你的问题,请参考以下文章

VS2010与VS2013中的多字节编码与Unicode编码问题

[剑指offer]面试题42:翻转单词顺序 VS左旋转字符串

关于VS2015 字符集采用Unicode时出现的问题

vs2010做的MFC程序为啥是win98风格的?怎么改回win7风格?

VS GBK编码和UTF-8编码转换

VS 代码自动更正