18

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

4

4 回答 4

26

由于您没有指出您想要单词还是字符级 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 采取的实际操作替换 (将其添加到 a dict,将其存储在数据库中,等等)以消除生成器开销。

最后,如果真的不够快,将上面的转换成Cython并编译。defaultdict使用 a而不是的示例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
于 2011-09-29T10:23:06.253 回答
9

您可能会在这里zip找到一个使用 和 splat (*) 运算符的 Pythonic、优雅和快速的 ngram 生成函数 :

def find_ngrams(input_list, n):
  return zip(*[input_list[i:] for i in range(n)])
于 2015-05-06T18:55:34.147 回答
0

对于字符级 n-gram,您可以使用以下函数

def ngrams(text, n):
    n-=1
    return [text[i-n:i+1] for i,char in enumerate(text)][n:] 
于 2015-08-28T08:04:36.910 回答
0
def generate_ngrams(words, ngram=2):
  return [words[i:i+ngram] for i in range(len(words)-ngram+1)]



sentence = "I really like python, it's pretty awesome."
words = sentence.split()
words

['I', 'really', 'like', 'python,', "it's", 'pretty', 'awesome.']


res = generate_ngrams(words, ngram=2)
res

[['I', 'really'],
 ['really', 'like'],
 ['like', 'python,'],
 ['python,', "it's"],
 ["it's", 'pretty'],
 ['pretty', 'awesome.']]


res = generate_ngrams(words, ngram=3)
res

[['I', 'really', 'like'],
 ['really', 'like', 'python,'],
 ['like', 'python,', "it's"],
 ['python,', "it's", 'pretty'],
 ["it's", 'pretty', 'awesome.']]


res = generate_ngrams(words, ngram=4)
res

[['I', 'really', 'like', 'python,'],
 ['really', 'like', 'python,', "it's"],
 ['like', 'python,', "it's", 'pretty'],
 ['python,', "it's", 'pretty', 'awesome.']]
于 2021-07-07T15:29:48.653 回答