Я делю строки на n-граммы, используя nltk, но я изо всех сил пытаюсь получить правильный вывод.
Вот пример строки:
'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-'
Идея состоит в том, чтобы свернуть n-граммы из 2, 3, 4 и 5 символов соответственно и объединить их в один список следующим образом:
[[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-граммы сбрасываются в один длинный список
Постскриптум ''.join(tup)
требуется, потому что функция ngrams выводит пары символов в кортежи, такие как [('F','+'), ('+', 'F'), ...]