NTL在NLTK中具有非对称填充

时间:2017-04-05 06:41:31

标签: python nlp nltk n-gram

单词 TEXT 的四元组是

>>generated_ngrams = ngrams('TEXT', 4, pad_left=True, pad_right=True, left_pad_symbol=' ', right_pad_symbol=' ')

>>list(generated_ngrams)
[(' ', ' ', ' ', 'T'), (' ', ' ', 'T', 'E'), (' ', 'T', 'E', 'X'), ('T', 'E', 'X', 'T'), ('E', 'X', 'T', ' '), ('X', 'T', ' ', ' '), ('T', ' ', ' ', ' ')]

据我说,输出应该是_TEX, TEXT, EXT__, XT__。 根据该网站(http://cloudmark.github.io/Language-Detection/),输出为_TEX, TEXT, EXT_, XT__, T___
它还继续说"一般来说,用空格填充的长度为k的字符串将具有k + 1个双克,k + 1个三克,k + 1个四克等等。&# 34;
根据我从Python得到的输出,我不认为这是有效的 请解释一下。

2 个答案:

答案 0 :(得分:3)

填充确保实际字符串的每个符号出现在ngram的所有位置。因此,对于4-gram,最后一个符号将有三个填充的ngrams,E X T _X T _ _T _ _ _等,如您的代码所示。

您链接的网站会在左侧添加一个空间,然后在右侧正确填充。这就是计数不同的原因。这为所有长度提供了相同数量的ngrams。这是相应的Python代码:

generated_ngrams = ngrams(" " + 'TEXT', 4, 
                          pad_left=False, pad_right=True, right_pad_symbol=' ')

为什么这样做,只有博客的作者真的知道。但是,正如博客所指出的那样,填充在右侧但不是左侧的一个结果是,给定的长度为k的字符串将为任何一个产生固定数量的n-gram(k+1) n-gram大小n。初始空间对此没有贡献,但作为单词边界符号:以空格开头的ngram是字首字母。

答案 1 :(得分:2)

@alexis的答案将为您提供单字符左侧键盘和多字符右侧键盘。

如果我们仔细阅读博文:

  

我们还会将空格附加到字符串的开头和结尾,以帮助匹配单词的开头和单词结尾的情况。

     

我们将使用_字符表示这一点。给定TEXT一词,我们将获得以下N-Grams:

bi-grams _T, TE, EX, XT, T_
tri-grams _TE, TEX, EXT, XT_, T__
quad-grams _TEX, TEXT, EXT_, XT__, T___

非对称填充的动机尚不清楚。

继续写博客:

  

一般来说,用空格填充的长度为k的字符串将具有k + 1个双克,k + 1个三克,k + 1个四克等等。

从NLTK实现和对称填充,它应该是:

  

具体而言,带有空格的长度为k的对称填充字符串将产生k + (n-1) ngrams。对于单词为TEXT的情况:

>>> from functools import partial
>>> from nltk import ngrams
>>> padded_ngrams = partial(ngrams, pad_left=True, pad_right=True, left_pad_symbol='_', right_pad_symbol='_')
>>> x = 'TEXT'

>>> list(ngrams(x, 2))
[('T', 'E'), ('E', 'X'), ('X', 'T')]
>>> len(list(ngrams(x, 2)))
3

>>> list(padded_ngrams(x, 2))
[('_', 'T'), ('T', 'E'), ('E', 'X'), ('X', 'T'), ('T', '_')]
>>> len(list(padded_ngrams(x, 2)))
5
>>> len(list(padded_ngrams(x, 3)))
6
>>> len(list(padded_ngrams(x, 4)))
7
>>> len(list(padded_ngrams(x, 5)))
8

争论对称与非对称填充,这是一种使用数据集进行测试并在分类任务中查看要素效果的原则方法。