在Python中创建基本的ngram实现作为个人挑战。从unigrams开始,并努力达到三元组:
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可能是一种方法,但我无法弄清楚如何。
此外,我正在考虑的其他实现正在采取完全不同的方式(毫不奇怪),例如, here和here,所以我开始怀疑自己是不是走到了尽头。
在我放弃这种方法之前,我很好奇:1)是否存在以这种方式创建任意列表大小的一行或pythonic方法? 2)以这种方式解决问题的缺点是什么?
答案 0 :(得分: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
答案 1 :(得分:1)
作为一个方便的单行:
def retrieve_ngrams(txt, n):
return [txt[i:i+n] for i in range(len(txt)-(n-1))]
答案 2 :(得分:0)
尝试一下。
def get_ngrams(wordlist,n):
ngrams = []
for i in range(len(wordlist)-(n-1)):
ngrams.append(wordlist[i:i+n])
return ngrams