我使用NLTK在语料库中搜索n-gram,但在某些情况下需要很长时间。我注意到在其他软件包中计算n-grams并不是一个不常见的特性(显然Haystack有它的一些功能)。这是否意味着如果我放弃NLTK,在我的语料库中找到n-gram的方法可能更快?如果是,我可以用什么来加快速度?

最佳答案

既然你没有指出你是想要单词还是字符级的n-grams,我只是假设前者,没有失去一般性。
我还假设您从一个由字符串表示的令牌列表开始。你能轻松地做的就是自己写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执行的实际操作(将其添加到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

关于python - 快速n-gram计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7591258/

10-12 22:00