列表理解中有不正确的输出和double for循环

时间:2019-06-19 08:38:07

标签: python pandas nltk

我正在使用nltk将字符串拆分为n-gram,但我一直在努力获取正确的输出。

以下是字符串的示例:

'F++FF-++FF-+FF-F++FF-++FF-++FF-+FF-F+FF-F++FF-++FF-++FF-++FF-+FF-F++FF-+FF-F++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-+FF-F+FF-F++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-+FF-F+FF-F++FF-++FF-++FF-++FF-++FF-++FF-+FF-F+FF-F++FF-+FF-F++FF-+FF-F++FF-++FF-++FF-+FF-F+FF-F++FF-++FF-++FF-+FF-F+FF-F++FF-++FF-++FF-++FF-++FF-++FF-++FF-++FF-+FF-F++FF-+FF-F++FF-++FF-++FF-+FF-F+FF-F++FF-++FF-+FF-F+FF-F++FF-+FF-F++FF-++FF-+FF-F++FF-++FF-++FF-++FF-'

这个想法是分别滚动2、3、4和5个字符的n-gram,并将它们嵌套到一个列表中,如下所示: [[2-grams], [3-grams], [4-grams], [5-grams]]

因此对于上面的列表是:

[['F+', '+F', 'F-', '++', 'FF', '-+', 'FF', ...], 
['F++', 'FF-', '++F', 'F-+', 'FF-', ...], 
['F++F', 'F-++', 'FF-+', 'FF-F', ...],  
['F++FF', '-++FF', '-+FF-', ...]]

我正在使用一个数据框存储所有内容,并试图像这样完成上述操作:

allData['Rolling n-grams'] = allData['L-string'].apply(
    lambda x: [(''.join(tup)) for i in range(2, 6)
                    for tup in list(ngrams(list(x), i))]
)

但是这会将所有n-gram都转储到一个长列表中
附言''.join(tup)是必需的,因为ngrams函数将字符对输出到类似[('F','+'), ('+', 'F'), ...]

的元组中

1 个答案:

答案 0 :(得分:0)

只是为了阐明我最终如何使用yatu的答案:

ngram_list = allData['L-string'].apply(lambda x: ((''.join(tup)) for i in range(2, 6) for tup in list(ngrams(list(x), i))))

gram = []
for ngram in ngram_list:
    tmp = [[*v] for _, v in groupby(sorted(ngram, key=len), key=len)]
    gram.append(tmp)

allData['Rolling n-grams'] = gram