我正在使用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'), ...]
答案 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