由于您没有指明是想要单词级还是字符级的n-gram,因此我将假设前者,而不会失去一般性。
我还假设您从以字符串表示的令牌列表开始。您可以轻松地做自己写n-gram提取。
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-gram采取的实际操作(将其添加到n-gram,将其
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



