Skip to main content
 首页 » 编程设计

python之NLTK 中具有非对称填充的 Ngram

2025年05月04日23pengyingh

单词 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 个四元语法等等。”
根据我从 Python 获得的输出,我认为这是无效的。
请解释。

请您参考如下方法:

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

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

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

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