python - 快速 n-gram 计算

标签 python nlp nltk n-gram

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

最佳答案

由于您没有指出您想要单词还是字符级别的 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 采取的实际操作(将其添加到 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/

相关文章:

python - 套接字失去连接

nlp - 将 dbpedia 维基百科实体映射到他所在的维基百科类别

machine-learning - BERT模型语法正确性和语义连贯性评价指标

python - 使用 NLTK 查找整个语料库的三元组

python - Django 错误 - TemplateSyntaxError at/Could not parse the remainder : '[' userType' ]' from ' ['userType' ]'

python - 父控件如何定位其子控件?

python - 问 : Python Spell Checker using NLTK

python - 使用 Python 进行实时文本处理

python - 我可以使用 App Engine 支持 Google 的多重登录吗?

python - 将形容词和副词转换为名词形式