我使用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/