找不到有效的 ngram 文档

Having trouble finding ngram documentation that works

我正在尝试使用 python 中的 ngram 函数,但无法正确实施我正在处理的问题

我试过插入 ngram 和 ngrams

import nltk
from nltk.util import ngrams

def n_grams(words, min=2, max=3):
    s = []
    for n in range(min, max):
        for ngram in ngrams(words, n):
            s.append(' '.join(str(i) for i in ngram))
    return s

t = 'hippopotomonstrosesquippedaliophobia'
t_split = re.split(r'\W*', t)
print(n_grams(t_split))

我正在尝试 return 以下内容:

#{'tr', 'ho', 'hi', 'to', 'om', 'io', 'ob', 'mo', 'ed', 'ip', 'al', 'bi', 'pe', 
#'da', 'po', 'ns', 'qu', 'st', 'ia', 'ot', 'se', 'op', 'ro', 'ui', 'li', 'pp', 
#'es', 'sq', 'ph', 'on', 'os'} 

but instead returning this:
#[' h', 'h i', 'i p', 'p p', 'p o', 'o p', 'p o', 'o t', 't o', 'o m', #'m o', 'o n', 'n s', 's t', 't r', 'r o', 'o s', 's e', 'e s', 's q', #'q u', 'u i', 'i p', 'p p', 'p e', 'e d', 'd a', 'a l', 'l i', 'i o', #'o p', 'p h', 'h o', 'o b', 'b i', 'i a', 'a ']

真的,这里唯一的问题是多余的正则表达式和连接语法。您在匹配零到无限个非单词字符 ([^a-zA-Z0-9_]) 的模式上调用 re.split(),但您实际上没有任何匹配该模式的字符串。没有什么可以拆分的,所以正则表达式返回整个单词不变(并在 Python 3.6+ 中抛出错误)。在几个 Python 解释器中对其进行测试,看起来它也可能在字符串的开头和结尾拆分,但这可能是您正在使用的版本或 join 语句(见下文)——我无法从这个片段中分辨出来。

如果我使用您编写的 n_grams 函数,但在连接中使用 no space 调用它而不是使用连接,并完全删除你的正则表达式,我认为它得到了你想要的(双字母组):

print(set(n_grams(t)))

即:

{'es', 'op', 'bi', 'hi', 'ot', 'ro', 'ph', 'al', 
 'ns', 'sq', 'ho', 'ed', 'ob', 'ip', 'to', 'io', 
 'on', 'da', 'pe', 'om', 'mo', 'ia', 'st', 'po', 
 'tr', 'qu', 'se', 'ui', 'pp', 'li', 'os'}

如果你选择from collections import Counter,那么你还可以获得:

print(Counter(n_grams(t)))

生成计数字典,本质上:

Counter({'ip': 2, 'pp': 2, 'po': 2, 'op': 2, 'hi': 1, 'ot': 1, 'to': 1, 'om': 
  1, 'mo': 1, 'on': 1, 'ns': 1, 'st': 1, 'tr': 1, 'ro': 1, 'os': 1, 'se': 1, 
  'es': 1, 'sq': 1, 'qu': 1, 'ui': 1, 'pe': 1, 'ed': 1, 'da': 1, 'al': 1, 'li': 
  1, 'io': 1, 'ph': 1, 'ho': 1, 'ob': 1, 'bi': 1, 'ia': 1})

要处理边缘字符,你可以告诉NLTK的ngram函数使用左右填充,并指定字符(通常是"<s>""</s>"),但这似乎不是在此示例中是必需的。