在Python中实现ngrams

在Python中实现ngrams,python,Python,在Python中创建基本的ngram实现是个人的挑战。从Unigram开始,一直到Trigram: def unigrams(text): uni = [] for token in text: uni.append([token]) return uni def bigrams(text): bi = [] token_address = 0 for token in text[:len(text) - 1]:

在Python中创建基本的ngram实现是个人的挑战。从Unigram开始,一直到Trigram:

def unigrams(text):
    uni = []
    for token in text:
        uni.append([token])
    return uni

def bigrams(text):
    bi = []
    token_address = 0
    for token in text[:len(text) - 1]:
        bi.append([token, text[token_address + 1]])
        token_address += 1
    return bi

def trigrams(text):
    tri = []
    token_address = 0
    for token in text[:len(text) - 2]:
        tri.append([token, text[token_address + 1], text[token_address + 2]])
        token_address += 1
    return tri
现在有趣的部分,推广到n-gram。推广我这里使用的方法的主要问题是创建长度n的列表,该列表进入append方法。起初我认为lambdas可能是一种方法,但我不知道怎么做

另外,我正在研究的其他实现采用了完全不同的策略(毫不奇怪),例如和,所以我开始怀疑我是否已经走到了死胡同


在我放弃这种方法之前,我很好奇:1)是否有一种单行或python方法可以用这种方式创建任意大小的列表?2) 以这种方式处理问题的缺点是什么?

以下函数适用于一般n-gram模型

def ngram(text,grams):  
    model=[]
    # model will contain n-gram strings
    count=0
    for token in text[:len(text)-grams+1]:  
       model.append(text[count:count+grams])  
       count=count+1  
    return model

以下函数适用于一般n-gram模型

def ngram(text,grams):  
    model=[]
    # model will contain n-gram strings
    count=0
    for token in text[:len(text)-grams+1]:  
       model.append(text[count:count+grams])  
       count=count+1  
    return model

作为一种方便的单衬里:

def retrieve_ngrams(txt, n):
    return [txt[i:i+n] for i in range(len(txt)-(n-1))]

作为一种方便的单衬里:

def retrieve_ngrams(txt, n):
    return [txt[i:i+n] for i in range(len(txt)-(n-1))]
试试这个

  def get_ngrams(wordlist,n):
      ngrams = []
      for i in range(len(wordlist)-(n-1)):
          ngrams.append(wordlist[i:i+n])
      return ngrams
试试这个

  def get_ngrams(wordlist,n):
      ngrams = []
      for i in range(len(wordlist)-(n-1)):
          ngrams.append(wordlist[i:i+n])
      return ngrams