Поскольку вы не указали, хотите ли вы n-граммы на уровне слов или символов, я просто собираюсь предположить первый, без потери общности.
Я также предполагаю, что вы начинаете со спискатокенов, представленных строками.То, что вы можете легко сделать, это написать n-граммовое извлечение самостоятельно.
def ngrams(tokens, MIN_N, MAX_N):
n_tokens = len(tokens)
for i in xrange(n_tokens):
for j in xrange(i+MIN_N, min(n_tokens, i+MAX_N)+1):
yield tokens[i:j]
Затем замените yield
фактическим действием, которое вы хотите выполнить для каждого n-грамма (добавьте его к dict
,сохраните его в базе данных, в любом случае), чтобы избавиться от накладных расходов генератора.
Наконец, если это действительно недостаточно быстро, преобразуйте приведенное выше в Cython и скомпилируйте его.Пример использования defaultdict
вместо yield
:
def ngrams(tokens, int MIN_N, int MAX_N):
cdef Py_ssize_t i, j, n_tokens
count = defaultdict(int)
join_spaces = " ".join
n_tokens = len(tokens)
for i in xrange(n_tokens):
for j in xrange(i+MIN_N, min(n_tokens, i+MAX_N)+1):
count[join_spaces(tokens[i:j])] += 1
return count