首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NLTK中不对称填充的Ngrams

NLTK中不对称填充的Ngrams
EN

Stack Overflow用户
提问于 2017-04-05 06:41:31
回答 2查看 3.7K关注 0票数 2

单词文本的四格是

代码语言:javascript
复制
>>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获得的输出,我认为这是无效的。

请解释一下。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-05 08:05:44

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

您链接到的网站在左侧添加一个空格,然后正确地在右侧填充。这就是为什么计数是不同的。这给出了所有长度相同的纳克数。这是对应的Python代码:

代码语言:javascript
复制
generated_ngrams = ngrams(" " + 'TEXT', 4, 
                          pad_left=False, pad_right=True, right_pad_symbol=' ')

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

票数 4
EN

Stack Overflow用户

发布于 2017-04-07 01:45:04

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

如果我们仔细阅读博客:

我们还将在字符串的开头和结尾附加空格,以帮助匹配单词的开头和结尾的情况。 我们将使用_字符来表示这个值。对于文本这个词,我们将得到以下N-克:

代码语言:javascript
复制
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的情况:

代码语言:javascript
复制
>>> 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

支持对称填充和非对称填充,这是一种对数据集进行测试并在分类任务中查看特征效果的原则方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43223664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档