0

在 Python 中创建一个基本的 ngram 实现是一项个人挑战。从一元组开始到三元组:

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。概括我在这里的方法的主要问题是创建进入 append 方法的长度为 n 的列表。我最初认为 lambdas 可能是一种方法,但我不知道如何。

此外,我正在研究的其他实现采取了完全不同的策略(不足为奇),例如herehere,所以我开始怀疑我是否处于死胡同。

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

4

3 回答 3

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
于 2013-01-31T03:05:05.043 回答
1

作为一个方便的单线:

def retrieve_ngrams(txt, n):
    return [txt[i:i+n] for i in range(len(txt)-(n-1))]
于 2014-01-27T17:47:10.627 回答
0

尝试这个。

  def get_ngrams(wordlist,n):
      ngrams = []
      for i in range(len(wordlist)-(n-1)):
          ngrams.append(wordlist[i:i+n])
      return ngrams
于 2020-03-16T10:38:15.307 回答