单词文本的四格是
>>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四克等等。”
根据我从Python获得的输出,我认为这是无效的。
请解释一下。
发布于 2017-04-05 08:05:44
填充确保实际字符串的每个符号发生在ngram的所有位置。因此,对于4克,将有三个填充的最后一个符号,E X T _,X T _ _和T _ _ _等,正如您的代码所显示的。
您链接到的网站在左侧添加一个空格,然后正确地在右侧填充。这就是为什么计数是不同的。这给出了所有长度相同的纳克数。这是对应的Python代码:
generated_ngrams = ngrams(" " + 'TEXT', 4,
pad_left=False, pad_right=True, right_pad_symbol=' ')为什么要这样做,只有博客的作者才知道。但是,在右边填充而不是左边填充的一个结果是,正如博客所指出的那样,给定长度的k将为任意n克大小的n生成一个固定数目的n克(k+1)。初始空间对此没有贡献,但作为一个单词边界符号:以空格开头的ngram是字起始的。
发布于 2017-04-07 01:45:04
@alexis的答案将为您提供单字符左垫和多字符右垫。
如果我们仔细阅读博客:
我们还将在字符串的开头和结尾附加空格,以帮助匹配单词的开头和结尾的情况。 我们将使用_字符来表示这个值。对于文本这个词,我们将得到以下N-克:
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)纳克。对于单词为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支持对称填充和非对称填充,这是一种对数据集进行测试并在分类任务中查看特征效果的原则方法。
https://stackoverflow.com/questions/43223664
复制相似问题